Timer1 u 16F628A - sepnutí vstupu po dokončení čítání

Zdravím

Protřeboval by, když časovač dosahne hodnity např:50000 tak aby se sepnul vystup rb0.




void main(){
 TRISA = 0b00000000;
 TRISB = 0b00000000;
 PORTA = 0b00000000;
 PORTB = 0b00000000;
 /*CMCON = 0b00000111;*/
OPTION_REG = 0b00000001;
 
 while(1){
 
          while(tmr0 < 255);
          tmr0=0;
          
          portb.b0 =!portb.b0 ;
 
 
 }

 
 
 
 


}

tady to mam řešený s časovačem TMR0 ale ten je jen 8-bitový

Ale potřebuju vetší hodnotu než 255 a to by mělo jit u timer1

ale pro ukladání 16 bit čisla jsoud va registry TMR1H a TMR1L

a jak to zapsat aby to vypadalo takto

while(tmr1 < 50000);

:arrow_right: administrator: přejmenováno z "Timer1 u 16f628a"

Můžeš třeba přes přerušení. Časovač TMR1 nastav na (65536-50000) a až přeteče, v přerušení se spustí požadovaná akce. Nebo stejná konfigurace bez přerušení a hlídej až TMR1H změní svuj stav na 0x00 (to je okamžik přetečení).

a co sledovat az se nastavi T0IF …
takze while(!(bit.T0IF));

Ale samostatný tmr1 registr nemá ma jen TMR1H a TMR1L a to mam teda hodnotu 50000 zapsat takto TMR1H=1100001 TMR1L=01010000

ne,TMR1H=11000011 TMR1L=01010000 :wink:

While ((TMR1H & & TMR1L) == 50000) ;

Da se takto ta podminka taky zapsat?

A nebo tahle
while(TMR1H == 0b11000011 & & TMR1L ==0b01010000);

a co ti brani si to vyskouset v simulatoru co to dela

tak jinak, jak moc presne potrebuje tu casovou hodnotu?
casovac bezi a bezi , pokud nestihnes casovac skontrolovat kdyz je 50k tak mas smulu ,takze ti nezbyde nez jen opravdu cekat az bude tech 50k, no a to uz tam rovnou muzes dat delay,takze musis >=
takze pokud potrebujes presnost dej to do preruseni
pokud ne. tak si hlidej ten T0IF

Ja stale evim jak mam kontrolovat tu hodnotu ve dvou registrech.

Pac kdybych tam mel primo registr TMR1 tak nic neresim

Možná bude lepší pokud pracuje s Timer1 sledovat bit
PIR1.TMR1IF, sledování bitu T0IF mu bude k ničemu.

Milo: jasně, ať sleduje příznak přetečení (já už s picama roky nedělám)
Velda: nemusíš sledovat dva registy

No joo, ani mi to nejak netrklo , zrovna jsem tam mel tmr0…
a dyt je to jedno , chce stejne cist jen ten timer

Nemusíš kontrolovat dva registry, nadefinuj si ho jako jeden 16bit a máš to…

Já to mám třeba takto.

int Timer1_16bit @ 0x0E:

jak se to vezme , TMR1 ma a bude mit stav ulozenej ve 2 registrech, tim ze si ho nadefinujes jako 1 16bit si max ulehcis zapis while(TMR1==0xc350) ale prekladac bude porad porovnavat dva registry, jo a pokud teda bedes definovat ten timer jako 16bit tak 0-0xffff, coz “int” nemusi bejt …

Petr:dik za upozorneni na tu chybu

No a kdyby zakladatel vlákna investoval nějakej čas a přečet si v datasheetu
ww1.microchip.com/downloads/en/D … 40044E.pdf
kapitolu 7.3 example 7-1 , tak bude vědět jak bezpečně přečíst 16bit hodnotu ze dvou registrů typu časovač.