#define F_CPU 1000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <string.h>
#include <util/delay.h>
#define MYUBRR 11
#define BAUD 9600
volatile unsigned char odb_flaga = 0;
void USART_Init(unsigned int ubrr)
{
UBRRH = (unsigned char)(ubrr >> 8);
UBRRL = (unsigned char)ubrr;
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0) | (1 << USBS);
UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
odb_flaga = 1;
}
ISR(USART_RXC_vect)
{
}
ISR(USART_UDRE_vect)
{
UCSRB &= ~(1 << UDRIE);
}
void at_komenda_reakcja(unsigned char at_komenda_nr)
{
switch (at_komenda_nr) {
case 0:
PORTC = 0x01;
_delay_ms(1000);
PORTC = 0x00;
_delay_ms(1000);
break;
case 1:
PORTC = 0x01;
_delay_ms(1000);
PORTC = 0x00;
_delay_ms(1000);
break;
}
}
unsigned char USART_Receive(void)
{
/* Wait for data to be received */
while (!(UCSRA & (1 << RXC)))
;
/* Get and return received data from buffer */
return UDR;
}
void at_komenda_sprawdz(void)
{
USART_Receive();
at_komenda_reakcja(UDR);
}
int main(void)
{
DDRC = 0x01;
DDRD = 0x01;
USART_Init(MYUBRR);
sei();
while (1) {
at_komenda_sprawdz();
}
}
Kod działa, prawie prawidłowo. Problem jest w tym, że zapala mi diodę tylko jeden raz a nie z opcją wyboru w kółko.