Hallo, und zwar sende ich von meinem FTDI232C über ein Terminal ein Zeichen zb. eine "1" zum Atmega auf einem SDK Board. Dieser sollte mir dann wenn er dieses Zeichen empfangen hat einen Text zurückschicken. Nun ist das Problem, das er mir zwar was zrückschickt, jedoch es sich hauptsächlich nur um irgendwelche willkürlichen Zeichen handelt (Kleine Silben oder Worte werden sogar richtig zurückgeschickt). Die Baudrate beträgt 19200kHz für die der Atmega 8 programmiert ist und der benutzte Quarz hat 16Mhz. Wisst ihr woran es momentan scheitern könnte und welche Lösung dazu nötig ist? mfg Harry
Aus 16MHz kann man keine 19200 Hz (KILOHerz schon sowieso nicht!) durch Teilung herstellen. Dabei entsteht ein zu großer Fehler. Dieser wirk sich um so stärker aus, je länger die zu übertragende Sequenz ist. Die bekannten klassischen RS232-Baudraten lassen sich nur aus krummzahligen Frequenzen ableiten, für die es spezielle Quarze gibt: Z.B. 9,8304 MHz. (9830400 / 512 = 19200). Gruß, Michael
Siehe Datenblatt (Examples of Baud rate setting). Da hat man mit 16MHz bei 19200 einen Fehler von 0.2%, ca. 2% sind zulässig. Geht also wunderbar. Ich übertrage mit 16MHz 115200 (Fehler 2.1%) und das geht auch. Überprüf mal ob der Baudratenteiler wirklich richtig ist, in der Tabelle kannst du nachsehen.
> Aus 16MHz kann man keine 19200 Hz (KILOHerz schon sowieso nicht!) > durch Teilung herstellen. Dabei entsteht ein zu großer > Fehler. Dieser wirk sich um so stärker aus, je länger die zu > übertragende Sequenz ist. Für RS-232-Übertragung ist die Sequenz immer 10 Bits lang, es gibt keinen akkumulierten Fehler, da auf jedes Startbit neu synchronisiert wird. Dafür ist der Fehler tolerierbar (0,2 % wenn ich mich recht entsinne). Man kann aus 1 MHz Takt mit gesetztem U2X (d.h. 8fach oversampling) 9600 Bd mit erträglichem Fehler erzeugen oder aus 2 MHz ohne U2X (16fach oversampling). Dementsprechend kann man aus 16 MHz auf jeden Fall 19200 Bd mit erträglichem Fehler erzeugen.
Also nochmal zum Problem: Baudrate und Quarz sind meiner Meinung nach nicht das Problem, da es ja über den MAX232 der am STK500 oben ist funktioniert. Aber wenn ich die Pins (Rx,Tx) direkt vom STK500 mit dem FTDI Modul verbinde kommen nur teilweise richtige zeichen an. -->es liegt nicht am Programm. Mittlerweile haben wir die Masse (STK500,FTDI Modul) auch schon miteinander verbunden und das hilft gleich garnix. Hat irgendjemand eine Idee? Irgendwas was zusätzlich beschaltet/entstört werden muss??? Danke
Also am Code kann es meiner Meinung nach wie gesagt nicht liegen. Das Schema meiner Schaltung: Atmega8 in STK500 mit externem 16Mhz Quarz und die beiden Pins PD0 und PD1 sind überkreuzt mit dem FTDI Modul verbunden. Solls noch genauer sein? Dann müsste ich die Modul Schematic posten! <code> /*********************************************************************** ** Title: example program for the Interrupt controlled UART library Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury File: $Id: test_uart.c,v 1.4 2005/07/10 11:46:30 Peter Exp $ Software: AVR-GCC 3.3 Hardware: any AVR with built-in UART, tested on AT90S8515 at 4 Mhz DESCRIPTION: This example shows how to use the UART library uart.c ************************************************************************ */ #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/pgmspace.h> #include "lcd.h" #include "uart.h" #include "adc.h" /* define CPU frequency in Mhz here if not defined in Makefile */ #ifndef F_CPU #define F_CPU 16000000UL #endif /* 19200 baud */ #define UART_BAUD_RATE 19200 int main(void) { unsigned int c; char buffer[7]; uint16_t muh; muh = ReadChannel(0); /* * Initialize UART library, pass baudrate and AVR cpu clock * with the macro * UART_BAUD_SELECT() (normal speed mode ) * or * UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode) */ uart_init( UART_BAUD_SELECT_DOUBLE_SPEED(UART_BAUD_RATE,F_CPU) ); sei(); /* * Transmit string to UART * The string is buffered by the uart library in a circular buffer * and one character at a time is transmitted to the UART using interrupts. * uart_puts() blocks if it can not write the whole string to the circular * buffer */ uart_puts("-USB-Messeinheit loading..."); uart_putc('\r'); uart_puts("-Version 0.9"); uart_putc('\r'); uart_puts("--------"); uart_putc('\r'); uart_puts("-now waiting for input"); uart_putc('\r'); uart_putc('\r'); for(;;) { c = uart_getc(); if ( c & UART_NO_DATA ) { } else { /* * new data available from UART * check for Frame or Overrun error */ if ( c & UART_FRAME_ERROR ) { /* Framing Error detected, i.e no stop bit detected */ uart_puts_P("UART Frame Error: "); } if ( c & UART_OVERRUN_ERROR ) { /* * Overrun, a character already present in the UART UDR register was * not read by the interrupt handler before the next character arrived, * one or more received characters have been dropped */ uart_puts_P("UART Overrun Error: "); } if ( c & UART_BUFFER_OVERFLOW ) { /* * We are not reading the receive buffer fast enough, * one or more received character have been dropped */ uart_puts_P("Buffer overflow error: "); } /* * send received character back */ switch (c) { case '0': uart_puts_P("r_initialisieren..."); uart_putc('\r'); break; case '1':uart_puts_P("r_>data<"); uart_putc('\r'); break; case '2': uart_puts_P("t_timesync"); uart_putc('\r'); break; case '3': uart_puts_P("..."); uart_putc('\r'); break; case '4': uart_puts_P("..."); uart_putc('\r'); break; } //uart_putc( (unsigned char)c ); } } } </code>
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.