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


von Hendrik H. (henne)


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.
1
Initialisierung:
2
  ldi  tempL, 0b01100111 ;internal 5V reference, left adjusted, ch7
3
selected
4
  out  ADMUX, tempL
5
  ldi  tempL, 0b11001110 ;start conversion, enable IRQ, prescaler is
6
64
7
  out  ADCSRA, tempL
8
  clr  DMXstate
9
10
ADC-ISR:
11
get_manual:
12
    in    SREGbuf, SREG
13
    push  ZH
14
    push  ZL
15
16
    ldi    ZH, high(manual_table)    ;'switch' in asm ;-) 
17
    ldi    ZL, low(manual_table)    ;get manual process ID
18
    add    ZL, DMXstate        ;abuse DMX state for manual mode
19
    adc    ZH, null
20
    ijmp
21
22
  
23
  gm_focus:
24
    ldi    DMXstate, 0xFF      ;Focus data ready
25
    in    ZL, ADCL
26
    in    ZL, ADCH        ;get data
27
    ldi    ZH, 0b01100111      ;select Pan
28
    out    ADMUX, ZH
29
30
out    OCR1AH, null          ;debug
31
out    OCR1AL, ZL 
32
33
    cpi    ZL, 80
34
    brlo  gm_dec_focus
35
    cpi    ZL, 175
36
    brsh  gm_inc_focus
37
     gm_focus_stop:
38
    sbi    PortC, ON_FOCUS      ;disable focus motor
39
    rjmp  gm_exit
40
    gm_dec_focus:
41
      sts    sFocus, null      ;set Sollwert
42
    rjmp  gm_exit
43
    gm_inc_focus:
44
      ldi    ZL, 0xFF        ;set Sollwert
45
    sts    sFocus, ZL
46
    rjmp  gm_exit
47
48
  gm_pan:
49
    in    ZL, ADCL
50
    in    ZL, ADCH        ;get data
51
    sts    sPan, ZL
52
    ldi    ZL, 0b01100110      ;select Tilt
53
    out    ADMUX, ZL
54
    rjmp  gm_exit
55
56
  gm_tilt:
57
    in    ZL, ADCL
58
    in    ZL, ADCH        ;get data
59
    sts    sTilt, ZL
60
    ldi    ZL, 0b01100101      ;select Focus
61
    out    ADMUX, ZL
62
    rjmp  gm_exit
63
64
  gm_exit_ex:
65
    in    ZL, ADCL
66
    in    ZL, ADCH        ;get data      
67
  gm_exit:
68
    inc    DMXstate
69
    ldi    ZL, 0b11001110      ;start conversion, enable IRQ, prescaler is 64
70
    out    ADCSRA, ZL
71
    pop    ZL
72
    pop    ZH
73
    out    SREG, SREGbuf
74
    reti
75
76
manual_table:
77
    rjmp gm_exit_ex
78
    rjmp gm_pan
79
    rjmp gm_exit_ex
80
    rjmp gm_tilt
81
    rjmp gm_exit_ex
82
    rjmp gm_focus

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

Viele Grüße, Hendrik

von Hendrik H. (henne)


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

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.