Witam.
Jestem początkującym programistą AVR
Grzebałem i szukałem "trochę" po forum ale nie znalazłem nic co by mi pomogło.
Próbuje zbudować obrotomierz do motocykla na układzie Atmega8 który wynik wyświetla na panelu LED a nie jak większość projektów na LCD 2x16. Dodatkowo mam takie Ciśnienie by napisać program w języku C który dla mnie jest mniej czytelny i trudniejszy a większość obrotomierzy jakie wdziałem śmigają na Bascom'ie.
Problem dotyczy mojej niewiedzy, nie wiem jak ustawić Timer by zliczał impulsy.
Tu: http://www.portalnaukowy.republika.pl/obrotomierz_2.htm jest projekt obrotomierza na LCD i z wykorzystaniem Bascom'a, chciałbym właśnie tak ustawić Timer jak w tym projekcie tylko że w języku C.
Wyżej umieściłem swój program który został zlepiony z tego co znalazłem w sieci.
Jeden timer już używam do wyświetlania liczb na wyświetlaczu, teraz chcę drugi skonfigurować na liczenie impulsów.
Pomoże ktoś?
Jestem początkującym programistą AVR
Grzebałem i szukałem "trochę" po forum ale nie znalazłem nic co by mi pomogło.
Próbuje zbudować obrotomierz do motocykla na układzie Atmega8 który wynik wyświetla na panelu LED a nie jak większość projektów na LCD 2x16. Dodatkowo mam takie Ciśnienie by napisać program w języku C który dla mnie jest mniej czytelny i trudniejszy a większość obrotomierzy jakie wdziałem śmigają na Bascom'ie.
Problem dotyczy mojej niewiedzy, nie wiem jak ustawić Timer by zliczał impulsy.
Tu: http://www.portalnaukowy.republika.pl/obrotomierz_2.htm jest projekt obrotomierza na LCD i z wykorzystaniem Bascom'a, chciałbym właśnie tak ustawić Timer jak w tym projekcie tylko że w języku C.
#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned char liczba_LED[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
volatile long licznik= 0;
volatile uint8_t jeden, dwa, trzy, cztery;
volatile int8_t wysw;
ISR(TIMER1_COMPA_vect){
switch (wysw)
{
case 0:
PORTC =0x0;
PORTC =0x8;
PORTB = liczba_LED[jeden];
wysw=1;
break;
case 1:
PORTC =0x0;
PORTC =0x4;
PORTB = liczba_LED[dwa];
wysw=2;
break;
case 2:
PORTC = 0x0;
PORTC = 0x2;
PORTB = liczba_LED[trzy];
wysw=3;
break;
case 3:
PORTC = 0x0;
PORTC = 0x1;
PORTB = liczba_LED[cztery];
wysw=0;
break;
}
}
ISR(INT0_vect){
licznik++;
}
ISR(BADISR_vect){}
int main(void){
DDRC = 0xFF;
DDRB = 0xFF;
DDRD &= ~(1<<DDD2);
PORTD |= _BV(PD2);
MCUCR = _BV(ISC01);
GICR |= (1<<INT0);
TCCR1B |= (1 << WGM12); // Ustawia timer1 w tryb CTC
OCR1A = 500; // Ustawia warto�� po��dan� na 100Hz dla preskalera 1
TCCR1B |= (1 << CS10); // Ustawia timer z preskalerem Fcpu/1
TIMSK |= (1 << OCIE1A); // Zezwolenie na przerwania dla CTC
sei(); // Zezwolenie globalne na przerwania
for(;;){
jeden = licznik / 1000;
dwa = (licznik - jeden * 1000)/ 100;
trzy = ((licznik - jeden * 1000) - dwa * 100) /10;
cztery = licznik % 10;
_delay_ms(50);
}
return 0;
}
Wyżej umieściłem swój program który został zlepiony z tego co znalazłem w sieci.
Jeden timer już używam do wyświetlania liczb na wyświetlaczu, teraz chcę drugi skonfigurować na liczenie impulsów.
Pomoże ktoś?
