Wednesday, September 30, 2020

AVR ATMega32 USART Receiver Interrupt Programming Example

We have already discussed about the USART module of the ATMega32 with some details and its programming example in AVR C. The transmitter interrupt is occur whenever the transmitter has complete the data transfer. It set the USART Transmit Complete (TXC). Similarly, the receiver interrupt is occur whenever the it has complete the data reception. It set the USART Receiver Complete (RXC).

However in this section I don't want to discuss all this interrupt capabilities. Here I show only how to program the USART interrupt on the receiver side.

It's similar to the introductory post, but here I use the receiver interrupt to get the data from the buffer. Using the interrupt it is more time effective. We can see this advantage just a large program contain a lot of working codes.

We must do this setting to get the USART interrupt working.
  1. Enable the RX Complete Interrupt Enable (RXCIE) of the UCSRC register.
  2. Enable the Global Interrupt of the SREG register
  3. Write the Interrupt Service Routine (ISR) for the USART receiver interrupt.
The interrupt vector of the USART receiver complete is USART_RXC_vect . Within this ISR the programmer must read the data from the UDR, then clear the USART Receive Complete (RXC).

Let look at this example.

/*
 * uart_interrupt.c
 *
 * Created: 9/30/2020 9:14:17 PM
 * Author : aki-technical
 */ 

#include <avr/io.h>

#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/interrupt.h>

void uartInit(unsigned long baud){
unsigned int UBRR;
/*Baud rate calculator*/
UBRR=(F_CPU/(16*baud))-1;
UBRRH=(unsigned char)(UBRR>>8);
UBRRL=(unsigned char)UBRR;
/*Enable the transmitter and receiver with receiver
complete interrupt*/
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
/*asynchronous mode, 8-bit, 1-stop bit*/
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
sei();
}

void uartTransmit(unsigned char data){
/*Stay here until the buffer is empty*/
while(!(UCSRA&(1<<UDRE)));
/*Put the data into the buffer*/
UDR=data;
}

void uartString(unsigned char *data){
while(*data) uartTransmit(*data++);
}

char rcvData=0;

int main(void)
{
DDRC=0xFF;
uartInit(9600);
uartString("USART Receiver Interrupt Example.\r");
while (1)
{
PORTC=rcvData;
}
}

/*Interrupt Vector for the USART*/
ISR(USART_RXC_vect){
/*Read the data from buffer*/
rcvData=UDR;
/*Clear the interrupt flag*/
UCSRA|=(1<<RXC);
}

Click here to download the zip file of this working example.

AVR ATMega32 USART Receiver Interrupt Programming Example
Schematic Diagram

PORTC displays the received data from the terminal.
 

If you want a standard PCB for ATMega32 micro-controller, you can order my AVR Microcontroller project from PCBWay with a reasonable price. Click here to get a free $5 credit for new account.

Interfacing ATMega32 to 74HC595 shift register
ATMega16 ATMega32 Experiment Board PCB from PCBWay
 

No comments:

Post a Comment

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (54) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (46) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (66) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (2) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (30) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)