Jump to content
PLC Forum


Sign in to follow this  
Spillo87

Mikrobasic E While True... Per Più Funzioni

Recommended Posts

Spillo87

Buongiorno a tutti...

Preciso che sto programmando con mikrobasic, perchè per il momento so usare solo questo :D

Sto sviluppando un programmino per gestire un fabbricatore di ghiaccio, unico problema che ho trovato nella programmazione è questo:

Ho tre pulsanti (reset, scarico manuale, selezione dimensione cubetto di ghiaccio)

La funzione che deve svolgere essenzialmente il pic è il carico d'acqua e il tempo di refrigerazione, ed infine l'attivazione dell'elettrovalvola per l'inversione del gas.... Tutto questo in un ciclo che va avanti all'infinito... Fin qui tutto ok... Gia provato e funzionante...ora arriva il problema: il pulsante 3 (select dimen cubetto ghiaccio): questo si ha variando il carico dell'acqua e il tempo di refrigerazione. Ok...

Qyalcuno sa dirmi come posso fare per implementare quel pulsante per selezionare i vari while true/while wend??? Oppure è sbagliato usarlo?

Appena posso inserisco un esempio del listato. Ora non sono a casa....

Grazie a tutti...

Share this post


Link to post
Share on other sites

Livio Orsini

Scusa ma si capisce poco o nulla di quello che ti serve.

Prova a spiegare meglio cosa vuoi che succeda quando premi il pulsante che seleziona la dimensione del cubetto.

Share this post


Link to post
Share on other sites
drugo66

Ciao,

ha ragione Livio: ti devi spiegare un po' meglio; in ogni caso, non utizzo basic, ma C, credo però cambi poco: normalmente io strutturo i programmi in questo modo:

- All'avvio imposto le variabili interne del micro, ingressi e uscite, timer e quant'altro.

- Entro nel loop eseguito sempre

- Suddivido l'esecuzione in passi ed inserisco una istruzione switch case (credo che in basic esista qualcosa di simile, al limite puoi sempre utilizzare un if then else) che analizza in quale passo mi trovo e di conseguenza eseguo quello che mi serve

- Le prime istruzioni all'interno del loop (prima dello switch case) sono quelle che verrano eseguite sempre, a prescindere dal passo eseguito, quindi qui inserisco i controlli/esecuzione da eseguire sempre (il tuo pulsante potrebbe trovarsi qui ?)

- I timer sono gestiti ad interrupt; normalmente utilizzo un solo timer hardware molto veloce; poi, incrementando N variabili, mi creo N timer software che, ovviamente hanno un tempo superiore a quello hardware; creo funzioni per avviare, arrestare ed azzerare questi timer che chiamerò nel loop principale a seconda delle mie esigenze

- Per gli ingressi, utilizzo uno dei timer software per ovviare ai disturbi (ai miei tempi si chiamava debouce timer); controllo lo stato degli ingressi e, trascorso un tempo X, se hanno effettivamente cambiato stato, cambio lo stato di una variabile; nel ciclo principale userò questo e non il rilevamento diretto dell'ingresso

Se serve posso anche postare un esempio, ma in C e non in basic

Spero di essere stato utile ...

Edited by drugo66

Share this post


Link to post
Share on other sites
Spillo87

grazie per le risposte...

lo so, non sono riuscito ad essere molto chiaro :toobad:

x Drugo66:

il pulsante sarà prima del loop...

questo mi dovrà servire per selezionare una delle 3 "condizioni" di tempi (o dimensioni dei cubetti)

Ho caricato un video su youtube (http://www.youtube.com/watch?v=x8xAq11pAfw) di un circuito che avevo nel cassetto: effetto luci kit con pic16f84:

premendo uno switch il pic smette di far "scorrere" i led (secondo.5) e visualizza tramite i led la "configurazione" selezionata cioè in questo caso la velocità di "scorrimento" dei led;

il principio sarebbe lo stesso... però a me manca sapere come "implementare" questa funzione...

non so se riesco a farmi capire :blink::wacko:

aggiungo: non sono un esperto nel campo della programmazione, ma un autodidatta... con questo però ho già realizzato molti altri progetti...

Edited by Spillo87

Share this post


Link to post
Share on other sites
Livio Orsini

Io uso "C", ma la sostanza non cambia poi molto.

Ti consiglierei di usare una selezione di casi.

Ad ogni presione del pulsante incrementi un contatore ciclico: 1, 2, 3, 1,.....

Poi selezioni la funzione secondo il caso, ovvero il numero del contatore.

In "C" si userebbe l'istruzione case switch, in basic non so... Però al più, essendo solo 3 condizioni, puoi sempre usare "if", "elseif" ed "else"

Share this post


Link to post
Share on other sites
Spillo87

grazie Livio!

se questa sera avrò tempo proverò a buttare giù una bozza del programma...... poi la posterò, se ho qualche problema, magari qualcuno mi può aiutare...

grazie ancora...

Share this post


Link to post
Share on other sites
drugo66

Spillo87: il pulsante sarà prima del loop...

Se fai così, la pressione del pulsante non cambierà nulla e non verrà mai rilevata, perchè l'esecuzione del micro è veloce, molto più veloce di te e quella parte viene eseguita solo all'accensione (reset del micro); se con la pressione del pulsante devi selezionare una modifica di tempi, fai come ti ha suggerito Livio, ma in cima al tuo loop, in modo che poi il ciclo potrà usufruire dei tempi che hai selezionato; la prima pressione, oltre a modificare il valore, ti permette anche di sapere che stai effettuando la correzione dei tempi, quindi si potrebbe addirittura interrompere il ciclo normale, per poi riprenderlo dopo che il pulsante non viene più premuto per X tempo, questo sempre a seconda delle tue necessità.

Ricordati solo di rilevare un fronte di salita (il pulsante è OFF, viene premuto e va ON, memorizzi la condizione ed autorizzi un solo incremento fino a che il pulsante non è nuovamente OFF), altrimenti con una sola pressione ti incrementa ben più di una unità.

Share this post


Link to post
Share on other sites
Spillo87

buonasera...

sono passati un po' di giorni, ma con le feste e il corso non ho avuto tempo di metterci le mani...

intanto, oggi, ho tirato giù un programmino di prova... l'ho testato su un pic12F675... giusto per provare a vedere se la procedura funzionava...

questo è il codice:

program provasub 'Marco Ago***spillo87

 'PIC12F675
 'GP0=led 1
 'GP1=led 2
 'GP2=led 3
 'GP3=sw1 cambio prog
 'GP4=sw2 start/stop
 'GP5=led 4 attiv prog
 
 dim k as byte
 dim tempo as byte

sub procedure interrupt
    if testbit(INTCON,GPIF) then
       if testbit(GPIO,3) then     'se premo sw1 "gp3" allora
        delay_ms(150)              'attesa antirimbalzo
        if GPIO.5=1 then           'se led prog "GP5" è on allora
         if (tempo>0) then         'se var "tempo" maggiore di 0 allora
          inc(tempo)               'incrementa tempo
         end if
         if (tempo>3) then         'se var "tempo" maggiore di 3 allora
          tempo=1                  'var "tempo" va a 1
         end if
        end if
       end if
       clearbit(INTCON,GPIF)      'azzero bit GPIF
    end if
end sub

sub procedure pausa1s
    delay_ms(1000)             'sub procedura per temporiz 1sec
end sub

sub procedure tempog           'sub procedura per impostazione 3 programmi
    if tempo = 1 then          'se variab "tempo" è uguale a 1 allora
     GPIO=33                   'attiva Led 1 e 4
     for k= 1 to 5             'per 5 sec
      pausa1s
     next k
    end if
    if tempo = 2 then          'se variab "tempo" è uguale a 1 allora
     GPIO=34                   'attiva Led 2 e 4
     for k= 1 to 5             'per 5 sec
      pausa1s
     next k
    end if
    if tempo = 3 then          'se variab "tempo" è uguale a 1 allora
     GPIO=36                   'attiva Led 3 e 4
     for k= 1 to 5             'per 5 sec
      pausa1s
     next k
    end if
end sub
    
main:
 CMCON=%011000          'comparatori off
 ANSEL=%000000          'tutti I/0 digitali
 TRISIO=%011000         'GP3 e GP4 input
 IOC=%001000            'scelta ingressi IOC che genereranno
                        'interrupt nel registro IOC
 setbit(INTCON,GPIE)    'attivo interrupt su porte GPIO
 setbit(INTCON,GIE)     'abilita tutti gli interrupt
 tempo=1
 k=0

inizio:
 GPIO=0                 'tutto spento
 pausa1s                'sub
 GPIO=39                'tutti i led on <prova uscite>
 pausa1s                'sub
 GPIO=0                 'tutto spento
 pausa1s                'sub
  do
   GPIO=7               'lampeggio dei 3 led velocità
   delay_ms(500)
   GPIO=7
   delay_ms(100)
   GPIO=0
   delay_ms(250)
  loop until GPIO.4=1   'loop fino a che non si preme sw2 su GP4
 
prog1:
 while true             'ciclo infinito
   delay_ms(500)        'attesa antirimbalzo sw2 "GP4"
   do                   'inizio ciclo loopo until
    GPIO.5=1            'accende led prog "GP5"
    pausa1s             'attesa 2 sec
    pausa1s
    tempog              'vai a routine "tempog"
    pausa1s             'pausa 1 sec
   loop until GPIO.4=1  'esegui loop fino a che non si preme sw2 "GP4"
  delay_ms(250)
  GPIO=0
  goto inizio           'vai a indice "inizio"
 wend
  
end.

il programma funziona abbastanza bene, tramite l'interrupt faccio incrementare il valore della variabile tempo, che "processo" tramite la sub procedura "tempog" (poi il tutto è "spiegato" per modo di dire, sul listato)

solo non mi piace aspettare la fine del programma per poter stoppare e tornare a "inizio"... sapete consigliarmi un modo per poterlo fare? ho provato anche con l'interrupt, ma non so come fare, non posso usare la funzione "goto"... so come fare tramite l'implementazione nel programma dei if then però cercavo qualcosa di più "leggero ed elegante"

un'altra cosa... come posso far incrementare e decrementare un valore di una variabile con lo stesso pulsante???

Aggiungo che questo non è il programma per il mio progetto, ma solo un modo per provare gli interrupt e le varie cose che mi serviranno.

grazie mille a tutti (non so quanto sono stato chiaro) :whistling::D

Edited by Spillo87

Share this post


Link to post
Share on other sites
Livio Orsini

Usare il medesimo pulsante per contare avanti o indietro è possibile se, e solo se, nel programma ci sono le condizioni di scelta.

Ad esempio se il pulsante è mantenuto premuto per un tempo maggiori di "x" allora inverto il senso di conteggio dei prossimi fronti generati dalla pressione del pulsante stesso.

non mi piace aspettare la fine del programma per poter stoppare e tornare a "inizio"... sapete consigliarmi un modo per poterlo fare?

Vale il discorso precedente: ci devono essere delle condizioni di scelta. Se siverifica una certa condizione esco dalla routine e vado ad un certo punto del programma. Si chiamano salti condizionati.

Share this post


Link to post
Share on other sites
Spillo87

ah... ho capito, questi non li conosco proprio...

come faccio ad inserirli, o comunque come funzionano all'interno del programma? tramite interrupt?

non so se chiedo troppo, ma mi puoi scrivere un esempio???

grazie mille

Share this post


Link to post
Share on other sites
Livio Orsini
ma mi puoi scrivere un esempio???

No perchè il basic mi rifiuto di usarlo per principio.

Spiega meglio cosa vorresti fare.

Share this post


Link to post
Share on other sites
Spillo87

bè, su questo progetto mi servirebbe semplicemente un pulsante che avvii il programma, e che durante il programma me lo stoppi... oppure che con lo stesso tasto posso incrementare o decrementare un valore... volevo capire come funzionava il "salto condizionale"...

ora farò una ricerca in internet... sperando di trovare qualcosa... :huh:

Share this post


Link to post
Share on other sites
Livio Orsini

Se colleghi il pusante ad un ingresso di interrupt, ovviamente puoi fare quello che hai ipotizzato, però non è una bella soluzione, a meno di dover rispondere entro tempi brevissimo come fosse, ad esempio, un fine corsa di alalrme.

Il vero problema + che tua fai gli antirimbalzo con i ritardi bloccanti (delay).

Questa funzione fa ciclare il processore in un loop per il tempo impostato ed il rpcessore non vede niete altro.

Poi 500 ms di antirimbalzo sono esagerati, solitamente si usano 10 ms, 20 al più.

L'antirimbalzo serio lo si fa leggendo fli ingressi da contatto a tempi fissi usanto un interrupt di un timer. In questo modo il processore continua ad elaborare e si interrompe solo lo stretto necesario per leggere le porte e poco più.

Nell routine di servizio dell'interrupt del timer si trasferisce lo stato della lettura prcedente in una memeoria e lo stato della porta nella memoria di lettura.

Quando devi usare un ingresso per decidere cosa fare verifichi che le 2 memorie siano eguali, se lo sono vedi se lo stato è vero o falso ed agisci in conseguenza.

In qualsiasi punto del tuo loop di while puoi eseguire questo test e se la condizione è vera esci dal loop e torni al main.

Per contare avanti o indietro con il emdesimo pusante te l'ho spiegato prima come fare.

PS se vuoi ti posso mostrare la funzione che solitamente uso per leggere gli ingressi, è scritta in "C". però

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
Spillo87

si, capisco che usare il delay per l'antirimbalzo è "grezzo", e più che altro sbagliato e ritardante dal punto di vista del programma... ma lo sto imparando passo passo in autoapprendimento questo "linguaggio", e senza guide adatte non è facilissimo... comunque, il 500ms è un errore, in verità doveva essere 150ms come gli altri, comunque troppo :D ...

Per contare avanti o indietro con il emdesimo pusante te l'ho spiegato prima come fare.

Si, me lo hai spiegato, ma la mia domanda era: come dovrei fare, ma capisco che usando il c, magari non riesci ad aiutarmi... magari puoi farmi un esempio in c???

Se siverifica una certa condizione esco dalla routine e vado ad un certo punto del programma. Si chiamano salti condizionati.

Questo si che mi servirebbe! ma non capisco come farlo... perchè se con il pulsante entro in un interrupt, alla fine di questo torna sempre (?) alla "funzione" che stava facendo prima. giusto?

quindi non posso includere all'interno dell'interrupt il goto o altro per indicezzare il percorso... almeno quello che ho letto in giro su moltissimi forum inglesi, e anche per logica di quanto scrivono su alcune guide, cioè, dopo che il pic ha processato l'interrupt, torna a fare quallo che stava facendo prima......... :senzasperanza:

Se uso la funzione do --- loop until "pulsante premuto -> goto main (esempio scarno), devo per forza aspettare la fine del loop e prendere l'istante preciso della fine (o tenere il pulsante pigiato fino alla fine) per avere effetto..... :wallbash:

altro al momento non mi viene in mente...

PS se vuoi ti posso mostrare la funzione che solitamente uso per leggere gli ingressi, è scritta in "C". però

mi farebbe piacere e comodo, magari ci capisco qualcosa di più...

sto studiando al contempo cnc per un corso, e comincio a dare i numeri questi giorni, quindi scusatemi tutti per i miei dilemmi, in particolare Livio, che ringrazio tanto per l'interessamento e la pazienza...

grazie ancora...

O.T.--P.S. mi sapreste consigliare qualche guida (fatta come Dio comanda, come si dice dalle mie parti) per "imparare" il C per programmare i PIC... fine -- O.T. B)

Share this post


Link to post
Share on other sites
Livio Orsini

Per il "C" c'è il vangelo, la bibbia, la sentenza della corte di cassazione a sezioni rirunite :smile:

Si chiama "Linguaggio C" autori Brian W: Kernighan e Dennis M. Ritchie detto semplicemente "il Ritchie-Kernighan".

Per le altre risposte domani se ho tempo.

Share this post


Link to post
Share on other sites
drugo66

Ti allego un pezzo di codice in C: gli ho tolto un po' di righe, altrimenti sarebbe stato troppo lungo; guardati la parte di timer interrupt, dove imposto/azzero un bit di una variabile quando l'ingresso cambia stato, dopo il tempo di debounce impostato; nel ciclo principale, invece di utilizzare la lettura dell'ingresso, controllo il singolo bit di quella variabile.

C'è anche un timer software (qui è uno solo, ma, se serve, se ne possono fare anche di più): nel ciclo poi, quando serve, si puo' controllare il bit della variabile oppure chiamare le funzioni per azzerarlo, farlo ripartire, etc.

Il compilatore è WinAVR ed il processore un Atmel AVR.

//================================= DEFINITION ================================

#define BIT0            0x01						// Bit 0 definition
#define BIT1            0x02						// Bit 1 definition
#define BIT2            0x04						// Bit 2 definition
#define BIT3            0x08						// Bit 3 definition
#define BIT4            0x10						// Bit 4 definition
#define BIT5            0x20   						// Bit 5 definition
#define BIT6            0x40						// Bit 6 definition
#define BIT7         	0x80						// Bit 7 definition
#define PERIOD_TCMP  	20						// TCMP Period in mS
#define PERIOD_LMPKO	750						// Lamp Led Period in mS
#define DEBOUNCE_INP	100						// Inp debounce in mS/2

//================================== VARIABLES ================================

volatile uint16_t timCount   	= 0;					// Cycle timer count
volatile uint8_t inpMask 	= 0;					// B0 = 
volatile uint8_t memMask	= 0;					// B7 = Anom
uint8_t cntTcmp       		= 0;					// Cnt TCMP x 1mS
uint16_t cntInp  		= 0;					// Cnt Inp x 1 mS
uint8_t stepCycle 		= 0;					// Step cycle

//================================= DECLARATION ===============================

void PeripheralsInit(void);						 // Peripherals init
uint8_t TimerIsOverflow(void);						// Timer is overflow
void TimerRestart(uint16_t tim16Timeout);				// Cycle timer restart
void TimerReset (void); 						// Cycle timer reset

//================================== FUNCTIONS ================================

int main (void)
{
    PeripheralsInit();							// Init Peripherals

    while (1)								// Main Cycle
    {	
	
	// QUI VERIFICHE VARIE - IL CONTROLLO DEL TUO PULSANTE ?
	
		switch (stepCycle)
		{	
		 case 0:	
							
		break;
				
		 }	
    }
	
    return (0);
}

void PeripheralsInit(void)
{
	// Port and Timer Setting
	
	/*
		PA0			Inp 
		PA1			Inp 
		
		PB0			Out 
 		PB1			Out 
 		PB2			Out 
		PB3			Out 
		PB4			Out 
		PB5 MOSI	NU 
		PB6 MISO	NU 
		PB7 SCK		NU 

		PD0			Inp
 		PD1			Inp
		PD2			Inp
 		PD3			Inp
		PD4			Inp
		PD5			Out TCMP
		PD6			Out
		
		FUSES PROGRAMMING :

			BrownOut Detection disabled (BODLEVEL= 111)
		  	Divide Clock by 8 Internally (CKDIV8= 0)
			Internal Osc. 4 MHz - StartUpTime: 14CK + 4.1 mS (CKSEL= 0010 SUT= 01)		
	*/
	
	PORTA = 0x00;								// Set Port A
	DDRA  = 0x00;								// Port A Direction - 0000 0000
 	PORTB = 0x00;								// Set Port B
	DDRB  = 0X1F;								// Port B Direction - 0001 1111
	PORTD = 0x00;								// Set Port D
 	DDRD  = 0x60;								// Port D Direction - 0110 0000	
 	TCCR0B = 0X01;								// Set Timer 0 - 1 mS ~ FS
 	TIMSK = _BV (TOIE0);							// Enable Timer 0
 	sei();									// Enable interrupts
}

// Timer 0 Interrupt
ISR (TIMER0_OVF_vect) 
{
	if ((++cntTcmp) >= PERIOD_TCMP)						// Timer Cnt is elapsed
	{
		cntTcmp = 0;							// Reset Counter
		
 		if (bit_is_set(PIND, PD5))					// TCMP is ON
		        PORTD &= ~(_BV(PD5));					// TCMP OFF
		else								// TCMP is OFF
			PORTD |= _BV(PD5);					// TCMP ON
 	}	

	if (bit_is_clear(PIND, PD1))						// Inp
 	{
		if ((++cntInp) >= DEBOUNCE_INP)					// Time Cnt is elapsed
		{
			cntInp = DEBOUNCE_INP;					// Set Counter
			inpMask |= BIT3;					// Mask Inp Sensor ON
 		}
		else								// Time Cnt is Not elapsed
		{	
			 inpMask &= ~BIT3;					// Mask Inp OFF
		}
	 }
	else									// Inp OFF
	{
 		cntInp = 0;							// Reset Counter
		inpMask &= ~BIT3;						// Mask OFF
	}
		
 	if (memMask & BIT7)							// Anomaly ON
	{	
 		if ((++cntLmpKo) >= PERIOD_LMPKO)				// Time Cnt is elapsed
		 {
 			cntLmpKo = 0;						// Reset Counter

			 if (bit_is_set(PIND, PD6))				// Out Led is ON
 				PORTD &= ~BIT6;					// Out Led OFF
			 else							// Out Led is OFF
 				PORTD |= BIT6;					// Out Led ON
		 }
 	}

	if (timCount > 0)							// Cycle timer counter
	{
		if ((--timCount) == 0)						// If Time Cnt is elapsed
			memMask |= BIT0;					// Timer Overflow ON
	}
}

// Cycle timer overflow
uint8_t TimerIsOverflow(void)
{
	return (memMask & BIT0);
}

// Cycle timer restart
void TimerRestart(uint16_t tim16Timeout)
{
	memMask &= ~BIT0;
	timCount = tim16Timeout;
}

// Cycle timer reset
void TimerReset(void)
{
	timCount = 0;
	memMask &= ~BIT0;
}


Edited by drugo66

Share this post


Link to post
Share on other sites
Livio Orsini

Drugo che compilatore "C" stai usando?

Share this post


Link to post
Share on other sites
drugo66

WinAVR; è basato su GCC, ovviamente gratuito, e ci sono poche librerie, ma a me sono sempre bastate; tra l'altro non so nemmeno se sono ancora attivi ...

Share this post


Link to post
Share on other sites
accacca

Spillo quello che ti manca è il concetto di stato Devi definire una variabile di stato che cambia nelle varie fasi di esecuzione dle programma tipo

se accensione allora.....

se selezione cubetto allora....

se erogazione allora...

se terminato allora...

Per interrompere la sequenza ti basta assegnare lo stato di uscita quando necessario

Detta così è come dire niente ma è difficile spiegare in due righe sul forum queste cose

Altra cosa che ti hanno già fatto notare: tassativamente vietato fermare l'esecuzione in un loop. Il proogramma deve correre di continuo

scrivi ogni istruzione come se tu avessi in mano qualcosa che scotta prima la passi a un altro meglio è....

Il debounce dei tasti lo puoi fare in Nmila modi uno te lo ha chiaramente indicato Drugo Io preferisco fare come dice Livio leggo periodicamente gli ingressi e li confronto con una o due letture precedenti Ti basta fare delle operazioni logiche per avere tutti gli stati dei tasti

tasti (n-1) xor tasti(n) ottieni tutti tasti che hanno cambiato stato tra le ultime due letture

(tasti (n-1) xor tasti(n)) and tasti(n) ottieni tutti i fronti di salita quindi i tasti premuti dall'ultima lettura

(tasti (n-1) xor tasti(n)) and tasti(n-1) ottieni tutti i fronti di discesa quindi i tasti rilasciati dall'ultima lettura

tasti (n-1) and tasti(n)) ottieni tutti i tasti che sono mantenuti premuti

Usa i timer in questo modo: Nel programma inizializzi e controlli il valore del timer nell'interrupt lo decrementi.

Per le tue applicazioni è buona cosa usare timer+ variabile di stato Allo start la sequenza attiva un timer Se qualcosa va storto durante la sequenza il timeout del timer riporta tutto allo stato iniziale.

cose del tipo

stato = attesa

while true

if (timer_max = 0) then

stato = fine_sequenza

if (stato = attesa) then

if tasto premuto then

stato = start

timer_max = duratamax_sequenza

.....

..

if (stato = fine_sequenza)

spegni tutto

stop al timer_max (se arrivi qui non c'è stato bisogno di lui)

stato = attesa

e via discorrendo..

Share this post


Link to post
Share on other sites
Livio Orsini
Spillo quello che ti manca è il concetto di stato.....

Insomma è un autodidatta che sta cercando di imparare.

Purtroppo sta usando uno strumento sbagliato come il Basic.

Per imparare a programmare "bene" bisogna usare linguaggi strutturati e molto rigidi.

Non per niente il Pascal fu concepito da Wirth come linguaggio di studio.

#int_timer1
void Timer10ms()
    {

/*
** Generazione uscita con t = 10 ms
*/
       bit_set(port_a,3); //alza un'uscita per misurare il tempo
       set_timer1(0x3caf);   // Caricato 15535 ==>
             // 50.000 * 4 * 50nsec = 10msec
             // 65535 - 50000 = 15535(0x3caf)
        iold_stato_a = istato_a;  //memo stato comandi precedente
        istato_a = port_a & 0xF0; //leggo stato comandi attuale
        gen_rampa();  //chiemo la funzione generatrice di rampa
        bit_clear(port_a,3); //abbasso l'uscita per la misura del tempo
        enable_interrupts(int_timer1);
    }

Spillo questa è la routine di servizio dell'interrupt del timer1 che uso solitamente allo scopo di avere un clock di sitema a 10 ms.

Uso il pin A3 per misurare il tempo impiegato dalla routine stessa e uso A4, A5 come ingressi di comando.

Il "C" che uso è quello compilato con CCS.

Share this post


Link to post
Share on other sites
Spillo87

buongiorno a tutti... scusa te i tempi per le risposte, ma sono giorni di fuoco...

comunque ora ho più chiari molti concetti, soprattutto sull'uso delle variabili, e soprattutto mi è più chiaro l'interrupt timer... ora ho riscritto una parte di quel codice, ed è più fluido e chiaro...

ora non mi resta che studiarmi un pò il "C"... ma mi sembra una bella impresa molto dura senza una persona che mi aiuta... :blink: poi forse mi sbaglio, ma è così complicato come sembra???

un'altra cosa: ma mikroC (sempre della mikroelektronika), secondo voi, com'è???

scusate l'o.t., ma era una curiosità nata dal fatto che tutti "scansano" il basic, per via delle sue limitazioni...

comunque tornando al mio problema, questa sera quando torno a casa posterò il listato rifatto, così magari mi tolgo qualche altro dubbio...

grazie mille a tutti!

Share this post


Link to post
Share on other sites
Livio Orsini
ma è così complicato come sembra???

Il problema non è il linguaggio, il vero problema è imparare a programamre.

Sembra banale ma è necessario imparare ad avere una mentalità logica e rigorosa.

Io ho scoperto che avedndo dovuto studiare la lingua latina ai tempi dell'adolescenza mi ha aiutato molto nello studio della programmazione.

Il latino è una lingua molto logica e precisa, al contrario l'inglese che è una lingua molto approsimativa, molto "fuzzy", quindi sei costretto ad acquisire una mentalità logica che ti aiuta molto nella programamzione.

Bisogna soprattutto imparare ad analizzare il problema, a suttividerlo in funzioni sempre più piccole, quasi elementari ed ad organizzarlo nel modo più efficiente. A questo punto si può codificare. Che si usi un linguaggio, piuttosto che un altro non avrà molta importanza.

Quindi prima di studiare un linguaggio dovresti studiare come fare per trasformare le tue idee in operazioni che possono essere eseguite da un micro.

Quindi devi prima imparare a capire come lavora il microcontrollore, ovvero studiare lo Hw.

Share this post


Link to post
Share on other sites
simuffa

ma era una curiosità nata dal fatto che tutti "scansano" il basic, per via delle sue limitazioni...

con entrambi riesci a fare le stesse cose.

Devi partire con cose "semplici" poi complicare. Uno non può iniziare a costruire un grattacielo prima di essere capace di fare le case.

Pienamente d'accordo con Livio

Share this post


Link to post
Share on other sites
Spillo87

giustissimo! concordo pienamente... infatti ho cominciato da poco con cavolate, tipo, fai lampeggiare due led, effetto kit con led, luci scale sequenziale automatiche, ecc ecc... cercando di usare quello che avevo imparato leggendo diversi forum e piccole guide, fino ad arrivare (o a cercare di capire) cose un pò più "complesse" tipo gli interrupt, con i quali ho riscritto i programmi già fatti, trovando moltissime soluzioni differenti, più logiche e più lineari...

Vi chiedo aiuto perché si trova un pò poco su internet sul mikrobasic (se non le cose basilari), e non conosco nessuno che mi può dare una mano (neanche con il C, basic, ecc)...

Ora mi sento di essere arrivato a un "buon" livello (diciamo buono :P per modo di dire) in neanche un mese di studio saltuario di questo linguaggio (allo stesso tempo sto studiando meccanica e programmazione cnc per un corso).

rispetto all'inizio, mi sento mooooolto più nella logica dei microcontrollori, e quando penso ad un "programma" riesco facilmente a suddividerlo per fasi, ma ancora sto in alto mare... mi mancano molte nozioni...

peccato che nella mia zona non ci sono corsi...... sono autodidatta in tutto per l'elettronica, sono geometra :P:superlol:

un grazie sincero per l'aiuto!

Share this post


Link to post
Share on other sites
Livio Orsini
sono autodidatta in tutto per l'elettronica,

Visto come funzionano le scuole professionali probabilmente è una fortuna, per te. :smile:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...