Forum: Mikrocontroller und Digitale Elektronik USART INTERRUPT ATMEGA328


von René H. (Firma: privat) (reneheller1981)


Lesenswert?

Hallo,

Ich bin ein wenig am verzweifeln, wie ich mit dem USART meines ATMEGA328 
einen Interrupt auslösen kann.

Ich betreibe den ATMEGA328 mit einem 16MHz-Quarz.

Der Controller sitzt auf einem ARDUINO Duemilanove Board und hat einen 
vorkonfigurierten Arduino-Bootloader.

Die Hardware passt definitiv, denn wenn ich die "Hauseigenen" Makros aus 
der Arduino Programmierung benutze (Serial.begin, Serial.available, 
Serial.read, usw.) funktioniert die Kommunikation zwischen µC und 
Terminal in beide Richtungen tadellos.

Nun möchte ich aber selbst Kontrolle über den USART haben (und lernen) 
und immer wenn ein Byte am Controller ankommt soll ein Interrupt 
ausgelöst werden.

Leider bekomme ich das nicht hin :-/

Ich habe wirklich MEHRMALS das hier angebotene URAT-Tutorial 
durchgelesen (Super geschrieben!) und ich denke, dass ich es auch 
verstanden habe. Zudem habe ich mir das ATMEL-Datenblatt hergenommen und 
überprüft, ob alle Bezeichnungen und Adressen der Register wirklich 
stimmen. Nur will der Interrupt einfach nicht auslösen.

Um zu testen habe ich mir ein Prog. geschrieben, bei dem in der ISR 
einfach eine Test-LED eingeschaltet wird. Aber das Ding leuchtet einfach 
nicht, egal wie viele Bytes ich auch zum Controller schicke.

Ich hoffe mir kann jemand helfen!

Besten Dank im Voraus:

René

Hier der Code:


volatile byte dummy = 0;

void uart_init(void)
{
  UCSR0B |= (1<<RXEN0)  | (1<<TXEN0) | (1<<RXCIE0);    // UART RX, TX 
und RX Interrupt einschalten
  UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00)             ;    // Asynchron 8N1

  UBRR0H = 0;
  UBRR0L = 103; //Baud Rate 9600
}


ISR(USART_RXC_VECT)
{
  unsigned char b;
  b=UDR0;
  dummy = 1;
}

void setup()
{
  uart_init;
  pinMode(13, OUTPUT);
  sei();
}

void loop()
{
  if (dummy == 1) {digitalWrite(13, HIGH);}
  delay(20);
}

von Sauger (Gast)


Lesenswert?

Moin,

ISR(USART_RX_vect,ISR_BLOCK)
{
...

MfG

von besucher (Gast)


Lesenswert?

René Heller schrieb:
> ISR(USART_RXC_VECT)
> {
>   unsigned char b;
>   b=UDR0;
>   dummy = 1;
> }

ISR(USART_RX_vect)
{
   ...
}

von René H. (Firma: privat) (reneheller1981)


Lesenswert?

Hallo und vielen Dank für die super schnelle Antwort!!

Leider wurde das Problem damit nicht behoben!

Nur zum Lernen: Was macht ISR_BLOCK ??

LG,

René

von gerd (Gast)


Lesenswert?

Vielleicht habe ich das in der unformatierten Brühe jetzt nur überlesen, 
aber führst du auch irgendwo mal deine setup()-Routine aus?

Deine main-Funktion hast du ja geschickterweise ausgelassen.

- gerd

von Sauger (Gast)


Lesenswert?


von gerd (Gast)


Lesenswert?

René Heller schrieb:
> Nur zum Lernen: Was macht ISR_BLOCK ??

Bedeutet nur, das während die ISR läuft keine weiteren Interrupts 
zugelassen werden. Ist aber ziemlich über, da das das Standard-Setting 
einer ISR ist. Ist in diesem Fall nur "leichter lesebarer Code". Das 
Gegenteil (und in bestimmten Fällen gefärhlicher) ist das NO_BLOCK - 
dann können innerhalb einer ISR weitere Interrupts auftreten und 
bearbeitet werden.

- gerd

von René H. (Firma: privat) (reneheller1981)


Lesenswert?

Hallo Gerd,

die ARUINO Entwiklungsumgebung compiliert so, dass zuerst setup() und 
dann loop() ausgeführt wird (wird sicher intern auf eine main() 
umgeschrieben).

Durch deine Frage allerdings habe ich den Fehler gefunden!

Ich habe "uart_init" aufgerufen anstatt "uart_init()" !!!!

Jetzt läuft es !!! :-)))

Manchmal muss man nur die richtige Frage stellen um auf die Antwort zu 
kommen! Besten Dank! Super geiles Forum!


René

PS: Dennoch muss es ja wohl "zufällig" ein Marko in der ARDUINO-IDE 
geben das den Namen uart_init trägt, sonnst hätte der Compiler ja 
gemeckert! :-) Was für ein Zufall!

von gerd (Gast)


Lesenswert?

Kenne mich in den Arduino-Gefilden nicht aus... aber gut möglich das es 
so ist, wie du sagst.

Freut mich geholfen zu haben.

- gerd

von Sauger (Gast)


Lesenswert?

Mahlzeit,

> Nun möchte ich aber selbst Kontrolle über den USART haben (und lernen)
> und immer wenn ein Byte am Controller ankommt soll ein Interrupt
> ausgelöst werden.

René Heller schrieb:
> die ARUINO Entwiklungsumgebung compiliert so, dass zuerst setup() und
> dann loop() ausgeführt wird (wird sicher intern auf eine main()
> umgeschrieben).

dann solltest du auch erwähnen dass auf deinem Zielsystem noch eine 
"Höhere" Ebene mit im Spiel ist. Unter "selbst Kontrolle" verstehe ich 
etwas anderes :-)

MfG

von René H. (Firma: privat) (reneheller1981)


Lesenswert?

Ja das stimmt natürlich!

Aber immer Schritt für Schritt :-)

Der ARDUINO Boot-Loader ist halt dahingehend praktisch, dass man sich 
als Anfänger nicht mit solchen Sachen wie Fuse-Bits, Programmieradapter 
und dergleichen auskennen muss. Man braucht nur 'nen USB-Port und 
Kenntnisse aus C / C++ und sollte wissen wie ein µC arbeitet. Man kann 
also sofort mit seinem eigentlichen Programm anfangen. Volle Kontrolle 
kann man aber durchaus auch ARDUINO bekommen, wenn man eben auf die 
ganzen fertigen Makros verzichtet.

Besten Dank noch einmal,

René

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.