01-18-2018, 07:02 PM
Makso,
evo par saveta. Interapt rutinu si lepo uradio. Objasnicu ti malo kako kako tajmer radi. Ono sto mi se ne svidja kod tebe u programu je to sto koristis softverski uart. Razumem da je to sada za potrebe provere rada i to je oprosteno. Ovako cemo. Idemo prvo na interapt tajmera, pa na hardverski uart pooling metodom, pa na uart interapte. Tada ce ti vec dosta stvari biti mnogo jasno i moci ces da pravis ozbiljnije programe koji ce maksimalno koristiti hardverske resurse mikrokontrolera. To i jeste poenta rada mikrokontrolera.
Da se vratim na tajmer i proracunavanje perioda od interesa.
Tajmer je hardverski modul mikrokontrolera koji ima jedan prost zadatak, a to je da broji sistemske taktove. Nista drugo pametno ne radi tajmer. On moze da se koristi kao osnova za generisanje PWM signala asimetricnih/simetricnih, jednofaznih/visefaznih itd. Ovde cemo da se fokusiramo na osnovnu i najbitniju funkciju rada tajmera.
Sta to znaci brojanje sistemskih taktova. Ako MCU radi npr. na 1MHz to znaci da mu je osnovna perioda takta 1us (1/1MHz). Tajmerski registar koji se zove TCNT ce da poveca svoju vrednost na svaku 1us. Ako je sirina ovog registra 16-bit-a, to znaci da tajmer moze da broji od 0 - 65535, tj. moze maksimalno da odbroji 65536 odbiraka, sto odgovara vremenu od 65536us. Ako ovaj vremenski interval nije dovoljan, onda ukoliko MCU to dozvoljava, mozemo da tajmeru dodelimo preskaler koji ima zadatak da nam poveca opseg brojanja na racun deljenja sistemskog takta koji ulazi u nas tajmer. Ako npr. na postojecem primeru aktiviramo preskaler koji deli takt 1:4, onda dobijamo sledecu situaciju: Ttmr = 4 / (1MHz) = 4us, tj. osnovni inkrement tajmera je sada 4us. Maksimalno odbrojavanje tajmera ce sada biti 4us * 65536 = 262.166ms. Ako tajmeru dodelimo i prekid (interapt) onda imamo precizno generisanje vremenskih intervala. Prekid se desava (uglavnom, ali to zavisi od arhitekrure, a kod nekih MCU-ova je programabilan) pri prelasku sa MAX vrednosti TMR-a na 0, tj. sa 65535 na 0 (ako je TMR 16-bitni).
Npr. ako zelis da generises interapt na svaku 1ms sa 16-bitnim tajmerom pri frekvenciji MCU-a od 16MHz, onda to racunas na sledeci naci.
Fclk = 16MHz => Tclk = 62.5ns
1ms / 62.5ns = 16000. To znaci da TMR treba da odbroji 16000 taktova. To postizemo tako sto u TMR registar upisujemo TMR = 65536 - 16000 = 49536.
TMR = 0xC180
Ovo je 16-bitna vrednost. Moras da vodis i racuna kako upisujes 16-bitnu vrednost na 8-bitnom MCU. To se radi tako sto se prvo u H registar upise vrednost, pa onda u L. Na konktretnom primeru:
TCNT1H = 0xC1;
TCNT1L = 0x80;
Ti si u kodu napisao TCNT1. To je 16-bitna promenljiva koja se fizicki sastoji od dva registra, TCNT1H i TCNT1L.
evo par saveta. Interapt rutinu si lepo uradio. Objasnicu ti malo kako kako tajmer radi. Ono sto mi se ne svidja kod tebe u programu je to sto koristis softverski uart. Razumem da je to sada za potrebe provere rada i to je oprosteno. Ovako cemo. Idemo prvo na interapt tajmera, pa na hardverski uart pooling metodom, pa na uart interapte. Tada ce ti vec dosta stvari biti mnogo jasno i moci ces da pravis ozbiljnije programe koji ce maksimalno koristiti hardverske resurse mikrokontrolera. To i jeste poenta rada mikrokontrolera.
Da se vratim na tajmer i proracunavanje perioda od interesa.
Tajmer je hardverski modul mikrokontrolera koji ima jedan prost zadatak, a to je da broji sistemske taktove. Nista drugo pametno ne radi tajmer. On moze da se koristi kao osnova za generisanje PWM signala asimetricnih/simetricnih, jednofaznih/visefaznih itd. Ovde cemo da se fokusiramo na osnovnu i najbitniju funkciju rada tajmera.
Sta to znaci brojanje sistemskih taktova. Ako MCU radi npr. na 1MHz to znaci da mu je osnovna perioda takta 1us (1/1MHz). Tajmerski registar koji se zove TCNT ce da poveca svoju vrednost na svaku 1us. Ako je sirina ovog registra 16-bit-a, to znaci da tajmer moze da broji od 0 - 65535, tj. moze maksimalno da odbroji 65536 odbiraka, sto odgovara vremenu od 65536us. Ako ovaj vremenski interval nije dovoljan, onda ukoliko MCU to dozvoljava, mozemo da tajmeru dodelimo preskaler koji ima zadatak da nam poveca opseg brojanja na racun deljenja sistemskog takta koji ulazi u nas tajmer. Ako npr. na postojecem primeru aktiviramo preskaler koji deli takt 1:4, onda dobijamo sledecu situaciju: Ttmr = 4 / (1MHz) = 4us, tj. osnovni inkrement tajmera je sada 4us. Maksimalno odbrojavanje tajmera ce sada biti 4us * 65536 = 262.166ms. Ako tajmeru dodelimo i prekid (interapt) onda imamo precizno generisanje vremenskih intervala. Prekid se desava (uglavnom, ali to zavisi od arhitekrure, a kod nekih MCU-ova je programabilan) pri prelasku sa MAX vrednosti TMR-a na 0, tj. sa 65535 na 0 (ako je TMR 16-bitni).
Npr. ako zelis da generises interapt na svaku 1ms sa 16-bitnim tajmerom pri frekvenciji MCU-a od 16MHz, onda to racunas na sledeci naci.
Fclk = 16MHz => Tclk = 62.5ns
1ms / 62.5ns = 16000. To znaci da TMR treba da odbroji 16000 taktova. To postizemo tako sto u TMR registar upisujemo TMR = 65536 - 16000 = 49536.
TMR = 0xC180
Ovo je 16-bitna vrednost. Moras da vodis i racuna kako upisujes 16-bitnu vrednost na 8-bitnom MCU. To se radi tako sto se prvo u H registar upise vrednost, pa onda u L. Na konktretnom primeru:
TCNT1H = 0xC1;
TCNT1L = 0x80;
Ti si u kodu napisao TCNT1. To je 16-bitna promenljiva koja se fizicki sastoji od dva registra, TCNT1H i TCNT1L.