Menu

Adskeeper - header widge

728x90

Search This Blog

468x60

Navbar

AdsKeeper - IAB Display Standard Ad Unit

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.


 

No comments:

Post a Comment

Adskeep- Standard Ads

Electronics and Programming Tutorials

336x280

DIY Electronic Projects And Instruments

AdsKeeper - 2091654

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (40) Analog Comparator (1) Arduino (16) ARM (32) AT89C52 (7) ATMega32 (59) ATMega644P (27) AVR (88) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (5) Display (157) Distance Sensor (3) dot matrix (1) ds1307 (10) DS18B20 (6) ds3231 (2) ds3232 (2) dsPIC (16) dsPIC30F1010 (3) dsPIC30F2010 (15) EEPROM (5) Environment Sensor (6) ESP32 (1) esp8266 (1) Graphical LCD (3) HD44780 (12) I2C (40) ILI9341 (1) Input/Output (84) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (3) LCD (87) LM35 (4) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) MikroC ARM (1) MikroC dsPIC (11) MikroC PIC (1) Module PCB (2) Motor (15) MPLABX (73) Nokia 5110 LCD (5) OLED (2) One-Wire (7) Oscillator (8) PCB (13) PCD8544 (3) PCF8574 (13) PIC (121) PIC12F (3) PIC16 (105) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (13) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PLL (1) PWM (12) RTC (13) SBN0064G (1) Sensor (15) SH1106 (3) Shift Register (15) Shift Registers (19) SN74HC595N (9) Software SPI (1) Software TWI (3) SPI (44) sprinf (3) ST7735 (1) STM32 (29) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (23) STM32CubeIDE (32) STM32F103C8T6 (9) STM32F103R6 (18) STM32F401CCU6 (1) SysTick (7) temperature sensor (15) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (11) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)