Electronic – Uart serial communication failing to echo back Atmega16a

avrcuart

I am new to the avr (8bit uc) and recently I ran into a problem using serial communication (uart) with PC. Microcontroller fails to responsd in putty terminal where it should echo back whatever I have sent.


Thank you for your response everyone .

I am sorry for the corrupt code I had no idea what I was doing since I am newbie to this code indention in stack exchange.


The new code is attached below please kindly suggest

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

volatile char data;

void USARTInit(uint16_t ubrr_value) {
    UBRRL = ubrr_value;
    UBRRH = (ubrr_value >> 8);
    UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
    UCSRB = (1 << RXEN) | (1 << TXEN);
}

void USARTWriteChar(char data) {
    while (!(UCSRA & (1 << UDRE)))
        { }

    //Now write the data to USART buffer
    UDR = data;                                                               
}                                                                             

void main() {                                                                 
    sei();                                                                    
    UCSRB |= (1 << RXCIE);                                                    
    USARTInit(51);                                                            

    while (1) {                                                               
        if (data == 'a') {                                                    
            USARTWriteChar(data);
        }
    }
}

ISR(USARTRXC_vect) {
    data = UDR;
}

so here foo just represents my data='a', unfortunately avr is not responding to my inputs .
when I type "a" .

Best Answer

Firstly, that code won't compile. The last portion of it (the ISR) looks corrupt - you might want to re-post that bit.

Secondly, it's not surprising that if you type "FOO" it doesn't respond, since the code is waiting for you to press "a" at which point it would respond with "[a][a][a][a][a][a]...." until you press something else.

Thirdly, you should learn to format your code properly, or at least use one of the good auto-formatters, like Artistic Style.

Unfortunately I don't have an ATMega16A here to test your code with, and I am not up on Atmel interrupts, so all I can do is suggest some things to try:

  1. Make sure your code is actually running and the serial itself is working: Make it print a "Hello" message at the start of your main() after configuring the UART.
  2. Make sure the interrupt is actually firing - make it light an LED when the interrupt is triggered.
  3. Make it blink another LED as a "heartbeat" in your main while(1) loop to make sure it's not getting stuck.

Edit: After some digging and reading (I do find that Atmel datasheets are appallingly badly written) I have found that your interrupt vector is named wrong.

This page lists them all: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

There, after some scouring, you can find that for the ATMega16 the RX vector should be named:

    USART_RXC_vect 

After changing the name to that I can see from a decompilation that the ISR gets installed properly in the vector table:

00000000 <__vectors>:
   0:   0c 94 2a 00     jmp 0x54    ; 0x54 <__ctors_end>
   4:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
   8:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
   c:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  10:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  14:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  18:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  1c:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  20:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  24:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  28:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  2c:   0c 94 5c 00     jmp 0xb8    ; 0xb8 <__vector_11>   // <-- ISR
  30:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  34:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  38:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  3c:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  40:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  44:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  48:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  4c:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  50:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>

... which it didn't before.

Related Topic