Kód: Vybrať všetko
enc
Kód: Vybrať všetko
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd.h"
#define F_CPU 16000000UL
// Deklarace promennych
char str[4];
int enc = 0;
unsigned int timercounter = 0;
// deklarace timerů
void initInterrupts(void);
void TimerInit(void);
//Preruseni INT1
ISR(INT1_vect)
{
//pokud dojde k preruseni, probehna kontrola pinu PD5 k urceni smeru
//a podle toho pricteni nebo odecteni
if (PIND & (1 << PD5)) {
if (PIND & (1 << PD3)) {
enc--;
} else {
enc++;
}
// change to falling detection
MCUCR |= ((0 << ISC00) | (1 << ISC01));
} else {
if (PIND & (1 << PD3)) {
enc++;
} else {
enc--;
}
// change to rising detection
MCUCR |= ((1 << ISC00) | (1 << ISC11));
}
//timercounter = 0;
}
// preruseni kazdyhc 10ms
ISR(TIMER1_COMPA_vect)
{
// Reset timeru
TCNT1 = 0;
}
// Inicializace INT1
void initInterrupts(void)
{
// nastaveni PD3 a PD5 jako vstupu
DDRD &= ~(1<<PD5);
DDRD &= ~(1<<PD3);
// povoleni pull-up odporu
PORTD |= (1<<PD5)|(1<<PD3);
// Preruseni na sestupnou hranu na INT1
MCUCR |= (1<<ISC11);
// povoleni INT1
GICR |= (1<<INT1);
}
void TimerInit(void)
{
// nastaveni delicky (clk/64)
TCCR1B |= _BV(CS10);
TCCR1B |= _BV(CS11);
// 250 pulzu -> kazdou 1 ms test
OCR1A = 250;
// smazani OCF1A flag
TIFR |= _BV(OCF1A);
// Povoleni Timeru1 v rezimu COMPARE
TIMSK |= _BV(OCIE1A);
}
// Hlavni fce
int main(void)
{
// Inicializace IO a casovacu
initInterrupts();
TimerInit();
// povoleni global. preruseni
sei();
// Inicializace LCDcka
lcd_init(LCD_DISP_ON);
// napis na prvnim radku LCDcku
lcd_gotoxy(0,0);
lcd_puts("Encoder test");
// nekonečník
while (1)
{
// zapis na LCDcko na pozici 0,1 (znak,radek)
lcd_gotoxy(0,1);
lcd_puts(itoa(enc, str, 10));
_delay_ms(10);
}
}