BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   info linguaggio c x pic (https://www.baronerosso.it/forum/circuiti-elettronici/189595-info-linguaggio-c-x-pic.html)

Davide B. 11 novembre 10 22:34

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.

elicottero78 14 novembre 10 14:32

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;
}
}
}

elicottero78 14 novembre 10 14:48

scusate,modifico
OPTION_REG.F1=1; //prescaler su WDT (di conseguenza 1:1 su TRM0)
con
OPTION_REG.F1=1; //prescaler 1:8

elicottero78 16 novembre 10 01:24

cavolo,non riesco a cavar un ragno dal buco:(

claudio476 19 novembre 10 10:21

Citazione:

Originalmente inviato da elicottero78 (Messaggio 2309138)
cavolo,non riesco a cavar un ragno dal buco:(

mmm... ad occhio e croce hai fatto un po di confusione, stai usango OPTION_REG come input per il tuo test, quello è invece un registro che va scritto, non letto.....

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

elicottero78 19 novembre 10 19:41

grazie x aver risposto

usando rb0,devo creare un interrupt? o posso stare nel main?

MSchiepp 19 novembre 10 20:48

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

elicottero78 20 novembre 10 01:08

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:

MSchiepp 20 novembre 10 09:53

Citazione:

Originalmente inviato da elicottero78 (Messaggio 2314874)
uso il debugger x controllare se il tmr0 si incrementa,ma non succede nulla:mumble:

Funziona, funziona...

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

elicottero78 20 novembre 10 15:47

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