www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Über UART empfangener Wert mit LEDs darstellen


Autor: flea (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe das STK500 und probiere gerade mit dem UART rum.
Dabie will ich über HyperTerminal ein Zeichen an den Atmega8 schicken. 
Dieses Zeichen soll auf PORTB dargestellt werden. Die LEDs flackern 
dabei aber immer nur ganz kurz (aber der richtige Wert!). Wieso bleiben 
die LEDs nicht an? Ich weise doch dem PORTB das Register UDB zu?!?
Das Zeichen kommt mit Sicherheit richtig an, wenn ich es zurückschicke, 
erscheint es richtig im HyperTerminal-Fenster!

Hier mein Code (die relevanten Stellen):

int main(void)
{
  DDRA = 0x00;
  DDRB = 0xFF;
  PORTB = 0xFF;
  DDRD = (0<<PD2)|(1<<PD1)|(0<<PD0);

  UCSRB |= (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);

    UBRRL = 51;    //Baudrate 9600 bei f_cpu = 8MHz

  sei();

  while(1)
  {
  };
}

ISR(USART_RXC_vect)
{
  uint8_t received_byte = UDR;
  PORTB = received_byte;
  UDR = received_byte;
};



Danke schonmal im Voraus,

Gruß Flea

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
flea wrote:
>
>   UCSRB |= (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);

                        **********

Wenn du einen Interrupt erlaubst, solltest du auch einen
Handler dazu haben.
Hast du den nicht, sorgt gcc dafür, dass der µC statt dessen
resettet wird.
Reset ->  PORTB = 0xFF;

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ flea (Gast)

>dabei aber immer nur ganz kurz (aber der richtige Wert!). Wieso bleiben
>die LEDs nicht an? Ich weise doch dem PORTB das Register UDB zu?!?

Du aktivierst den TXC Interrupt. Wozu? Hast du auch einen 
Interrupthandler dafür? Wenn nicht, macht dein AVR jedes mal einen 
Reset, wenn ein Zeichen gesendet wurde! Versuch es mal ohne TXCIE.

int main(void)
{
  DDRA = 0x00;
  DDRB = 0xFF;
  PORTB = 0xFF;
  DDRD = (0<<PD2)|(1<<PD1)|(0<<PD0);

  UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);

    UBRRL = 51;    //Baudrate 9600 bei f_cpu = 8MHz

  sei();

  while(1)
  {
  };
}

ISR(USART_RXC_vect)
{
  uint8_t received_byte = UDR;
  PORTB = received_byte;
  UDR = received_byte;
};


MFG
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist, zu langsam ;-)

Autor: flea (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, den TX-INterrupt hatte ich zuvor bei anderen Experimenten 
verwendet.
Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.