Gast
#841171
Hoffe, es kann mir wer helfen :P
Hab ein MyAvr LPT-Board mit Atmega8. Funktioniert soweit, nur die
serielle Kommunikation haut nicht hin. Wenn ich ein 'a' schicke, wird
ein 'O' am LCD-Display des µC ausgegeben, schicke ich ein 'q' kommt ein
'G' raus, usw.
Hab ein wenig die Ascii-Tabelle durchstudiert und bin auf folgendes
draufgekommen:
'a' entspricht 0110 0001
'O' entspricht 0100 1111
Um also vom Binärcode 'a' nach 'O' zu kommen, muss man das Byte zuerst
invertieren und dann einmal rechts schieben.
'a' --> 'O'
0110 0001 --> 1001 1110 --> 0100 1111
Diese "Umrechnung" funktioniert aber nur bei Zeichen, deren Binärcode
mit einer 1 endet, z.B. 'a', 'c', 'e', ...
Also irgendwo in der Übertragung wird das gesendete Byte verfälscht.
Senden eines Bytes an den PC funktioniert gar nicht.
Hier der C-Code:
------------------------------------------------------------------------
-
#include "lcd.h"
#include "lcd.c"
#include <avr/io.h>
#include "stdio.h"
#define F_CPU 3686400 //Prozessortakt
#define BAUD 9600 //RS232-Baudrate
#define MYUBRR F_CPU/16/BAUD-1
void USART_INITIALISIEREN(unsigned int);
unsigned char USART_EMPFANGEN(void);
void USART_SENDEN(unsigned char);
int main(void)
{
char Zeichen,i;
DDRC = 0xFF;
USART_INITIALISIEREN(MYUBRR);
lcd_init();
lcd_clear();
i = 0;
Zeichen = 'a';
lcd_write(Zeichen);
while(1)
{
Zeichen = USART_EMPFANGEN();
lcd_write(Zeichen);
}
return 0;
}
void USART_INITIALISIEREN(unsigned int ubrr)
{
//setzen der Baudrate
UBRRH = 0;//(unsigned char) (ubrr>>8); //Setzen des HIGH-Bytes des
Baudraten-Registers
UBRRL = 23;//(unsigned char) ubrr; //Setzen des LOW -Bytes des
Baudraten-Registers
//UCSRA |= 0x02;
//Einschalten des Senders und Empfaengers
UCSRB = (1<<RXEN)|(1<<TXEN);
//Setzen des Nachrichtenformats: 8 Datenbits, 2 Stopbits
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
}
unsigned char USART_EMPFANGEN(void)
{
//Warten bis die Daten empfangen wurden
while( !(UCSRA & (1<<RXC)) )
;
//Holen und Zurueckgenben der vom Puffer Empfangenen Daten
return UDR;
}
void USART_SENDEN(unsigned char daten)
{
//Warten bis der Uebertragungspuffer leer ist
while( !(UCSRA & (1<<UDRE)) )
;
//Daten inden Puffer schreiben und Uebertragen
UDR = daten;
}
------------------------------------------------------------------------
---
Übrigens schließe ich das Board per USB-Seriell-Converter an den PC an,
da der Converter aber ein Male-Stecker ist und das Board ebenso,
verbinde ich den Converter mit dem Board über ein selbstgemachter
Nullmodemkabel (ungeschirmte Flachbandleitung).
Hat irgendjemand ne Idee, wo der Fehler liegen könnte?