Forum: Mikrocontroller und Digitale Elektronik UART:Probleme mit dem Zählen von Zeichen


von Bernd (Gast)


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;
}
}

von bitte löschen (Gast)


Lesenswert?

Wird die Funktion USART_INIT() auch irgendwo aufgerufen?

von Thomas E. (thomase)


Lesenswert?

Die USART_INIT wird nicht ausgeführt.

mfg.

von Bernd (Gast)


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;
}
}
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von bitte löschen (Gast)


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

von Fabian K. (fabian_k)


Angehängte Dateien:

Lesenswert?

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

von Bernd (Gast)


Lesenswert?

Hallo zusammen,
vielen Dank für eure Antworten.
ich hab mal das Board ausgetauscht und es funktioniert nun. Trotzdem 
Danke nochmal!

von Bernd (Gast)


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

von Axel S. (Gast)


Lesenswert?

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