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
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.
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.