Jag är fortfarande ganska ny på µC och tänkte be om lite feedback angående muxen till AD omvandlaren på min ATmega88. Jag började med att koppla upp ADCn till en potentiometer som skickade ut värdet på lysdioderna på mitt STK500 vilket funkade bra. Sedan gjorde jag om programmet till att få en lysdiod att lysa proportionellt mot värdet från ADCn med pwm. So far so good. Men sen skulle jag koppla på flera lysdioder som jag ställde med varsin potentiometer på varsin AD-pinne - och då fick jag problem.
Vet inte om det är jag som inte förstår hur en multiplexer ska fungera, men här är min teori.
I databladet hittar man följande (del av) tabell
- MUX3..0 Single ended input
0000 ADC0
0001 ADC1
0010 ADC2
0011 ADC3
- PC0 (ADC0) ;Alltså port C pinne 0
om nån inte fatta det
PC1 (ADC1)
Detta tolkar jag som så att om man tex i ett program ska läsa in 2 analoga värden så sätter man tex först muxen på 0000 (de sista bitarna) och gör sen en konvertering och sparar undan det värdet till det registret som är funktionsmässigt är kopplat till PC0. Sen sätter man muxen till 0001 och lägger in det värde man får i registret som har att göra med signalen på PC1. FEL.
Det fungerar om man i programmet bara gör EN inläsning, men inte med två. Lösningen för två fungerar inte heller för 3 osv. Följande koppling mellan port-pinne och muxen har jag kommit fram till gäller (som funktion av # AD-pinnar som används).
Kod: Markera allt
MUX Single ended input
0000 PC0 PC1 PC1 PC1
0001 PC0 PC2 PC3
0010 PC0 PC2
0011 PC0
Allså. Om jag tex ska läsa in två analoga värden så får jag korsa registren eller i muxen mot fallet där jag bara läser in 1. Allt fungerar som det ska i övrigt i mina program, det är bara just denna korsning som förbryllar mig. Och det var ju inte sådär direkt som jag hittade felet heller
Bifogar kodavsnittet som hämtar det analoga. Funktionen GET_ANALOG är tillfälligt ersatt för att underlätta debuggning, men MAIN anropar dessa 2 direkt efter varandra. Använder vänsterjustering.
Kod: Markera allt
;GET_ANALOG:
;Returns the analog value on PC0..1 to digital 8 bit
;values in reg OutPwmL and OutPwmR resp.
;FAULTY? Will work correct but it seams as if the ADCMUX
;mixes the signals somehow?? See comment and look in
;to before final version.
Get_Left:
ldi Temp,0b00100001 ;For some reason this reads PC0 when use 2 first ADCX.
sts ADMUX,Temp ;Set mux to read left phototr, on PC0.
ldi Temp,0b11000000 ;Keep ADC enabled and start conversion.
sts ADCSRA,Temp
WAIT_L: ;Wait for conversion to finish.
sbic ADSC,6
rjmp WAIT_L
lds OutPwmL,ADCH
rcall GENERAL_DLY ;Let ADC reset.
ret
Get_Right:
ldi Temp,0b00100000 ;For some reason this reads PC1 when use 2 first ADCX.
sts ADMUX,Temp ;Set mux to read right phototr, on PC1.
ldi Temp,0b11000000 ;Keep ADC enabled and start conversion on PC1.
sts ADCSRA,Temp
WAIT_R:
sbic ADSC,6
rjmp WAIT_R
lds OutPwmR,ADCH
rcall GENERAL_DLY
ret
mvh