Forum: Mikrocontroller und Digitale Elektronik ADC und USART bei Atmega8: Daten kommen verzögert an


von Helmuth (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin gerade am durcharbeiten des AVR-Tutorials und möchte die 
ADC-Werte von 2 Kanälen über USART an den PC übertragen. Das klappt auf 
meinem STK500 auch wunderbar. Wenn ich mit HTerm auslese erhalte ich je 
nach angelegter Spannung Werte zwischen 0 und 1023 (bei drehen an einem 
Poti). Die Werte ändern sich in Echtzeit, wie es ja auch sein sollte.

Wenn ich aber nun meinen Atmega8 in eine eigene Schaltung einsetze 
(siehe Anhang) erhalte ich zwar auch Werte angezeigt, allerdings mit 
einer Zeitverzögerung von fast 30 Sekunden.

Was mache ich falsch?

Gruß
H.

F_CPU: 3.6864 MHz
Baudrate: 38400

von Karl H. (kbuchegg)


Lesenswert?

wozu soll R30 in deiner Schaltung gut sein?
Nimm ihn erst mal raus.

von Karl H. (kbuchegg)


Lesenswert?

1
  char s[4];

bei einem maximalen Messwert von 1023 sind 4 Zeichen zu wenig. Du 
brauchst mindestens ein Array der Länge 5.

von Karl H. (kbuchegg)


Lesenswert?

1
    while(1)
2
    {
3
    
4
5
    if(data=='x')
6
    {
7
8
      for(int i=0; i<kanaele; i++ )

Nimm mal die Abfrage auf 'x' raus.
Sind deine angezeigten Messwerte dann immer noch zeitverzögert, wenn du 
am Poti drehst?

von Hc Z. (mizch)


Lesenswert?

Ich glaube, Du misst gerade den Puffer Deines Terminalprogramms aus.  Du 
schickst die Daten mit voller UART-Geschwindigkeit, und das Terminal ist 
30 Sekunden hinter dem, was Du schickst.

Versuch's mal mit einer (oder mehreren) der folgenden Möglichkeiten:

- kleinere Baudrate
- Warteschleife von ein paar zig ms zwischen den Ausgaben
- Lass den \n am Zeilenende weg, damit nicht gescrollt werden muss

Dass das Zeug so lange im ATmega bleibt, halte ich nicht für möglich.

von Helmuth (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> wozu soll R30 in deiner Schaltung gut sein?

Der wird statt der 10mH Spule im Tutorial empfohlen.

Karl heinz Buchegger schrieb:
> bei einem maximalen Messwert von 1023 sind 4 Zeichen zu wenig. Du
>
> brauchst mindestens ein Array der Länge 5.

Ok. Funktioniert aber so wie ich es stehen habe.


Hc Zimmerer schrieb:
> Ich glaube, Du misst gerade den Puffer Deines Terminalprogramms aus.  Du
>
> schickst die Daten mit voller UART-Geschwindigkeit, und das Terminal ist
>
> 30 Sekunden hinter dem, was Du schickst.

Kling sinnvoll, aber warum funktioniert's dann über das STK500?

von ... (Gast)


Lesenswert?

Helmuth schrieb:
>> brauchst mindestens ein Array der Länge 5.
>
> Ok. Funktioniert aber so wie ich es stehen habe.

Ist aber trotzdem verkehrt. Und funktionieren tut es nur aus Versehen. 
Du schreibst wild auf dem Stack rum. Daß Dein Programm nicht Amok läuft 
bzw. der µC nicht resetet ist eher wie ein 6er im Lotto.

von Hc Z. (mizch)


Lesenswert?

Helmuth schrieb:
> Kling sinnvoll, aber warum funktioniert's dann über das STK500?

Wenn es genau dieselbe Software ist (inklusive der Schnittstellentreiber 
und Baudrate) und das auf beiden Seiten, dann kann ich Dir das nicht 
sagen.

Was für mich gegen ein Puffern im ATmega spricht:  Du sendest Daten mit 
der vollen Geschwindigkeit, macht um die 3800 Zeichen/s.  Das 30 
Sekunden lang gibt ca. 110000 Bytes an Daten, die der arme ATmega erst 
mal gepuffert kriegen müsste.  (Du sendest etwas langsamer, weil die 
ADC-Wandelzeit (abzüglich der Dauer eines Zeichens im UART) pro 
Durchlauf dazukommt.)  Deshalb würde ich schätzen, dass Dein 
Terminalpuffer 100k groß ist.

Die anderen Fehler wären dann zusätzlich.

von Helmuth (Gast)


Lesenswert?

Habe alle Änderungen wie vorgeschlagen vorgenommen:

- char auf [5] erweitert
- Baudrate auf 9600 zurückgenommen
- if-Abfrage rausgenommen

Hat sich aber nichts geändert.

Was mir noch aufgefallen ist:

Wenn ich über das STK500 gehe, ist die Statusanzeige in HTerm bei CTS 
und DSR grün. Gehe ich aber über meine Schaltung, dann ist DSR aus und 
CTS flackert grün.

von Helmuth (Gast)


Lesenswert?

Helmuth schrieb:
> Statusanzeige in HTerm

Sorry, ich meinte Realterm

von spess53 (Gast)


Lesenswert?

Hi

>Wenn ich über das STK500 gehe, ist die Statusanzeige in HTerm bei CTS
>und DSR grün. Gehe ich aber über meine Schaltung, dann ist DSR aus und
>CTS flackert grün.

Dann verbinde mal auf deiner Platine Pin6 mit Pin4 und Pin7 mit Pin8 vom 
Sub-D-Verbinder.

MfG Spess

von Helmuth (Gast)


Lesenswert?

spess53 schrieb:
> Dann verbinde mal auf deiner Platine Pin6 mit Pin4 und Pin7 mit Pin8 vom
>
> Sub-D-Verbinder.

Ich hab zwar keine Ahnung, was ich da gerade gemacht habe, aber:

1) Ich hab gesehen, dass auf dem STK500 die Beschaltung genauso ist
2) Es klappt jetzt so, wie es soll :-)


Herzlichen Dank an Dich! Und natürlich auch an die anderen Helfer.

Gruß & schönen Abend

H.

von spess53 (Gast)


Lesenswert?

Hi

>1) Ich hab gesehen, dass auf dem STK500 die Beschaltung genauso ist

Daher stammt der Tipp.

>Ich hab zwar keine Ahnung, was ich da gerade gemacht habe, aber:

Damit wird eine Hardware-Flussteuerung simuliert. Evtl. lässt sich das 
auch in dem, mir unbekannten, Realterm abschalten. Dann geht es auch 
ohne die Brücken.

MfG Spess

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.