Forum: Mikrocontroller und Digitale Elektronik AT90CAN128 empfangen serieller Daten über USART1


von Duu (Gast)


Lesenswert?

Hallo,

ich möchte bei meinem Controller Daten von der USART1 empfangen. Bei 
einem Hexwert von 0x01 soll eine LED am Port G eingeschaltet werden und 
mit dem Wert 0x00 wieder aus. Das folgende Programm habe ich aus 
mehreren Teilen im Internet und Datenblatt zusammengesucht und würde mal 
nachfragen, ob ich das so richtig gemacht habe oder ob irgendwo ein 
Fehler enthalten ist.

#include <avr/io.h>
#include <avr/interrupt.h>
#define LEDPORT DDRG |= (1<<PG1)
#define LEDON PORTG |= (1<<PG1)
#define LEDOFF PORTG &= ~(1<<PG1)
#define F_CPU 8000000

volatile uint8_t toggle;

void InitUart (void){
  uint16_t ubrr;
  ubrr = ((F_CPU/(9600L*16L))-1);
  UBRR1H = (unsigned char)(ubrr>>8);
  UBRR1L = (unsigned char) ubrr;
  UCSR1B = (1<<RXEN1)|(1<<TXEN1);
  UCSR1C = (0<<UMSEL1) | (0<<UPM1) | (1<<USBS1) | (3<<UCSZ1);
}

int main ()
{
  sei();
  InitUart ();

  while(1)
  {
    unsigned char  USART1_Receive (void)
    {
      /*Wait for data to be received*/
      while( ! (UCSR1A & (1<<RXC1)));
      /*Get and return received data from buffer*/
      return UDR1;
    }

    if (UDR1 == 0x01)
    {
      LEDON;
    }

    if (UDR1 == 0x00)
    {
      LEDOFF;
    }
  }
  return 0;
}

ISR (TIMER1_COMPA_vect){
  toggle = 1;
}

von holger (Gast)


Lesenswert?

>zusammengesucht

Das ist wohl der Knackpunkt. Nur programmieren kannst du nicht.

Eine Funktion in main anlegen?
Wohl keine gute Idee.

    unsigned char  USART1_Receive (void)
    {
    }

Und hör auf dauernd UDR1 auszulesen. Damit
verhinderst du das überhaupt was empfangen wird.

von Duu (Gast)


Lesenswert?

Ja, das mag ich so an diesem Forum. Erste Behauptung: Man kann nicht 
programmieren. Hab ich ja auch gar nicht behauptet. Ist ja nicht so, das 
ich einen fertigen Code 1 zu 1 übernommen habe oder einen fertigen Code 
wünsche. Ich habe mich schon mit dem Datenblatt, dem Controller und auch 
mit der Schnittstelle auseinander gesetzt.

Meine Frage war nur, och ich das so richtig gemacht habe. Gut, die 
Funktion habe ich nun aus der main geworfen. Aber ein kleines Feedback 
zur Initialisierung z. B. wäre schön oder warum wird verhindert Daten zu 
empfangen, wenn ich ständig UDR1 abfrage.

von Marc S. (marc_s86)


Lesenswert?

Duu schrieb:
> Meine Frage war nur, och ich das so richtig gemacht habe. Gut, die
> Funktion habe ich nun aus der main geworfen. Aber ein kleines Feedback
> zur Initialisierung z. B. wäre schön oder warum wird verhindert Daten zu
> empfangen, wenn ich ständig UDR1 abfrage.

nein du hast es falsch gemacht.





falls du mehr wissen willst: mach es so:
1. Lerne C
2. Kompiliere deinen Code, übertrage ihn auf den microcontroller
2.1 kompiliert dein code nicht gehe zu 1.
3. schau ob er tut was du willst
3.1 wenn ja hast du es richtig gemacht
3.2 wenn nein nicht. dann kannst du nachfragen.

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.