mikrocontroller.net

Forum: Compiler & IDEs FTDI & ATMEGA8


Autor: harrychen01 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In main.c fehlt bei Zeile 10 ein "&" vor der Variable.

Autor: ams (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fritz Ganter (fritzg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ams (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja, wieder was gelernt!  :)

Gruß, Michael

Autor: riegaz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste doch mal den Code und das Schema deiner Schaltung...

Autor: Michael Leahcim (riegaz)
Datum:

Bewertung
0 lesenswert
nicht 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>

Autor: Michael Leahcim (riegaz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oke die Übertragung funktioniert ;-) anscheinend nur ein
Kontaktfehler...


Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.