mikrocontroller.net

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


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}
}

Autor: bitte löschen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird die Funktion USART_INIT() auch irgendwo aufgerufen?

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die USART_INIT wird nicht ausgeführt.

mfg.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}
}
}

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
while( 1 ) {
   PORTB = GET_CHAR();
}

Erst wenn du sicher 1 Zeichen empfangen kannst, macht es Sinn, auch die 
nachfolgenden 115 Zeichen zu verarbeiten...

Autor: bitte löschen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?)

Autor: Fabian K. (fabian_k)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd (Gast)
Datum:

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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Axel S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.