Atmega 328 uart program: error del compilador en una variable no declarada en el nombre del registro que termina con "n"

3

Estoy intentando que el atmega328 se comunique a través del puerto serie con mi PC. Estoy usando hiperterminal para devolver las entradas de caracteres del teclado. Estoy usando el chip max3232 para comunicarme con la computadora.

Cuando intento compilar da un error y dice que las variables en esta función no están declaradas, pero no son variables sino asignaciones de registro de datos.

Si sustituyo el carácter 'n' en las asignaciones de registro a un número que compilará y programará, pero no se muestra información en el hiperterminio.

¿Qué debería ser la 'n' también?

Mi RX está en el pin 2 y TX en el pin 3, si eso ayuda. Se está programando porque he hecho los programas de luz intermitente.

unsigned char USARTReadChar( void )
{
   //Wait untill a data is available

   while(!(UCSRnA & (1<<RXCn)))
   {
      //Do nothing
   }

   //Now USART has got data from host
   //and is available is buffer

   return UDRn;
}

EL CÓDIGO DE FUENTE ENTERO

#define FOSC 1843200 // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1

//This function is used to initialize the USART
//at a given UBRR value
void USARTInit(unsigned int ubrr)
{

   //Set Baud rate

    UBRR0H = (ubrr>>8);
    UBRR0L = ubrr;




   //Enable The receiver and transmitter
 UCSR0B = (1<<RXEN0)|(1<<TXEN0);
 // Set fram format: 8data 2stopBit
 UCSR0C = (1<<USBS0)|(3<<UCSZ00);


}


//This function is used to read the available data
//from USART. This function will wait untill data is
//available.
unsigned char USARTReadChar( void )
{
   //Wait untill a data is available

   while(!(UCSR0A & (1<<RXC0)))
   {
      //Do nothing
   }

   //Now USART has got data from host
   //and is available is buffer

   return UDR0;
}


//This fuction writes the given "data" to
//the USART which then transmit it via TX line
void USARTWriteChar(unsigned char data)
{
   //Wait untill the transmitter is ready

   while(!(UCSR0A & (1<<UDRE0)))
   {
      //Do nothing
          PORTD ^= 1 << PINB2;

   }

   //Now write the data to USART buffer

   UDR0 = data;
}

int main(void)
{
DDRB |= 1 << PINB2;

   //Varriable Declaration
   char data;


   USARTInit(MYUBRR);   

  //Loop forever

   while(1)
   {
      //Read data
       data = USARTReadChar();

      /* Now send the same data but but surround it in
      square bracket. For example if user sent 'a' our
      system will echo back '[a]'.

      */

      USARTWriteChar('[');
      USARTWriteChar(data);
      USARTWriteChar(']');

  }
}
    
pregunta Cjueden

2 respuestas

9

La 'n' está destinada a ser un marcador de posición para el periférico UART real que desea utilizar cuando se analiza el conjunto de registros asociados con los UART.

Entonces, si tuviera dos UART, podría leer el registro de estado del primer UART reemplazándolo con un '0' o el segundo UART con un '1' como: UCSR0A o UCSR1A - tenga en cuenta que estos dos son #define 'd para usted en un archivo de definición de registro. Dado que solo usamos la convención UCSRnA para cuando nos referimos a estos registros en discusión , no será #define 'd a un registro y, por lo tanto, usarlo en el código generará un error. Puede seguir sus declaraciones #include para encontrar dónde están definidas. El archivo de definición de registro y la hoja de datos suelen ser dos cosas que tengo a mano cuando trabajo.

El ATmega328 solo tiene un periférico UART, pero sigue la misma convención de nomenclatura. Por lo tanto, debería reemplazarlo con un 0. En cuanto a poder leer / escribir en un puerto serie, suponiendo que haya conectado su MAX232 correctamente, ¿ha configurado correctamente su velocidad de transmisión tanto en la ATmega como en la PC? Publique el resto de su código de inicialización de UART si desea más ayuda para depurar eso.

EDIT: resumen de los comentarios de seguimiento.

  1. Verifique su frecuencia de reloj y asegúrese de que sea correcta cuando calculando el valor del registro en baudios
  2. Asegúrese de que tanto uC como PC tengan la misma configuración de UART (baudios, paridad, bits de detención)
  3. Trate de no utilizar ejemplos de código aleatorios que puedan o no ser válidos para su configuración de hardware.
respondido por el Jon L
1

Cuando veo el "las variables en esta función no están declaradas" mensaje, a menudo significa que no he incluido ni vinculado alguna biblioteca que intento utilizar - En este caso, tal vez la biblioteca que define. TXEN0, RXEN0, UCSR0A, UBRR0H , etc.

Parece que hay dos formas populares de implementar la comunicación en serie con el ATmega328: "Control de bajo nivel" usando el compilador gcc, que generalmente requiere la línea a b c d

#include <avr/io.h>

en algún lugar de su código que implemente las funciones de "enviar" y "recibir" de lecturas y escrituras de registros individuales.

"Control de alto nivel" (también utilizando el compilador gcc) implica el uso de bibliotecas escritas previamente por otra persona que implementa las funciones "enviar" y "recibir" de las lecturas y escrituras de registros individuales, como la biblioteca "Serial" de Arduino a b . (Su implementación a b ya tiene" #include <avr/io.h> ", por lo que las personas que usan no tiene que escribir esa línea de nuevo.)

    
respondido por el davidcary

Lea otras preguntas en las etiquetas