mikrocontroller.net

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


Autor: Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
on:   sbrc  EK, 0        ;wenn zuletzt Wert1 ausgelesen wurde,    
      rjmp  onWert2      ;dann springe zum Verarbeiten des Wert2
      ;------------------------------------------------------------------
onWert1:    ;verarbeiten von Wert1
      push   temp1       ;rette  die Temps
      push   temp2        
    
      in     temp1, ADCL ;lese den Wert1 aus
      in     temp2, ADCH
      ;-----------------------
      asr    temp2       ;Die 8 MSB auslesen
      ror    temp1
      asr    temp2
      ror    temp1
      mov    Wert1, temp1
      
putChar:  
      sbis  UCSRA, 5     ;gebe die Daten aus
      rjmp   putChar
      out    UDR, Wert1
      
      ldi   EK, 0b00000001 ;initialisiere C1
      out    ADMUX, EK
      sbi     ADCSRA, 6  ;starte nächste Messung
        
      pop    temp2       ;schreibe die Temps zurück
      pop    temp1
      reti               ;und zurück ins Hauptprogramm
      ;------------------------------------------------------------------
onWert2:    ;aufnehmen von Wert2
      push   temp1       ;rette  die Temps
      push   temp2
      
      in     temp1, ADCL ;lese den Wert2 aus
      in     temp2, ADCH
      ;-----------------------
      asr    temp2       ;Die 8 MSB auslesen
      ror    temp1
      asr    temp2
      ror    temp1
    
      mov    Wert2, temp1
      ;-----------------------
putChar1:          
      sbis  UCSRA, 5
      rjmp  putChar1
      out   UDR, Wert2

      ldi   EK, 0b00000000 ;wechsel zu C0
      out    ADMUX, EK
      sbi     ADCSRA, 6  ;nächste Konvertierung
            
      pop    temp2       ;schreibe die Temps zurück
      pop    temp1
    
      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:
phase1:            
      mov    temp1, Wert2
      ldi    temp2, 60
      
      cp     temp1, temp2  ;der Startwert lieg bei 25 und steigt dann bis
      BRSH   phase2        ;60 an, hier soll dann der Motor abgeschaltet
                           ;werden
      sbi    PORTB, 0      ;Motor einschalten
      sbi    PORTB, 1
      rjmp            phase1

phase2:                 
      cbi    PORTB, 0      ;Motor abschalten
      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^^

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da fehlt noch was im Code...
Zeig mal die Definitionen von Wert1 und Wert2.

Autor: Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So gesehen fehlt einiges^^

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

Autor: Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
AVR-Assembler-Code
getMessst:
      ldi    EK, 0b00000000    ;ADC initialisieren  
      out    ADMUX, EK

      sbi     ADCSRA, ADSC     ; den ADC starten 

wait_adc2:
        sbic    ADCSRA, ADSC   ;wenn der ADC fertig ist, wird dieses Bit gelöscht
        rjmp    wait_adc2
        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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.