PDA

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



LC-HC
05.04.2006, 20:30
HI, ich hab hier mal den Code zur testweisen implementierung des USART im ATmega 8. Leider kommt aber am Terminal nichts an. Die Einstellungen sollten korrekt sein, jedoch kann ich das Kabel nicht ohne weiteres überprüfen. Ich poste hier einfach mal den code:

<CODE>
// Prototypen wie folgt: -------------
void USART_init(void);
void USART_putc(char c);
void USART_puts(char *s);


int main(void)
{
char *text;

DDRB = 0xFF; // PORTB als AUSGANG
USART_init(); // USART initialisieren

text = "eins zwei drei!";

for(;;)
{
USART_puts(text);
_delay_ms(500);
}
return 0;
}

/*------------------------------------
USART_init()
-------------------------------------*/

void USART_init(void)
{

//UBRRH = (uint8_t) (BAUD>>8);
UBRRL = 23; // Ergibt die Berechnung nach Formel aus Datenblatt


//enable transmitter

UCSRB |= (1<<TXEN);

// set frame format:

UCSRC |= (1<<URSEL) | (3<<UCSZ0);
}

/*-----------------------------------------------------------------------------------
USART_putc()
sendet ein einzelnes Zeichen, das mit "c" als Parameter übergeben wird
------------------------------------------------------------------------------------*/

void USART_putc(char c)
{
while( !(UCSRA & (1<<UDRE)) )
;

// Daten in USART Datenreg. schieben, sendet automatisch
UDR = c;
}

/*-----------------------------------------------------------------------------------
USART_puts()
sendet einen String (indirekt), indem für jedes stringelement
USART_putc() aufgerufen wird.
------------------------------------------------------------------------------------*/
void USART_puts(char *s)
{
while ( *s )
{
USART_putc(*s);
s++;
}
}
</CODE>

SprinterSB
05.04.2006, 20:51
Auf Anhieb sehe ich da nix, im wesentlichen ist das gleich dem UART-Beispiel (https://www.roboternetz.de/wissen/index.php/UART_mit_avr-gcc) ausm Wiki.

Ein Baudraten-Rechner ist auf der Seite bei den Weblinks.

Stimmen die Einstellungen am PC?

Bei den Initialisierungen werden nur Bits gesetzt, keine gelöscht... UBSRC = ist da klarer (und kürzer).

Taste mal den TxD-Pin mit ner LED, ob da was kommt. Evtl TxD als OUT schalten. Sollte die AVR-Hardware machen...

Arexx-Henk
05.04.2006, 22:07
Hallo,

wie ist denn die Atmega8 am Terminal angeschlossen?

Die Atmega8 liefert digitale signale von 0 bis 5V und ein Terminal braucht positieve und negatieve Signalen...?

Ubrigens:
DDRB = 0xFF; // PORTB als AUSGANG
ist uberflussig,

sobald dieze code ausgefuhrt wird
//enable transmitter
UCSRB |= (1<<TXEN);

wird die TXD pin als Ausgang geschaltet

und bei 'Disable transmitter'
UCSRB &= ~(1<<TXEN);

wieder wie zuvor eingestelt

In deine code bleibt TXD pin nach abschalten der transmitter
immer als Ausgang geschaltet wegen des DDRB = 0xFF.

Gruss

Henk

LC-HC
08.04.2006, 20:03
Hey Danke, das problem hat sich von selbst gelöst. Hab einfach mal ein anderes Kabel verwendet.

cya

askazo
09.04.2006, 08:52
Ein RS232-Kabel lässt sich sehr einfach testen:
- Eine Seite am PC anschließen und HyperTerminal starten
- an der anderen Seite die Anschlüsse 2 und 3 (TxD und RxD) brücken (mit nem Jumper gehts am einfachsten, man kann sich aber auch leicht ein Stückchen Draht zurechtbiegen)
- Auf der Tastatur ein paar Tasten drücken

Wenn das Kabel ok ist, kommt im Terminal genau das an, was man eintippt. Wenn nix ankommt, ist das Kabel hin...

askazo