PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit dem USART...



Mnemonic82
22.05.2010, 13:59
Hi...

Bin gerade dabei mithilfe des rncontrol1.4 das empfangene DCF-Signal einer FUM-DCF von HKW Elektronik aus einem LCD auszugeben. Die Ansteuerung des LCD´s funktioniert einwandfrei. Wenn ich aber versuche über den USART das Zeitsignal einzulesen sind auf dem LCD nur zwei schwarze Baken zu sehn.
Das Display ist ein 16x4, wie gesagt mit nem anderen Programm funzt die Anzeige perfekt.

Die USART Einstellungen sollten wie folgt sein:
300 Baud
7 Datenbits
gerade Parität
2 Stoppbits

Hier mal der Teil des Codes wo ich versuche das Signal einzulesen:



#include <avr/io.h>
#include <inttypes.h>
#include "lcd.h"

// Sollte schon im Makefile definiert sein.
// In dem Fall hier einfach löschen.
//#define F_CPU 16000000UL

#define BAUD 300UL
#define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)

// USART initialisieren
void uart_init(void)
{
// Baudrate einstellen (Normaler Modus)
UBRRH = (uint8_t) (UBRR_BAUD>>8);
UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

// Aktivieren von receiver
UCSRB = (1<<RXEN);

// Einstellen des Datenformats:
UCSRC = (1<<URSEL)|(1<<UPM1)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
}

int main(void)
{
uint16_t buffer;

// USART initialisieren
uart_init();

while (1)
{
// Warten bis Daten empfangen wurden
while ( !(UCSRA & (1<<RXC)) )
// Empfangsregister auslesen
buffer = UDR;


while(1)
{
//lcd initialisieren
lcd_init();

//Buffer auf dem lcd ausfegeb
sprintf( buffer,"Time: %02d,UDR");

set_cursor(1,1);

lcd_string(UDR);

}


}
}


Wird wohl an dem String liegen den das Modul rausgibt...

Würde mich über Tipps und Hinweise freuen

Gruss Mnemonic

Hubert.G
22.05.2010, 22:55
Wenn das Display zwei schwarze Balken zeigt, dann wird es nicht initialisiert.
Du bleibst wahrscheinlich schon in der Empfangsroutine stecken.

Jaecko
22.05.2010, 23:04
Tip nebenbei: ein LCD initialisiert man normalerweise nur 1x. Bei jedem Schleifendurchlauf isses unnötig.

Mnemonic82
27.05.2010, 07:33
Erstmal danke für die Hinweise.

Abgesehen davon das da klammern fehlen bei den While-schleifen, kann es sein das man die Empfangsroutine nicht in einer endlosschlefe machen sollte, weil das Programm sonst gar nicht bis zur lcd-routine kommt?

Gruss Mnemonic

robo_tom_24
18.05.2012, 10:59
Hallo
Ja das ist richtig, sonst empängst du nur ein mal Daten vom USART und dann tust du "endlos" LCD initialisieren, somit löschen, Daten ausgeben, aber gliech danach wieder löschen
Und wie Jaecko bereits gesagt hat, man braucht das LCD nur ein mal initialisieren. Ich mach das alles immer gleich am Programmanfang damit mans nicht vergisst ;)