Forum: Mikrocontroller und Digitale Elektronik UART des AT90CAN128 mit WinAvr


von Alex (Gast)


Lesenswert?

Hallo.
Ich möchte mit WinAvr den UART des AT90Can nutzen. Doch alle 
Beispielprogramme, die ich so eintippe machen Fehler. Es kommen dann 
Sachen wie "error: 'UBRRL' undeclared (first use in this function)".
Kann mir einer ein Beispiel für den AT90Can zukommen lassen, mit dem ich 
was anfangen kann oder mir tipps geben, woher meine Fehler rühren?
Bin neu im WinAvr.
Gruß, Alex

von Peter D. (peda)


Lesenswert?

Alex wrote:
> Hallo.
> Ich möchte mit WinAvr den UART des AT90Can nutzen. Doch alle
> Beispielprogramme, die ich so eintippe machen Fehler. Es kommen dann
> Sachen wie "error: 'UBRRL' undeclared (first use in this function)".


Wäre es nicht sinnvoller, sich mal damit zu beschäftigen, wie die UART 
funktioniert, statt nur stupid copy&paste zu machen?

Schau dochmal, für welchen AVR der Beispielcode mit UBRRL gemacht ist.
Dann schau ins Datenblatt, welche Funktion UBRRL hat.

Und dann schau ins Datenblatt Deines AVR, wie dort das Register mit 
derselben Funktion heißen könnte.


Peter

von Alex (Gast)


Lesenswert?

Ja, hast recht.
Bin damit berits zurande gekommen, nachdem ich im datenblatt nachgesehen 
habe.
Problem war, dass der At90Can 2 UARTS hat, die mit 0 und 1 bezeichnet 
werden. Demnach werden die Register auch anders genannt. UBRRH heist 
beispielsweise ubrr0h und ubrr1h für das jeweilige uart. hatte mit 
ubrrh0 etc experimentiert, aber zwecklos.
lesen ist halt doch nicht immer sinnlos!

von Alex (Gast)


Lesenswert?

Hab nun aber ein neues Problem!
Win AVR kompiliert den Code nun Problemlos.
Möchte ich allerdings das Testprogramm bein AVR Studio Simulieren, 
bleibt das Programm hängen, sobald das UCSR0A leer ist.

//---------------------------------------------------------------------- 
---
//USART0 Initialisieren
void USART0_init(void)
{
  //Baudrate einstellen (Normaler Modus)
  UBRR0H = (unsigned char) (UBRR_BAUD>>8);
  UBRR0L = (unsigned char) UBRR_BAUD;
  //Aktivieren von receiver und transmitter
  UCSR0B = (1<<RXEN)|(1<<TXEN);
  //Einstellen des Datenformats: 8Datenbits, 1 Stopbit
  UCSR0C = (0<<UMSEL0)|(0<<UPM0)|(0<<USBS0)|(3<<UCSZ0);
  //Receiver und Transmitter Freigeben
  UCSR0B = (1<<RXEN0) | (1<<TXEN0);
}

//---------------------------------------------------------------------- 
---
//USART0 Übertragen
void USART0_Transmit(unsigned char data)
{
  //Warten auf leeren Transmitbuffer
  while (!(UCSR0A & (1<<UDRE0)))
  {
  }
    //Daten in den  buffer, senden der daten
    UDR0 = data;
}
/----------------------------------------------------------------------- 
--
//---------------------------------------------------------------------- 
---
//Hauptprogramm
int main(void)
{
  unsigned char i;
  //uint8_t buffer;

  USART0_init();

  //Endlosschleife
  while (1)
  {
    PORTB = i++;
----> !!Fehler    while (!(UCSR0A & (1<<UDRE0)))
  {
  }
    //Daten in den  buffer, senden der daten
    UDR0 = 'x';
    //USART0_Transmit("x");
    //i=USART0_Receive();

  }
  return 0;
}

Hat es was mit dem Simulieren zu tun oder mit meinem Programmcode??
Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.