Forum: Mikrocontroller und Digitale Elektronik Hilfe bei AD Wandlung ATmega8 ???


von HolgerD (Gast)


Lesenswert?

Hi

Ich habe da mal ein kleines Problem. Unzwar betreibe ich ein ATmega8
mit 16MHz.
An Pc0 und PC1 will ich Analoge Werte einlesen und an PC2 - PC5 liegen
Schalter an.
da es sich bei meinem Programm um Zeitkritische Sachen handelt, kann
ich mir keine
Interrupts und warten bis Flags gesetzt sind leisten. Die Zyclen müssen
immer
gleich bleiben und demzufolge berechenbar sein.

Hier mal meine Routine:

;-------setze Stackpointer (045F)----------
          ldi    r17, 0x5F
          out    SPL, r17
          ldi    r17, 0x04
          out    SPH, r17
;------------------------------------------

;------setze tasten PORTS ----------------
          ldi    r17, 0x00
          out    DDRC, r17
          ldi    r17, 0xfC
          out    PORTC, r17
;------------------------------------------
.
.
Hier frage ich nun PC0 ab und speichere die Daten in 0x0300 + 0x0301
.
.
  ldi  r17, 0x20  ;1-----------------------
  out  ADMUX, r17  ;1
  ldi  r17, 0xE0  ;1
  out  ADCSRA, r17  ;1

  ldi    r17,0x16    ;----
hx0:  dec    r17    ;   66
  brne   hx0    ;----

  in  r17, ADCH  ;1                   110
  sts  0x300, r17  ;2
  in  r17, ADCL  ;1
  sts  0x301, r17  ;2

Nun will ich jedoch den PC1 abfragen und mach dann folgendes:

  ldi  r17, 0x21  ;1-----------------------
  out  ADMUX, r17  ;1

  ldi    r17,0x16    ;----
hx1:  dec    r17    ;   66
  brne   hx1    ;----

  in  r17, ADCH  ;1
  sts  0x302, r17  ;2
  in  r17, ADCL  ;1
  sts  0x303, r17  ;2

Diese Werte sollen dann in 0x0302 - 0x0303 rein.

Zum Schluss Disable ich die Analogen eingänge wieder um PC2- PC5 als
INPUT zu nutzen:

  ldi  r17, 0x0  ;1
  out  ADMUX, r17  ;1
  ldi  r17, 0x0  ;1
  out  ADCSRA, r17  ;1---------------------

danach passiert ersteinmal ganz viele Takte nichts mehr,
bis er wieder zu dieser Routine zurück kehrt.

Das problem ist nun, dass ich immer nur den Wert aus der erten Routine
erhalte (PC0).
Also beim zweiten mal einlesen (PC1) hat sich nichts verändert.

Da ich den Analog Teil als im Free Run mode betreibe, sollten doch
eigentlich
zwischen wechsel der Ports nur 13 Takte nötig sein, damit der neue Wert
in ADCH ADCL
drinn steht ?

Aber der Wert ändert sich nicht :-(.

Und was ist eigentlich der unterschied zwischen Free Run Mode und
Single Mode ?
Irgendwie verstehe ich das so, das im Single Mode mit max. 200KHz
gescannt wird ?
Was aber bei 16MHz Grundtakt und max. Teiler von 128 überhaupt nicht
möglich wäre.

von HolgerD (Gast)


Lesenswert?

Ok.....

Hat sich wohl erledigt, ich habe nun die Initialiesierung ganz zum
Anfang gepackt und frage in den Routinen nur noch die I/O Register ab.
Man muss wohl nicht immer umschalten um die Schalter an PC2-PC5
abzufragen. das wird wohl auch parallel dazu erledigt.

Aber eine Frage wäre da noch. ich habe Masse und AVcc an die normale
Spannung mit angeschlossen, genau so Aref. Wieso wird bei High nur
0x03CF angezeigt und bei Low 0x001F ???? Da die PIN's ja die volle
Aref Spannung bekommen, sollten die doch 0x03FF anzeigen, genau so wie
bei Low (Masse) die 0x0000 ?

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.