Atmega16 timer1 overflow

Kuba

Atmega16 timer1 overflow
« kdy: 28. 10. 2015, 09:40:56 »
Zdravím, mám jednoduchý(teda myslel jsem si, že jednuduchý) kod, který má vypisovat hodnoty TCNT1 na displeji, nicméně to uplně nefunguje na displeji běhá jen:TCNT1 = 00040/00041/00042. Větší hodnota jak 42 se na displeji neukáže, všiml jsem si, že pokud změním předděličku na časovači, tak se hodnota na displeji změní, ale zase se hodnota zobrazuje pouze v nějakém malém rozmezí. Budu rád za každou radu, předem děkuji :).

Kód: [Vybrat]
/*
 * HCSR04atmega28_10.c
 *
 * Created: 28.10.2015 7:11:31
 *  Author: Jakub
 */
#define F_CPU 1000000UL

#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/io.h>
#include <avr/wdt.h>
#include "lcd.h"


void preruseni();
void casovace();
void displej();

SIGNAL(TIMER1_OVF_vect)
{
LCDClear();
LCDWriteStringXY(0,0,"CasOVF");
_delay_ms(1000);
TCNT1 = 0;
}


int main(void)
{
sei();
displej();
_delay_ms(5);
preruseni();
casovace();

TCCR1B = ((0<<CS12) | (1<<CS11) | (1<<CS10));
    while(1)
    {
TCNT1 = 0;
LCDClear();
LCDWriteStringXY(0,0,"TCNT1=");
LCDWriteIntXY(0,1,TCNT1,5);
if (TCNT1 > 200)
{
LCDClear();
LCDWriteStringXY(0,0,"Hodnota");
LCDWriteIntXY(0,1,200,4);
}
_delay_ms(100);
LCDClear();

        //TODO:: Please write your application code
    }
}


void preruseni()
{
MCUCR = (0<<ISC11) | (1<<ISC10);
GICR = (1<<INT1);
}
void casovace()
{

TIMSK |= (1<<TOIE1);
TCNT1 = 0;
}
void displej()
{
LCDInit(LS_BLINK|LS_ULINE);
}



Kuba

Re:Atmega16 timer1 overflow
« Odpověď #1 kdy: 28. 10. 2015, 09:53:18 »
Ještě drobnost jsem zapoměl, vím, že v přerušení by něměl být žadný delay, nicméně důvod toho kodu je k tomu, abych pochopil časovače a viděl, že funguje tak jak má a měl jistotu, že když pustím časovač 1, tak mi bude počítat do 65536 a potom přeteče a vyvolá se přerušení na overflow.

eiffel

Re:Atmega16 timer1 overflow
« Odpověď #2 kdy: 28. 10. 2015, 12:15:17 »
Uz sice dlouho s timto osmibitovym kramem nedelam, ale ten wait z preruseni vyhod - je to absolutni hovadina. Timer si stejne bezi vesele dal, je to kus HW ...




Slavo T.

Re:Atmega16 timer1 overflow
« Odpověď #3 kdy: 29. 10. 2015, 07:35:34 »
Napis do fora na www.mikrozone.sk. Su tam ludia, co aktivne robia s AVR.

lojza

Re:Atmega16 timer1 overflow
« Odpověď #4 kdy: 29. 10. 2015, 08:33:44 »
Tak bez nějakého podrobného zkoumání, pokud v každym cyklu smyčky nastavíš TCNT1 = 0 a vzápětí se pokoušíš TCNT1 zobrazit, tak se pokaždý zobrazí plusmínus to stejný, protože budeš pokaždé zobrazovat, kolik tiků trvalo čítači mezi TCNT1 = 0 a voláním LCDWriteIntXY(0,1,TCNT1,5); což se vykonává v každym cyklu smyčky stejně dlouho.