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


von Stefan S. (eric996)


Angehängte Dateien:

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 :-)

von Karl H. (kbuchegg)


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)

von Stefan S. (eric996)


Angehängte Dateien:

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;
}

von Jean P. (fubu1000)


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ß

von Johannes M. (johnny-m)


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.

von Stefan S. (eric996)


Lesenswert?

Schöne Dank erstmal,

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

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.