www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fehlerhafte Übertragung Atmega16 RS 232 -> PC


Autor: Eric S. (eric996)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend zusammen,

habe gerade die ersten Schritte mit einem STK500 und einem ATMEGA16 
hinter mich gebracht.Nachdem ich jetzt weis, dass es fusebits gibt und 
diese doch ab und an angefsst werden müssen,versuche ich wieder eine 
Serielle Kommunikation zwischen STK500 und einen PC, via RS232 
Schnittstelle zu realisieren.

Soll: Ausgabe von Werten die mittels 50k Poti ((+) (Schleife an PA0) 
(-)über den ADC eingelesen werden, übermittelt von RS232 (Spare) an PC.

Problem: Am PC werden Zeichen dargestellt und das gesamte AVR_Terminal 
vollgeschrieben.

Das Programm kommt aus dem AVRBUCH.de, heißt EasyADC und soll Werte in 
den ADC einlesen und an den PC senden. Mit dem Atmega8 funktioniert es 
auch.
Leider nicht mit dem ATmega16 :-(

Was bisher probiert wurde:

mit dem Atmega16 funktionierte die serielle Schnittstelle
Mit dem Programm aus dem AVR_Buch "SERIELLMINIMAL" wird der Text 
"AVRBUCH.DE - RS232 [OK]..." übertragen.

Was ich verändert habe:

Atmega8 raus, Atmega16 rein auf Steckplatz A03 und ADC Eingang auf PA0 
gesteckt.

RS 232 Verbindungskabel ist auf RxD, PD0 von PORTD, TxD auf PD1 von 
PORTD
geblieben.

Fusebits berechnet mit Engbedded Atmel AVR® Fuse Calculator auf Low = 
0xFF High = 0x99 (wurden gegenüber Atmega8 nicht verändert).

Vielen Dank für die Hilfe :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Problem: Am PC werden Zeichen dargestellt und das gesamte AVR_Terminal
> vollgeschrieben.

Unleserliche Zeichen sind ein deutliches Indiz, dass irgendwas mit der 
Baudrate nicht stimmt.
Der häufigste Fall, warum diese nicht stimmt ist wiederrum, dass der µC 
nicht mir der Taktfrequenz arbeitet, die du im Programm für die 
Berechnung der Werte im Baudratenregister benutzt hast.

Daher die Frage:
Hast du wirklich einen 3.68 Mhz Quarz am µC und wird der auch benutzt?
(Könnte man zb. mit einem Blinkprogramm abklären)

Autor: Eric S. (eric996)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
das Programm lief auf dem Atmega8, nicht aber auf dem Atmega16 ?

Code

/*
  EasyADC - 8-Bit Free Running Mode A/D Konverter Beispiel

  www.avrbuch.de

  ==============================================================
  Sie können diesen Quellcode zur freien Verwendung weitergeben.
  Erstellt: 2007, Roman Mittermayr (roman@avrbuch.de)
  ==============================================================

  WICHTIG:
  (1) Vor dem Compilieren, Optimization auf -Os stellen!

  (2) PORTC.0 mit einem Potentiometer verbinden (oder einer
      variablen Spannungsquelle von 0 bis 5V). PORTC.0 ist der
    Analoge Messkanal 0 und wird in diesem Beispiel fortlaufend
    ausgewertet (0V = 0, 5V = 255)

  (3) Achten Sie darauf, dass der Prozessortakt richtig eingestellt ist
      (siehe #define gleich unterhalb)

  (4) Die BAUDRATE beträgt 9600 Baud (8n1) und ist in der Datei rs232.h
      definiert.
*/
#define  PROZESSORTAKT  3680000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include "rs232.h"


/* ==== INTERRUPT HANDLER: ADC Conversion Complete === */
SIGNAL (ADC_vect)
{
  unsigned char c;
  char temp[5];

  // ADC Resultat einlesen =======================

  c = ADCH; /* Nur ADCH lesen, weil 8-Bit Modus */


  // ADC Resultat auf RS232 ausgeben =============

  itoa(c, temp, 10); /* In einen String konvertieren ... */

  uart_putchar('\r');
  uart_putstring("Messwert: ");
  uart_putstring(temp);
  uart_putstring("   ");
}




int main(void)
{
  /* RS232 einschalten ...*/
  setup_uart();
  uart_putline("[ EasyADC -- www.avrbuch.de ]");

  // Alle Interrupts erlauben
  sei();

  // ADC, 8-Bit im Free Running Mode mit Interrupt
  // Referenzspannung: VCC
  // Takt: Systemtakt / 2 (4 MHz bei 8Mhz Quarz)
  ADMUX = (1<<REFS0) | (1<<ADLAR);
  ADCSRA = (1<<ADEN) | (1<<ADFR) | (1<<ADIE);

  // ADC starten!
  ADCSRA |= (1<<ADSC);

  // Endlosschleife
  while (1) ;

  return 0;
}

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
oben steht:
>#define  PROZESSORTAKT  3680000

weiter unten kommt dann:
>// ADC, 8-Bit im Free Running Mode mit Interrupt
>// Referenzspannung: VCC
>// Takt: Systemtakt / 2 (4 MHz bei 8Mhz Quarz)

Also entweder oder???

Gruß

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du betreibst den ADC mit 1,84 MHz. Das ist weit außerhalb der 
Spezifikationen. Selbst eine Auflösung von 8 Bit ist damit illusorisch.

Außerdem brauchen Deine Ausgabefunktionen im Interrupt Handler sicher 
deutlich länger als die Wandlung. Solche Funktionen haben in einem 
Interrupt Handler nichts zu suchen, auch wenn es in diesem Falle 
funktionell keinen Unterschied macht! Ein Interrupt Handler ist so kurz 
wie möglich zu halten. Der ganze Ausgabe-Rotz kann im Hauptprogramm 
abgearbeitet werden.

Dadurch, dass die Ausgabe wesentlich länger dauert als die Wandlung 
gehen sowieso Wandlungsergebnisse zuhauf verloren.

Du solltest erstens den ADC langsamer Takten und zweitens vielleicht mal 
eine Mittelwertbildung über 8 oder 16 Messwerte machen.

Deine Ausgabe läuft derzeit mit maximaler Geschwindigkeit, d.h. der µC 
ist permanent am Senden. Da wundert es wenig, dass alles vollgeschrieben 
wird.

Abgesehen davon ist SIGNAL veraltet. Nimm ISR stattdessen.

Autor: Eric S. (eric996)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schöne Dank erstmal,

der Code stammt aus "AVR_RISC" Buch von Roman Mittermayr 2008,
anscheinend ist das wohl keine sichere Bank.

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.