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); }
René Heller schrieb: > ISR(USART_RXC_VECT) > { > unsigned char b; > b=UDR0; > dummy = 1; > } ISR(USART_RX_vect) { ... }
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é
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
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
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!
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.