Forum: Mikrocontroller und Digitale Elektronik ATmega32 UART Empfang im Interrupt


von Alsastro (Gast)


Lesenswert?

Hallo liebe Forenuser,
Ich wende mich an euch weil ich im Moment ein bißchen verzweifel.
Habe ein Programm welches zum Test der UART gedacht ist damit ich nur 
sehen kann ob es als Interrupt läuft und ich daten empfange.
Hier das Programm:

#define F_CPU 16000000UL     // µC Frequenz
#define USART_RXC_vect      _VECTOR(14)
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
    // Baudrate einstellen (Normaler Modus)
    UBRRH = 0x00;
    UBRRL = 0x67;

    // Aktivieren des Empfängers, des Senders und des "Daten 
empfangen"-Interrupts
    UCSRB |= (1<<RXCIE | 1<<RXEN);

    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    UCSRC |= (1<<URSEL | 1<<UCSZ1 | 1<<UCSZ0);

  DDRB |= (1<<DDB0 | 1<<DDB1);            //PB0 und PB1 = Ausgang

  sei();    //Global Interrupt Enable Bit im StaturRegister setzen
  while (1)
  {
    //LED blinken
    PORTB |= (1<<PORTB1);
    _delay_ms(100);
    PORTB &= ~(1<<PORTB1);
    _delay_ms(100);
  }
  return(0);
}

  ISR(USART_RXC_vect)
  {
    PORTB |= (1<<PORTB0);
    PORTB &= ~(1<<PORTB0);
  }


Mein Problem ist jetzt:
Das Programm läuft und die LED PORTB1 blint schnell.
Wenn ich daten über die RS232 schicke merkt man das der Interrupt 
aufgerufen wird. LED PORTB0 ist sehr schwach an.
Jetzt das komische. Die LED PORT0 bleibt schwach an und LED PORTB1 
blinkt mindestens um die hälfte langsamer.
Wie kann das sein?
Ich habe das gefühl das der µC jetzt immer in den Interrupt springt,
obwohl er keine daten mehr empfängt.
Kann mir einer helfen?

Danke.
MFG Alsastro

von 900ss (900ss)


Lesenswert?

Alsastro schrieb:
> Ich habe das gefühl das der µC jetzt immer in den Interrupt springt,

Stimmt. Der UART-Interrupt wird nie zurückgesetzt. Das erreichst du 
indem du das Datenregister im UART ausließt.

Die Steuerung deiner beiden LEDs an PB0/1 beeinflussen sich auch 
gegenseitig.

PORTB |= (1<<PORTB1);
heißt ja:
PORTB = PORTB | (1<<PORTB1);

D.h. PORTB in ein Register gelesen, modifiziert und dann 
zurückgeschrieben.
Wenn jetzt der Port in deiner Hauptschleife gerade gelesen wurde und 
dann der Interrupt auftritt, dann überlege mal, was passiert mit den 
beiden Bits für deine LEDs.

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe das gefühl das der µC jetzt immer in den Interrupt springt,
>obwohl er keine daten mehr empfängt.

Das Gefühl trügt nicht

Datenblatt:

When interrupt-driven data reception is used, the receive complete 
routine
must read the received data from UDR in order to clear the RXC Flag, 
otherwise a new interrupt
will occur once the interrupt routine terminates.

MfG Spess

von Alsastro (Gast)


Lesenswert?

Hey Leute,
danke für die Schnelle Antwort.
Es läuft jetzt wie gewollt wenn ich im Interrupt UDR auslese.
Also war das nur so nen ding das das Flag gesetzt bleibt.
Auf dieser Basis kann ich jetzt weiler Programmieren.
Danke!!

Ach wenn ich schonmal hier bin: Kenn einer ein PC programm woomit ich 
Hex-werte (8Bit) über eine RS232 an einen µC schicken kann?
Terminal v1.9b habe ich nur da weiß ich nicht genau ob der das in Hex 
oder was anderes schickt. Also das was ich beim senden eintrage.

Danke nochmal.
MFG Alsastro

von spess53 (Gast)


Lesenswert?

Hi

Such mal nach HTerm.

MfG Spess

von Blödmann (Gast)


Lesenswert?

HTerm

Aber ein kleiner Hinweis: Gespeichert und gesendet werden immer 
Binärwerte die organisatorisch zu Gruppen von 8, 16, 32 etc 
zusammengefasst werden und dann als Byte, integer, long etc. bezeichnet 
werden.

Die Bezeichnungen "Dezimal", "Hexadezimal", "ASCII" usw. bezeichnen 
"Interpretationen" dieser Gruppen von Binärwerten.

Was Du also suchst, ist ein Terminalprogramm, das Bytes nicht nur als 
ASCII-Zeichen sondern auch als Hexadezimalzahl interpretiert und auch 
solche Eingaben entgegennimmt.

von Alsastro (Gast)


Lesenswert?

Danke für die Hilfe.
genau sowas wollte ich!
Das hat mir sehr weitergeholfen.
Bis dann
MFG Alsastro

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.