Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Kuba 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 :).
/*
* 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);
}
-
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.
-
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 ...
-
Napis do fora na www.mikrozone.sk. Su tam ludia, co aktivne robia s AVR.
-
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.