Witam
Propramuje w WinAvr. Chciałbym mierzyć częstotliwość impulsów podawanych na nóżke T1 mikroprocesora a następnie wynik pomiau wyśwwietlać na LCD. W tym celu napisalem następujący program
KOD:
]
Niestety program nie dziala poniewaz na LCD wyświetla napis obroty ale wartość pbrotów się nie zmienia.
Jeżeli częsć odpowiedzialną za wyświetlanie wrzucam do pętli while to LCD wyświetla śmieci
Proszę o podpowiedź jak można to rozwiązać, chciałbym to zrealizować jak najprostszym kodem
Propramuje w WinAvr. Chciałbym mierzyć częstotliwość impulsów podawanych na nóżke T1 mikroprocesora a następnie wynik pomiau wyśwwietlać na LCD. W tym celu napisalem następujący program
KOD:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "lcd.h"
#define F_CPU 1000000UL //czestotliwosc pracy procesora
int main(void)
{ //----------Ustawienie Rejestrów Liczników T0 T1---------
TCCR0= _BV(CS00)|_BV(CS02); // preskaler clk/1024
TCNT0 = 0x03; // wartość początkowa licznika T0
TIMSK|=_BV(0); //odblokowanie makski przerwania overflow T0
TCCR1B=_BV(CS12)|_BV(CS11)|_BV(CS10);//wybór liczaania zewnętrznego źródła zegara z pinu T1
TCNT1H=0x0; //wyzerowanie licznikaa T1
TCNT1H=0x0;
lcd_init(LCD_DISP_ON);
unsigned int obroty;
char buffer [36];
obroty=TCNT1;
itoa( obroty, buffer, 10);
lcd_puts("obroty"); //wypisz na Lcd
lcd_putc(buffer);
sei(); // włącz obsługę przerwań
while(1)
{}
}
//--------------Funkcja 1--obsługa przerwania licznika T0--------------------
SIGNAL (SIG_OVERFLOW0)
{TCCR0= 0 ; //zatrzymaj licznnik T0 na czas obsługi przerwania
TCCR1B=0; //zatrzymaj licznnik T1 na czas obsługi przerwania
static int licznik;
licznik++;
if(licznik==31) //znaczy że upłynęła 1s
{
licznik=0;
TCNT1H=0;
TCNT1L=0;
}
TCNT0 = 0x03; //wart. pocz. 3 licznka T0 aby wyszła dokładnie.1s
TCCR0= _BV(CS00)|_BV(CS02); //ponownie załącz liczniki T0 i T1
TCCR1B=_BV(CS12)|_BV(CS11)|_BV(CS10);
} ]
Niestety program nie dziala poniewaz na LCD wyświetla napis obroty ale wartość pbrotów się nie zmienia.
Jeżeli częsć odpowiedzialną za wyświetlanie wrzucam do pętli while to LCD wyświetla śmieci
while(1)
{}
}
//--------------Funkcja 1--obsługa przerwania licznika T0--------------------
SIGNAL (SIG_OVERFLOW0)
{TCCR0= 0 ; //zatrzymaj licznnik T0 na czas obsługi przerwania
TCCR1B=0; //zatrzymaj licznnik T1 na czas obsługi przerwania
static int licznik;
licznik++;
if(licznik==31) //znaczy że upłynęła 1s
{
unsigned int obroty;
char buffer [36];
obroty=TCNT1;
itoa( obroty, buffer, 10);
lcd_puts("obroty"); //wypisz na Lcd
lcd_putc(buffer);
licznik=0;
TCNT1H=0;
TCNT1L=0;
}
TCNT0 = 0x03; //wart. pocz. 3 licznka T0 aby wyszła dokładnie.1s
TCCR0= _BV(CS00)|_BV(CS02); //ponownie załącz liczniki T0 i T1
TCCR1B=_BV(CS12)|_BV(CS11)|_BV(CS10);
}Proszę o podpowiedź jak można to rozwiązać, chciałbym to zrealizować jak najprostszym kodem
