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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.