Hallo zusammen, ich bin neu auf dem Gebiet der Mikrocontroller-Programmierung und hätte da eine Frage bezüglich der Auswertung eines seriellen Strings. Ich möchte gerne einen 116 langen String (9600 bps, 1 Stoppbit, keine Parität) auf ein bestimmtes Zeichen untersuchen. Wenn es 10mal detektiert wurde, soll eine LED aufblinken. Allerdings klappt gar nichts! Ich programmiere in C. Als Entwicklungsboard verwende ich das Arduino Mega (Atmega 2560). Es treten zwar keine Fehlermeldungen beim kompilieren auf, allerdings blinkt die LED nicht. Ich würde mich freuen, wenn mir jemand weiterhelfen könnte oder zumindest einen Tipp geben könnte. VG, Bernd #include <avr/io.h> #include <util/delay.h> #define FOSC 16000000 #define BAUD 9600 #define UBRR_VAL (FOSC/16/BAUD-1) void USART_INIT (unsigned int UBRR){ UBRR0H = (unsigned char)(UBRR>>8); UBRR0L = (unsigned char)(UBRR); UCSR0B =(1 << RXEN0) | (1 << TXEN0); UCSR0C =(1<< UCSZ01) | (1 << UCSZ00); } unsigned char GET_CHAR(void){ while (!(UCSR0A & (1<<RXC0))); return UDR0; } void main(void) { unsigned char c; int counter=0; DDRB=0xFF; while( 1 ) { c = GET_CHAR(); if(c==0x04) counter++; if(counter==10){ _delay_ms(300); PORTB=0xFF; _delay_ms(1500); PORTB=0x00; _delay_ms(300); counter=0; } }
Wird die Funktion USART_INIT() auch irgendwo aufgerufen?
Ufff, die hatte ich ganz vergessen abzutippen. Es klappt leider nicht!!! Soweit müsste doch alles passen, oder? VG #include <avr/io.h> #include <util/delay.h> #define FOSC 16000000 #define BAUD 9600 #define UBRR_VAL (FOSC/16/BAUD-1) void USART_INIT (unsigned int UBRR){ UBRR0H = (unsigned char)(UBRR>>8); UBRR0L = (unsigned char)(UBRR); UCSR0B =(1 << RXEN0) | (1 << TXEN0); UCSR0C =(1<< UCSZ01) | (1 << UCSZ00); } unsigned char GET_CHAR(void){ while (!(UCSR0A & (1<<RXC0))); return UDR0; } void main(void) { USART_INIT(UBRR_VAL); unsigned char c; int counter=0; DDRB=0xFF; while( 1 ) { c = GET_CHAR(); if(c==0x04) counter++; if(counter==10){ _delay_ms(300); PORTB=0xFF; _delay_ms(1500); PORTB=0x00; _delay_ms(300); counter=0; } } }
Bernd schrieb: > Es treten zwar keine Fehlermeldungen beim > kompilieren auf, allerdings blinkt die LED nicht. Hast du überhaupt mal das allereinfachste gemacht: Ein Zeichen an den PC senden? Ein Zeichen vom PC empfangen und irgendwie darstellen? So etwa:
1 | while( 1 ) { |
2 | PORTB = GET_CHAR(); |
3 | }
|
Erst wenn du sicher 1 Zeichen empfangen kannst, macht es Sinn, auch die nachfolgenden 115 Zeichen zu verarbeiten...
Hast Du mal ein anderes Zeichen probiert. ^D ist das Datei-Ende Zeichen. Ich weiß jetzt nicht, ob das von Deinem Terminal-Programm gesondert behandelt wird? Oder anders: Mit welcher Hard-/Software schickst Du den String zu deinem Mikrocontroller? (PC und Terminal-Programm?)
ich weiss nicht, ob es dir hilft, aber ich hab mal ein lib fuer meinen avr mega32 geschrieben. ich haenge die datei einmal an (: mfg
Hallo zusammen, vielen Dank für eure Antworten. ich hab mal das Board ausgetauscht und es funktioniert nun. Trotzdem Danke nochmal!
Hallo ich bins nochmal! Ich kann nun den String mit einer Reihe von if-Anweisungen auf bestimmte Zeichen untersuchen und die LED-Blinken lassen. Nun möchte ich aber an das Gerät, von dem ich die Daten abgreife bei einer bestimmten Anzahl an detektierten Zeichen einen Befehl senden. Ich verwende die oben erwähnte UART-Initialisierung. Allerdings klappt es nicht, einen Befehl zu senden. Außerhalb der while-Schleife funktioniert es problemlos. Muss ich hier mit Interrupts arbeiten?!
Nee, dass müsste auch in ner while-Schleife funktionieren. Die arbeitet ja immer die einzelnen Befehle nacheinander ab, also auch das Versenden des Befehls an dein Gerät...Gruß
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.