Forum: Compiler & IDEs FTDI & ATMEGA8


von harrychen01 (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

In main.c fehlt bei Zeile 10 ein "&" vor der Variable.

von ams (Gast)


Lesenswert?

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

von Fritz G. (fritzg)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> 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.

von ams (Gast)


Lesenswert?

Ah ja, wieder was gelernt!  :)

Gruß, Michael

von riegaz (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

Poste doch mal den Code und das Schema deiner Schaltung...

von Michael L. (riegaz)


Lesenswert?

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>

von Michael L. (riegaz)


Lesenswert?

Oke die Übertragung funktioniert ;-) anscheinend nur ein
Kontaktfehler...


Danke

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
Noch kein Account? Hier anmelden.