0% found this document useful (0 votes)
39 views

Receiver Program Code

This C code configures the USART for serial communication at 1200 baud and sets up an interrupt service routine to control an LED based on received commands. When a sync byte, address, and matching checksum are received, the ISR will turn the LED on or off depending on the data byte. The USART is initialized for asynchronous communication and reception is enabled along with interrupts. Main configures port C pin 0 as an output for the LED and enables interrupts before entering an infinite loop.

Uploaded by

stsc. shmostak
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
39 views

Receiver Program Code

This C code configures the USART for serial communication at 1200 baud and sets up an interrupt service routine to control an LED based on received commands. When a sync byte, address, and matching checksum are received, the ISR will turn the LED on or off depending on the data byte. The USART is initialized for asynchronous communication and reception is enabled along with interrupts. Main configures port C pin 0 as an output for the LED and enables interrupts before entering an infinite loop.

Uploaded by

stsc. shmostak
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 2

#include <avr/io.

h>
#include <avr/interrupt.h>
#include <util/delay.h>
#ifndef F_CPU
//define cpu clock speed if not defined
#define F_CPU 4000000
#endif
//set desired baud rate
#define BAUDRATE 1200
//calculate UBRR value
#define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1)
//define receive parameters
#define SYNC 0XAA// synchro signal
#define RADDR 0x44
#define LEDON 0x11//LED on command
#define LEDOFF 0x22//LED off command
void USART_Init(void)
{
//Set baud rate
UBRRL=(uint8_t)UBRRVAL; //low byte
UBRRH=(UBRRVAL>>8); //high byte
//Set data frame format: asynchronous mode,no parity, 1 stop bit, 8 bit size
UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|
(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);
//Enable Transmitter and Receiver and Interrupt on receive complete
UCSRB=(1<<RXEN)|(1<<RXCIE);//|(1<<TXEN);
//enable global interrupts
}
uint8_t USART_vReceiveByte(void)
{
// Wait until a byte has been received
while((UCSRA&amp;(1<<RXC)) == 0);
// Return received data
return UDR;
}
ISR(USART_RXC_vect)
{
//define variables
uint8_t raddress, data, chk;//transmitter address
//receive destination address
raddress=USART_vReceiveByte();
//receive data
data=USART_vReceiveByte();
//receive checksum
chk=USART_vReceiveByte();
//compare received checksum with calculated
if(chk==(raddress+data))//if match perform operations
{
//if transmitter address match
if(raddress==RADDR)
{
if(data==LEDON)
{
PORTC&amp;=~(1<<0);//LED ON
}
else if(data==LEDOFF)
{
PORTC|=(1<<0);//LED OFF
}
else
{
//blink led as error
PORTC|=(1<<0);//LED OFF
_delay_ms(10);
PORTC&amp;=~(1<<0);//LED ON
}
}
}
}
void Main_Init(void)
{
PORTC|=(1<<0);//LED OFF
DDRC=0X001;//define port C pin 0 as output;
//enable global interrupts
sei();
}
int main(void)
{
Main_Init();
USART_Init();
while(1)
{
}
//nothing here interrupts are working
return 0;
}

You might also like