mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC - Kanalwechsel (mega16, asm)


Autor: Hendrik Hölscher (henne)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
ich habe zZ. ein ziemliches merkwürdiges Problem mit dem ADC eines
mega16:
Es sollen ch5-7 nacheinander immer wieder eingelesen werden -
allerdings wird momentan als Ergebnis für alle 3 ch das Maximum der
Eingänge genommen. (Bsp.: ch5=2.5V, ch6,7 = GND -> ch5,6,7 = 128 da
8bit)

Ich habe bereits Datasheet, Beispielcodes, ANs und das Forum
durchsucht, leider aber ohne Erfolg.
Initialisierung:
  ldi  tempL, 0b01100111 ;internal 5V reference, left adjusted, ch7
selected
  out  ADMUX, tempL
  ldi  tempL, 0b11001110 ;start conversion, enable IRQ, prescaler is
64
  out  ADCSRA, tempL
  clr  DMXstate

ADC-ISR:
get_manual:
    in    SREGbuf, SREG
    push  ZH
    push  ZL

    ldi    ZH, high(manual_table)    ;'switch' in asm ;-) 
    ldi    ZL, low(manual_table)    ;get manual process ID
    add    ZL, DMXstate        ;abuse DMX state for manual mode
    adc    ZH, null
    ijmp

  
  gm_focus:
    ldi    DMXstate, 0xFF      ;Focus data ready
    in    ZL, ADCL
    in    ZL, ADCH        ;get data
    ldi    ZH, 0b01100111      ;select Pan
    out    ADMUX, ZH

out    OCR1AH, null          ;debug
out    OCR1AL, ZL 

    cpi    ZL, 80
    brlo  gm_dec_focus
    cpi    ZL, 175
    brsh  gm_inc_focus
     gm_focus_stop:
    sbi    PortC, ON_FOCUS      ;disable focus motor
    rjmp  gm_exit
    gm_dec_focus:
      sts    sFocus, null      ;set Sollwert
    rjmp  gm_exit
    gm_inc_focus:
      ldi    ZL, 0xFF        ;set Sollwert
    sts    sFocus, ZL
    rjmp  gm_exit

  gm_pan:
    in    ZL, ADCL
    in    ZL, ADCH        ;get data
    sts    sPan, ZL
    ldi    ZL, 0b01100110      ;select Tilt
    out    ADMUX, ZL
    rjmp  gm_exit

  gm_tilt:
    in    ZL, ADCL
    in    ZL, ADCH        ;get data
    sts    sTilt, ZL
    ldi    ZL, 0b01100101      ;select Focus
    out    ADMUX, ZL
    rjmp  gm_exit

  gm_exit_ex:
    in    ZL, ADCL
    in    ZL, ADCH        ;get data      
  gm_exit:
    inc    DMXstate
    ldi    ZL, 0b11001110      ;start conversion, enable IRQ, prescaler is 64
    out    ADCSRA, ZL
    pop    ZL
    pop    ZH
    out    SREG, SREGbuf
    reti

manual_table:
    rjmp gm_exit_ex
    rjmp gm_pan
    rjmp gm_exit_ex
    rjmp gm_tilt
    rjmp gm_exit_ex
    rjmp gm_focus



Falls jmd. von Euch ein Licht aufgeht - ich wäre für jede Hilfe
dankbar!

Viele Grüße, Hendrik

Autor: Hendrik Hölscher (henne)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler gefunden:
ungetestete Ch waren scheinbar floating -> der Mux hat einen fiesen
Signalabstand -> höchster Wert setzt sich auf allen ch durch.

...das dauerte jetzt >4h - seid also bitte schlauer!

Grüße, Hendrik

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.