PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : zwei ADC vergleichen



The Man
09.03.2007, 12:53
Hallo,

ich möcht zwei ADC Werte mit einander vergleichen.
Tests habe ich schon gemacht und WEISS, dass beide ADC Routinen für sich alleine funktionieren ergo auch der Channel switch.
Nur wenn ich deren Werte vergleichen will. komme ich nicht weiter.
Ich habe es sowohl mit BRLO wie mit auch BRSH und danach CP versucht und auch jeweils das ein- und ausschalten des PORTB getauscht.
Hier der Code:


mainloop: wdr
out ADMUX,r16;AVcc-left_adjusted-channel 1

bis_convertet1:
in r20,ADCSRA
ori r20,0b11101111
cpi r20,0b11111111
brne bis_convertet1
in r17,ADCH
out ADMUX,r18;AVcc-left_adjusted-channel 0
bis_convertet2:
in r20,ADCSRA
ori r20,0b11101111
cpi r20,0b11111111
brne bis_convertet2
in r19,ADCH
cp r17,r19
brsh an
ldi r21,0b00000000
out PORTB,r21
rjmp mainloop
an:
ldi r21,0b11111111
out PORTB,r21

;Hier den Quellcode eintragen.
rjmp mainloop



Danke,
The Man

ogni42
09.03.2007, 13:08
Wo setzt Du denn die Werte für r16, r18 und DDRB?

The Man
09.03.2007, 13:57
Im INIT Code - wie gesagt, der Kanalwechsel funktioniert ja auch

wkrug
09.03.2007, 19:41
Nach dem CP r17,r19 könntest Du auch ein BRCC einfügen.
Das wird dann aktiv wenn der rechte Wert kleiner oder gleich dem linken ist.

Hat bei mir immer funktioniert.

ogni42
09.03.2007, 20:04
wie testest Du das denn hardwaremässig, bzw. mit dem Simulator?

The Man
10.03.2007, 08:07
Ich hab im Sourcecode das cp durch cpi und jeweils ein Register durch eine Konstante erstetzt. Mittels Poti hab ich dann änderungen im entsprechenden Kreis vorgegaukelt.

The Man
10.03.2007, 10:51
Da bin ich wieder,
ich hab natürlich weiter versucht und kann absolut nicht mehr nachvolziehen, was der µC da macht. Im unteren Bild ist die von mir genutzte Hardware zum testen. Die LAmpen, die da im Moment leuchten, haben nichts zu sagen, das Foto stammt von vorigen Programmen. Die Led´s sind über FET´s an den PORTB des ATmega8 angeschlossen, die eingabe Elemente an PORTC.
Ich schätzte mal, was mir im oben geposteten Prog ein Bein gestellt hat, war der Freerunning Mode des ADC.
Eigentlich soll das Prog den ADC Wert von Kanal 1 und 2 einlesen und jew. speichern. Um zu sehen, ob die ADC Schleifen für sich funktionieren, habe ich hier nich nicht den CP Befehl sondern den CPI benutzt(also Register und Konstante). Eigentlich müsste ich ja dann jenachdem welches Reg. ich da wähle entweder mit dem Poti oder dem Taster den PORTB beeinflussen können. Was aber passiert ist aber das: wenn der Poti den konstanten Wert erreicht, geht PORTB auf 0b00000000. Wenn ich während PORTB 0b11111111
ist, den Taster drücke, werden die LED´s dunkler. Daraus schließe ich, das da irgendwo ein ungewolltes PWM rumgeistert. Außerdem kann ich mit dem Taster keinen Einfluss nehmen, wenn der Poti unterhalb der 100 ist. UND jetzt der Hammer: das Verhalten ist immer gleich, egal ob ich mit r17 oder r 19 vergleiche :shock:
hier der Code:


;Start, Power ON, Reset
main: ldi r16,lo8(RAMEND)
out SPL,r16
ldi r16,hi8(RAMEND)
out SPH,r16
ldi r16,0b00000000
out DDRC,r16
ldi r16,0b11111111
out DDRB,r16
ldi r31,0b11000101 ;adc-enable/start_conversion/clk:32
ldi r16,0b01100001 ;AVcc-left_adjusted-channel 1 => Taster
ldi r18,0b01100010 ;AVcc-left_adjusted-channel 2 => Poti
ldi r30,0b00000000

;Hier Init-Code eintragen.
;------------------------------------------------------------------------
mainloop: wdr
out ADCH,r30 ;zum clearen von ADCH und ADCL
out ADCL,r30 ;zum clearen von ADCH und ADCL
out ADMUX,r16 ;AVcc-left_adjusted-channel 1 => Taster
out ADCSRA,r31 ;adc-enable/start_conversion/clk:32
bis_convertet1:
in r20,ADCSRA
ori r20,0b11101111
cpi r20,0b11111111
brne bis_convertet1
in r1,ADCH
mov r17,r1
out ADCH,r30 ;zum clearen von ADCH und ADCL
out ADCL,r30 ;zum clearen von ADCH und ADCL
out ADMUX,r18 ;AVcc-left_adjusted-channel 2 => Poti
out ADCSRA,r31 ;adc-enable/start_conversion/clk:32
bis_convertet2:
in r20,ADCSRA
ori r20,0b11101111
cpi r20,0b11111111
brne bis_convertet2
in r2,ADCH
mov r19,r2
cpi r17,100 ;VERGLEICH-VERGLEICH-VERGLEICH
brcc an
ldi r21,0b11111111
out PORTB,r21
rjmp mainloop
an:
ldi r21,0b00000000
out PORTB,r21



;Hier den Quellcode eintragen.
rjmp mainloop


Danke,
The Man

albundy
10.03.2007, 14:16
etwas chaotisch, dein Code ...
sieh Dir mal das Beispiel an.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

Vor allem das Warten, bis die Conversion beendet ist und das Einlesen der Werte.