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
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