Timer u PIC16F628a

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
ludvaludva
Příspěvky: 5
Registrován: 03 bře 2011, 00:00

Timer u PIC16F628a

#1 Příspěvek od ludvaludva »

Zdravím, mám takový hloupý dotaz,
nevím jak udělat v MPLABU časovač u 16F628a, vůbec nevím, jaký registry mám použít :-(
Mám PIC-C Compiler pro PIC12/14/16

Může mi někdo pomoct?
Uživatelský avatar
MartinOV
Příspěvky: 112
Registrován: 01 dub 2010, 00:00

#2 Příspěvek od MartinOV »

Jelikož jsi dotaz napsal dost obecně, odpovědi budou asi taky obecné. :)

F628A má tři vestavěné časovače (TMR0, TMR1 a TMR2). Ideální je použít je společně s přerušením a vhodným ošetřením.
Další možností je, že chceš nějakou čekací smyčku. Pak si vezmeš kterýkoliv registr z RAM a přičítáš/odčítáš jedničku do/z dané hodnoty a při pod/pře-tečení jedeš v programu dál.
Na názvy registrů se mrkni do datasheetu, měly by být stejné jako názvy čítačů (TMR0, TMR1). Pozor, TMR0 má nastavovací bity v OPTION_REG, TMR1 je má ve vlastním registru T1CON a TMR2 má T2CON. TMR2 je ještě přiřazen k PWM, ale to už jsou další detaily.
Je nutné si dát pozor na ty nastavovací registry, kolikrát jsem vyšiloval u nějakého jednoduchého programu, že mi neběželo třeba přerušení a hle, já jsem ten čítač neměl zapnutý... :)
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#3 Příspěvek od Atlan »

TMR0 = 100;
OPTION_REG = 0b00110101;
INTCON = 0;
T0CS = 0; // 0 - Timer increments on instruction clock; 1- ext pin4
T0IE = 1; // Enable interrupt on TMR0 overflow
GIE = 1; // Global interrupt enable


void interrupt isr (void)
{
if(T0IF) // Was this a timer0 overflow?
{
TMR0 = 100;
//kod
// t++;
// if ((timerun)) timerun--;
// if ((timestop)) timestop--;

T0IF = 0; // Clear interrupt flag, ready for next
}
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“