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


von flea (Gast)


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

von Karl H. (kbuchegg)


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;

von Falk B. (falk)


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.

1
int main(void)
2
{
3
  DDRA = 0x00;
4
  DDRB = 0xFF;
5
  PORTB = 0xFF;
6
  DDRD = (0<<PD2)|(1<<PD1)|(0<<PD0);
7
8
  UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
9
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);
10
11
    UBRRL = 51;    //Baudrate 9600 bei f_cpu = 8MHz
12
13
  sei();
14
15
  while(1)
16
  {
17
  };
18
}
19
20
ISR(USART_RXC_vect)
21
{
22
  uint8_t received_byte = UDR;
23
  PORTB = received_byte;
24
  UDR = received_byte;
25
};


MFG
Falk

von Falk B. (falk)


Lesenswert?

Mist, zu langsam ;-)

von flea (Gast)


Lesenswert?

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

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.