/*
UART hasznalata megszakitasokkal
Hardver: ATmega8 @ 7.372800MHz
PC Szoftver: Hyper terminal @ 9600 baud, Nincs Paritas Bit, 1 Stop Bit, Flow Control = NONE
*/
#define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
#define USART_BAUDRATE 9600 // soros kommunikacio sebessege: 9600 bps
#define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1) // UBRR
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <util/delay.h>
#define LED_PIN 0 // LED a PC0-as labon
void KonfigUART() // UART beallitasa
{
// 9600 bps soros kommunikacio sebesseg beallitasa
UBRRL = UBRR_ERTEK; // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
UBRRH = (UBRR_ERTEK>>8); // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
// Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
//Ado es Vevo aramkorok bekapcsolasa + az RX interrupt engedelyezese
UCSRB |= (1 << RXEN) | (1 << RXCIE) | (1 << TXEN); //
}
char UARTAdatFogad() // Ez a fuggveny a beerkezo adatokat kiolvassa az UDR regiszter bejovo pufferebol
{
while(!(UCSRA & (1<<RXC))) // Varakozas amig nincs uj bejovo adat
{
// Varakozas
}
//Most mar van beerkezett adat, amit kiolvasunk a pufferbol
return UDR;
}
void UARTAdatKuld(char data) // Ez a fuggveny a kuldendo adatot beirja az UDR regiszter kimeno pufferjebe
{
while(!(UCSRA & (1<<UDRE))) // Varakozas amig az Ado kesz nem lesz az adatkuldesre
{
// Varakozas
}
// Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
UDR=data;
}
int main(void) // Foprogram
{
DDRC = _BV(LED_PIN); // PC0 kimenet (LED)
PORTC = 0x00;
KonfigUART(); // UART Konfiguralasa
// A LED-et eloszor nehanyszor ki- es bekapcsoljuk, hogy ellenorizzuk minden rendben
PORTD &= ~(_BV(LED_PIN)); // LED be
_delay_ms(100); // Varakozas 100 ms-ig
PORTC |= _BV(LED_PIN); // LED ki
_delay_ms(100);
PORTC &= ~(_BV(LED_PIN));
_delay_ms(100);
PORTC |= _BV(LED_PIN);
_delay_ms(100);
// Elkuldjuk a "Hello" uzenetet, hogy a soros kommunikaciot leellenorizzuk
UARTAdatKuld('H');
UARTAdatKuld('e');
UARTAdatKuld('l');
UARTAdatKuld('l');
UARTAdatKuld('o');
UARTAdatKuld('\n');
sei(); // Altalanos megszakitasok engedelyezese
while(1)
{
// Ures ciklus (mindent az ISR-en belul kezelunk)
}
return 0;
}
ISR(USART_RXC_vect) // RX interrupt, ezek az utasitasok futak le ha adat erkezik a TX vonalon
{
char data;
data = UARTAdatFogad(); // A berekezo bajt fogadasa
if(data == 'b') // Ha a fogadott bajt 'b'-vel egyezik meg, bekapcsoljuk a LED-et
{
PORTC &= ~(_BV(LED_PIN));
UARTAdatKuld('L');
UARTAdatKuld('E');
UARTAdatKuld('D');
UARTAdatKuld(' ');
UARTAdatKuld('B');
UARTAdatKuld('E');
UARTAdatKuld('\n'); // Kovetkezo sor
UARTAdatKuld('\r'); // Ugras a sor elejere
}
else if(data == 'k')
{
PORTC |= _BV(LED_PIN); // Ha a fogadott bajt 'k'-val egyezik meg, kikapcsoljuk a LED-et
UARTAdatKuld('\t');
UARTAdatKuld('L');
UARTAdatKuld('E');
UARTAdatKuld('D');
UARTAdatKuld(' ');
UARTAdatKuld('K');
UARTAdatKuld('I');
UARTAdatKuld('\n');
UARTAdatKuld('\r');
}
}