UART:Probleme mit dem Zählen von Zeichen

Gast #2077859
Lesenswert?

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;
}
}
Gast #2077879
Lesenswert?

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;
}
}
}
Moderator (Firma: Titel) Persönliche Seite #2077888
Lesenswert?

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...
Gast #2077899
Lesenswert?

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?)
Gast #2079553
Lesenswert?

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?!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren