mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART INTERRUPT ATMEGA328


Autor: René Heller (Firma: privat) (reneheller1981)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Sauger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ISR(USART_RX_vect,ISR_BLOCK)
{
...

MfG

Autor: besucher (Gast)
Datum:

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

ISR(USART_RX_vect)
{
   ...
}

Autor: René Heller (Firma: privat) (reneheller1981)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sauger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: René Heller (Firma: privat) (reneheller1981)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sauger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: René Heller (Firma: privat) (reneheller1981)
Datum:

Bewertung
0 lesenswert
nicht 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é

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.