Forum: Mikrocontroller und Digitale Elektronik AVR A/D-Wandler wandelt nur sporadisch um?!


von Jan Petersen (Gast)


Lesenswert?

Moin!
Ich baue für meine Studienarbeit eine Feldmühle. Diese misst das
elektrostatische Feld. Ziel ist die Messdaten im Internet
darszustellen.  Zur Kommunikation mit dem PC verwende ich einen
ATmega8.
An Port C0 liegt der Messwert als Gleichspannung an, wird digitalisiert
und über RS232 an den PC gesendet (8Bit-Wert).
Das Problem ist dass ich auf dem PC nicht die gewünschten Werte
empfange. Es werden zwar Daten gesendet, aber die stimmen definitiv
nicht. Wenn ich Port C0 auf Masse lege,sendet er mir durchgehend "00"
zurück, soweit gehts. Lege ich dann eine Spannung (aus einem
DC-Netzteil, zum testen) an, 3,6V, bekomme ich ungefähr diese
Ergebnisse:
00
00
00
02
FF
01
FF
00
02
FF
00
00
00
02
FF
...
Also so gut wie nicht und ab-und-zu mal ein FF... ab zwischendrin immer
sehr viele 00er :-/

Kann das an der Übertragung liegen? Ich habe ein sehr langes Kabel an
der RS232 (über 15m). Oder ein Fehler im Code?

Ich hoffe ihr könnte mir einen Tipp geben woran es liegt! Wenn Fragen
zum Aufbau sind, nur zu ;-)
Hier noch der Code:

(...)
ldi     r16,0b00000000    ;Port C als Eingang
        out  ddrc,r16  ;setzen
  ldi  r16,0b00000000  ;Port C Pull-Up deaktivieren
  out  portc,r16  ;setzen

  ldi r16,0b00100000  ;AVref, links ausger., C0 als Input
  out admux,r16
  ldi r16,0b11000111  ;ADC enable, Single Mode, Taktt. 128
  out adcsra,r16    ;Interrupt disabled, Frequenzt. 2
(...)
loop:
;Die Hauptschleife wird immer wieder durchlaufen.
;Bei jedem Durchlauf wird der AD gestartet und dann der Wert gesendet
  ldi temp, HIGH(0x0)  ;load start value
  out TCNT1H, temp
  ldi temp, LOW(0x0)
  out TCNT1L, temp
  IN  r19,TIFR    ;Timer Overflow Flag löschen
  OUT TIFR,R19
[Warteschleife damit nicht zu viele Daten gesendet werden]
wait_ad:
  sbi ADCSRA,ADSC    ;AD starten
  in r19,ADCSRA
  SBRS r19,4    ;auf AD warten
  rjmp wait_ad
  in  temp,ADCH  ;Wert in Register laden
  rcall sendbyte    ;Wert senden
  rjmp loop    ;Neuer Durchgang

von johnny.m (Gast)


Lesenswert?

>wait_ad:
>  sbi ADCSRA,ADSC    ;AD starten
>  in r19,ADCSRA
>  SBRS r19,4    ;auf AD warten
>  rjmp wait_ad

Wenn Du den ADC in der Warteschleife immer wieder neu startest, dann
ist es kein Wunder, dass nur Murks rauskommt...

von Karl heinz B. (kbucheg)


Lesenswert?

> Kann das an der Übertragung liegen? Ich habe ein sehr
> langes Kabel an der RS232 (über 15m).

Möglich:
Naheliegend wäre daher die Übertragung mal für sich
alleine zu testen.

von Jan Petersen (Gast)


Lesenswert?

Danke erstmal für die schnellen Antworten!!

@johnny.m
Ups, dummer Fehler. Aber leider lags nicht daran.

@Karl-Heinz
Hab das Kabel jetzt deutlich gekürzt (1,5m) zum Testen, scheint
wirklich daran zu liegen. Geht aber auch jetzt noch nicht :-/ Scheint
als hätte ich da das falsche Kabel erwischt.
Ich werds mal mit ner niedrigeren Baudrate probieren

von Jan Petersen (Gast)


Lesenswert?

ES GEHT!!
Das sind so die Tücken wenn man damit nicht wirklich Erfahrung hat ;-)

von Karl heinz B. (kbucheg)


Lesenswert?

Ich würds mal mit einem eigenen Testprogramm
probieren, das ganz einfach alles was empfangen
wird wieder zurückschickt. Oder das ganz einfach
nur ein 'A' ständig auf der Seriellen sendet.

Es macht wenig Sinn, mit einem Programm zu testen
wenn du da drin 5 Komponenten in Verdacht hast, Mist
zu bauen.

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.