![]() |
Bravo, stai facendo progressi. Cerca quanto prima di passare ai micro della serie Pic18F4xxx che sono un minimo più seri come micro, e sui quali puoi tentare di far girare uno scheduler o quanto meno i SyncTimer. Ed inoltre cerca di capire ed usare i Timer. Scoprirai, se userai un po' più seriamente i microcontrollori, che Timer, SyncTimer e Scheduler sono maledettamente comodi per lavorare alla svelta, una volta studiati e capiti. |
ciao,scusatemi ancora,io vorrei poter leggere il valore dell impulso pwm che arriva dalla mia ricevente e con un pic creare qualcosa...tipo un gioco di luci,un interuttore ecc vi posto questo programmino fatto giusto x farvi vedere....niente di che... volevo sapere se potesse funzionare? uso x prova il pic 16f84a,voglio leggere il valore di trm0 ogli fronte salita e in base al suo valore,faccio fare questo o quest altro char misura; void main() { trisa=0b10000; trisb=0b000000000; portb=0; porta=0; OPTION_REG.F5=1; //TRM0 incrementato da impulso su RA4/T0CKI OPTION_REG.F4=1; //Incremento sul fronte alto OPTION_REG.F1=1; //prescaler su WDT (di conseguenza 1:1 su TRM0) INTCON.F7=0; //global interrupt disabilitati INTCON.F6=0; //Peripheral Interrupt disabilitati INTCON.F5=0; //TMR0 Overflow Interrupt disabilitato TMR0=0; while(1) { if (OPTION_REG.T0SE=1) { misura= TMR0; } if (OPTION_REG.T0SE=0) { TMR0=0; } if(misura>200) { portb.f0=1; }else{ portb.f0=0; } } } |
scusate,modifico OPTION_REG.F1=1; //prescaler su WDT (di conseguenza 1:1 su TRM0) con OPTION_REG.F1=1; //prescaler 1:8 |
cavolo,non riesco a cavar un ragno dal buco:( |
Citazione:
al limite puoi fare così: attendi che l'input vada alto, ad esempio B0, appena va alto, attivi il contatore timer0, ovviamente prima lo avrai azzerato, quando B0 torna basso leggi il valore di tmr0 e fai i tuoi conti |
grazie x aver risposto usando rb0,devo creare un interrupt? o posso stare nel main? |
Prima di use l'interrupt, fallo funzionare testando il bit; devi modificare anche il settaggio del timer: tu hai impostato il conteggio del numero di impulsi che arrivano su RB0, non il conteggio del tempo dell'impulso. prova così: Setta il timer con ingresso sul clock interno (T0CS=0) Setta RB0 (o altro pin) in ingresso do{ TMR0 = 0; }while (!RB0); // aspetta che RB0 sia a 1 e tiene TMR0 a 0 while (RB0); // aspetta che RB0 sia a 0 mentre TMR0 conta a = TMR0; // salva il valore raggiunto dal timer Ovviamente non è il sistema più preciso, ma è il più facile; un passo alla volta... Michele |
ciao,grazie x avermi risposto cavolo,non so se ho troppe cose in testa x il lavoro o sono diventato un infermo mentale....non riesco a capire niente x MSchiepp intendi questo x testare il bit? char a; void main() { TRISA=0b00000; TRISB=0b00000001; PORTA=0; PORTB=0; OPTION_REG=0b00000010; do{ TMR0 = 0; }while (!RB0); // aspetta che RB0 sia a 1 e tiene TMR0 a 0 while (RB0); // aspetta che RB0 sia a 0 mentre TMR0 conta a = TMR0; // salva il valore raggiunto dal timer } uso il debugger x controllare se il tmr0 si incrementa,ma non succede nulla:mumble: |
Citazione:
Se usi il debugger ad un certo punto devi simulare il pin RB0 al valore 1 (con la funzione 'stimulus' del debugger) altrimenti vedrai il programma girare sempre nel primo ciclo while che tiene sempre il timer a zero... Michele |
si,nel debugger ho inserito e tolto 1 su rb0,ma il trm0 e la variabile -a- stanno sempre a 0. |
| Tutti gli orari sono GMT +2. Adesso sono le 00:20. |
Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2026
www.baronerosso.it - www.toymagazine.it