Forum: Mikrocontroller und Digitale Elektronik AtMega8: zwei Analoge Werte verarbeiten ADC


von Lars (Gast)


Lesenswert?

Moin,

ich habe das myAVR Lehrbuch durchgearbeitet und wollte nun mit dem 
Atmega8 2 analoge Messwerte an ADC0 und ADC1 aufnehmen und dann weiter 
verarbeiten.

Wenn ich es richtig verstanden habe, kann ich nicht mehrere ADC-Eingänge 
gleichzeitig asbfragen, sondern muss dies nacheinander tun.

Mir erschien es sinnvoll dies folgerndermaßen zu machen:
1
on:   sbrc  EK, 0        ;wenn zuletzt Wert1 ausgelesen wurde,    
2
      rjmp  onWert2      ;dann springe zum Verarbeiten des Wert2
3
      ;------------------------------------------------------------------
4
onWert1:    ;verarbeiten von Wert1
5
      push   temp1       ;rette  die Temps
6
      push   temp2        
7
    
8
      in     temp1, ADCL ;lese den Wert1 aus
9
      in     temp2, ADCH
10
      ;-----------------------
11
      asr    temp2       ;Die 8 MSB auslesen
12
      ror    temp1
13
      asr    temp2
14
      ror    temp1
15
      mov    Wert1, temp1
16
      
17
putChar:  
18
      sbis  UCSRA, 5     ;gebe die Daten aus
19
      rjmp   putChar
20
      out    UDR, Wert1
21
      
22
      ldi   EK, 0b00000001 ;initialisiere C1
23
      out    ADMUX, EK
24
      sbi     ADCSRA, 6  ;starte nächste Messung
25
        
26
      pop    temp2       ;schreibe die Temps zurück
27
      pop    temp1
28
      reti               ;und zurück ins Hauptprogramm
29
      ;------------------------------------------------------------------
30
onWert2:    ;aufnehmen von Wert2
31
      push   temp1       ;rette  die Temps
32
      push   temp2
33
      
34
      in     temp1, ADCL ;lese den Wert2 aus
35
      in     temp2, ADCH
36
      ;-----------------------
37
      asr    temp2       ;Die 8 MSB auslesen
38
      ror    temp1
39
      asr    temp2
40
      ror    temp1
41
    
42
      mov    Wert2, temp1
43
      ;-----------------------
44
putChar1:          
45
      sbis  UCSRA, 5
46
      rjmp  putChar1
47
      out   UDR, Wert2
48
49
      ldi   EK, 0b00000000 ;wechsel zu C0
50
      out    ADMUX, EK
51
      sbi     ADCSRA, 6  ;nächste Konvertierung
52
            
53
      pop    temp2       ;schreibe die Temps zurück
54
      pop    temp1
55
    
56
      reti

Es funktioniert auch soweit, dass ich abwechselnd die Werte ausgegeben 
bekomme, das Problem ist nun, dass wen ich versuche die Werte zu 
verarbeiten, dann nutze ich eine Schleife für eine Automatensteuerung, 
die so aussieht:
1
phase1:            
2
      mov    temp1, Wert2
3
      ldi    temp2, 60
4
      
5
      cp     temp1, temp2  ;der Startwert lieg bei 25 und steigt dann bis
6
      BRSH   phase2        ;60 an, hier soll dann der Motor abgeschaltet
7
                           ;werden
8
      sbi    PORTB, 0      ;Motor einschalten
9
      sbi    PORTB, 1
10
      rjmp            phase1
11
12
phase2:                 
13
      cbi    PORTB, 0      ;Motor abschalten
14
      cbi    PORTB, 1

Diese Schleife wird nun leider ignorriert. Egal welcher Wert als Wert2 
eingelsen wird, es wird zu Phase 2 übergegangen, das ganze funktioniert 
aber solange ich die Messung von Wert1 nicht durchführe.

Ich habe schon die das AVR-Tutorial: ADC gelesen und versucht mit der 
Suchfunktion und Google etwas passendes dazu zu finden, aber mir ist 
einfach nicht im geringsten klar wo der Fehler liegt.

An der Signalqualität liegt es nicht- ich habe sie sowohl mit einem 
starken Tiefpass versucht zu glätten wie auch einfach den Poti vom 
myAVR-Board benutzt... und wie gesagt- ohne die Messung des Wert1 klappt 
es auch...

Im SiSy-Controlcenter bekomme ich auch brav die richtigen Werte

Wenn es einen sinnvolleren alternativen Weg gibt um 2 ADC-Werte 
einzulesen immer her damit ich bin mittlerweile für alles dankbar^^

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Da fehlt noch was im Code...
Zeig mal die Definitionen von Wert1 und Wert2.

von Lars (Gast)


Lesenswert?

So gesehen fehlt einiges^^

hatte ja den ganzen Initialisierungsanfang weg gelassen...
1
.equ     Wert1,    0X19
2
.equ    temp1,     0X1A
3
.equ    temp2,    0X1B
4
.equ    Wert2,    0X18

von Lars (Gast)


Lesenswert?

Also, die gute Nachricht ist, dass es jetzt läuft- allerdings nicht so 
wie ich es mir dachte.

Ich rufe jetzt jedesmal wenn ich den Wert2 brauche ein Unterprogramm 
auf:
1
AVR-Assembler-Code
2
getMessst:
3
      ldi    EK, 0b00000000    ;ADC initialisieren  
4
      out    ADMUX, EK
5
6
      sbi     ADCSRA, ADSC     ; den ADC starten 
7
8
wait_adc2:
9
        sbic    ADCSRA, ADSC   ;wenn der ADC fertig ist, wird dieses Bit gelöscht
10
        rjmp    wait_adc2
11
        reti

und habe die entsprechenden Teile aus dem Interrupt-Aufruf gelöscht.

So funktioniert es zwar erst mal- aber so werden halt nicht 
kontinuierlich Werte an der Schnittstelle übergeben. Dies ist zwar nicht 
so schlimm, da sie zur Zeit nur zur Kontrolle visualisiert werden, aber 
es ärgert mich schon, das ich es nicht hinbekomme- ich hoffe also immer 
noch auf eine Idee von jemanden wo der Fehler liegt, bzw wie man es 
"richtig" macht.

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.