Hallo, Habe ein Problem mit dem UART Interrupt, er löst einfach nicht aus :) Muss ich da noch irgendwas beachten? #include <avr/interrupt.h> #include <avr/iom32.h> ISR (USART_RXC_vect) { PORTA = 0x55; } So sieht die Interruptroutine aus. Der µC empfängt auch definitiv Zeichen (ich sende Sie als Echo wieder an den PC zurück).. aber PORTA reagiert einfach nicht (ja, er ist als Ausgang geschaltet). Wo steckt der Anfängerfehler? M f G Sebastian
> Wo steckt der Anfängerfehler? Darin, dass du uns nichtssagende Codeschnipsel zeigst anstatt das richtige Program. > ich sende Sie als Echo wieder an den PC zurück Mit dem oben gezeigten definitiv nicht. Wenn du am PC siehst was du tippst, dann hast du wahrscheinlich das lokale Echo am PC aktivierst. Wenn dem so ist, dann sagt das überhaupt nichts darüber aus, ob der µC die Zeichen empfängt oder nicht. Ergo: Poste dein Program und nicht irgendwelche Codeschnipsel die so ähnlich aussehen wie dein Program. Du gehst ja auch selber zum Artz und schickst nicht deinen Bruder. Auch wenn der so ähnlich aussieht wie du.
#define F_CPU 4336180 #define UART_BAUD 9600 #include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> #include <avr/iom32.h> ISR (USART_RXC_vect) { PORTA = 0x55; } void usart_init(void) { UBRRH = 0; // Highbyte ist 0 UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1; UCSRB |= ( 1 << TXEN )|( 1 << RXEN); // UART TX einschalten UCSRC |= ( 1 << URSEL )|( 1<<UCSZ0 )|( 1<<UCSZ1 )|( 0<<UCSZ2 ); // Asynchron 8N1 DDRA = 0xff; } int main (void) { char a; usart_init (); sei(); for (;;) { while (!(UCSRA & (1<<RXC))); a = UDR; if (a == 'a') //wenn 'a' dann PORTA = 03h { PORTA = 0x03; } if (a == 'b') //wenn 'b' dann PORTA = 00h { PORTA = 0x00; } while (!(UCSRA & (1<<UDRE))); UDR = a; } } So sieht das ganze Programm aus. Es ist kein lokales Echo am PC was ich da empfange... Noch was: wenn ich ein Programm auf den µC lade scheint es erstmal nicht zu laufen. Dann lese ich mit PonyProg die Config. Bits aus und es läuft. auch nach Abschalten der Betriebsspannung ist alles OK.. nur muss ich halt einmal nach dem Brennen diese Bits auslesen um ihn anzustoßen. Sebastian
Das Echo machst du hier "händisch" in der main()
1 | while (!(UCSRA & (1<<UDRE))); |
2 | UDR = a; |
Wenn die Interruptroutine zum Zug kommen soll, musst du die auch anschalten. Dazu gibt es das Flag RXCIE im UART Register UCR bzw. UCSRB auf deinem Atmega32 http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Der_UART http://derjulian.net/pages/mikrocontroller/?page=mikrocontroller#usart Wenn die Interruptroutine dann arbeitet, werden mit 0x55 bestimmte Pins an PORTA (der auf Ausgang geschaltet ist s. DDRA = 0xFF) auf HIGH andere auf LOW gelegt. Möglicherweise zum Debuggen mit LEDs...
Vielen Dank, Stefan.. habe gar nicht gewusst, dass es ein RXCIE Bit gibt... bin davon ausgegangen, dass man nur den globalen Interrupt freigeben muss. Klappt nun alles!(Außer dass er irgendwie nicht von alleine anläuft nach dem Brennen). M f G Sebastian
Wie äussert sich das bzw. was musst du machen, damit der µC losläuft? Wenn du z.B. den ISP abziehen musst, tippe ich, dass es etwas mit dem /RESET oder einer schwachbrüstigen Spannungsversorgung zu tun hat. Macht es beim Losstarten nach ISP einen Unterschied, ob du den RS232 Stecker dran hast oder nicht? Für genaueres Spekulationen ;-) müsste man halt mehr zur Hardware wissen.
Hi, man, hier wird man ja richtig geholfen :) Wenn ich den ISP Stecker abziehe klappts. Ich tausch mal C, der den Resetpin auf Masse zieht beim Einschalten. Die Spannungsversorgung besteht aus einem "normalen" stabilisierten 12V Steckernetzteil (1A). Auf der µC Platine ist dann nochmal ein 7805 und ein 22µF. Hat bisher auch nie Probleme gemacht. M f G Sebastian
> Wenn ich den ISP Stecker abziehe klappts. Ich tausch mal C, der den > Resetpin auf Masse zieht beim Einschalten. Du verwendest nicht zufällig Windows XP und einen selbst gebauten 3 Widerstand-Programmer am Parallel-Port? Das hab ich auch. Allerdings ist es definitiv Windows, dass sich nach ein paar Sekunden von PonyProg die parallele Schnitt- stelle wieder holt und dabei den µC auf RESET zieht. Ist ne zeitlang lästig. Zumindest solange, bis ich einen Bootloader in den µC gebrannt hatte. Seitdem kümmert es mich nicht mehr.
Hm, selbstgebaut habe ich da nichts, aber besonders aufwendig siehts nicht aus (74244, 1C, 1 Diode, 1 R). Ja, habe XP, ja es hängt am Parallelport. Was ist denn ein Bootloader genau? Werde mal die Suche bemühen. Sebastian
> nicht aus (74244, 1C, 1 Diode, 1 R). > Ja, habe XP, ja es hängt am Parallelport. Könnte dasselbe Problem sein. Kannst ja mal nachmessen. Nach dem brennen dauerts bei mir so 3 bis 4 Sekunden. Dann zieht XP den Reset Pin auf 0. Lässt sich mit einem Voltmeter wunderbar nachmessen. Bootloader: Ich verwende den von PeDa aus der Codesammlung. Kurz gesagt: Das ist ein Pgm dass du auf herkömmlichen weg in den µC brennst. Dann noch ein paar Fuse-Bits umstellen. Das Pgm wartet nach einem Controller Reset ein bischen, ob über die Serielle Schnittstelle etwas hereinkommt. Wenn ja (und wenn die Kennung stimmt) wird das was herein kommt als Programm aufgefasst und ins Flash-RAM geschrieben. Das ist im Grunde das, was auf µC Seite passiert. Auf PC Seite gibt es ein Programm, dass dein µC Programm über die Serielle Schnittstelle verschickt. Der Ablauf ist dann so: PC und µC über die ganz normale serielle Schnittstelle verbinden. Am PC wird das Übertragungspgm mit den entsprechenden Parametern gestartet. Den µC resetten (entweder Taster oder Strom aus/Strom ein) und schon überspielt der PC das Pgm zum µC. Fertig. Eine eigene Brennhardware ist nicht mehr notwendig.
Hallo, Das Reset Problem hat sich erübrigt. Muss nur auf den gelben Pfeil in Pony Prog clicken, dann läufts an... M f G Sebastian
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.