PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADCProblem Teil 2



moonwalker99
18.03.2006, 11:43
Hi,

ich lese ganz primitiv die ersten zwei ADC-Kanäle ein, vergleiche sie und steuer nacheinander zwei Ausgänge die eine Rechts bzw. eine Linksfahrt ausführen.
Mit dem JTAG-MK II Interface und Einzel-Step funktioniert das programm problemlos, lasse ich jedoch den ATMEGA das ganze alleine machen, tut sich überhaupt nichts.

.include "m16def.inc"
.def temp =r16
.def vergleichlow =r18
.def vergleichhigh = r19
.org 0x000
rjmp main ;Reset Handler


;-------------------------------------------------
main:
ldi temp, LOW(RAMEND)
out SPL,temp
ldi temp, HIGH(RAMEND)
out SPH,temp

ldi temp,0xFF
out ddrb,temp
cbi adcsr, adfr
sbi adcsr, adps0
sbi adcsr, adps1
sbi adcsr, adps2
cbi ADCSR,ADIE
sbi adcsr,aden



;-------------------------------------------------------

grundposition:

sbi adcsr,aden
kanal0:
ldi temp,0b01000000
out admux, temp

sbi adcsr, adsc
AD_busy: sbis ADCSR,ADIF ;Flag da?, busy?
rjmp AD_busy ;springt raus, wenn fertig
in zl,adcl
in zh,adch

ldi vergleichlow,100
ldi vergleichhigh,0b00000010


CP vergleichlow,zl ; Vergleiche untere Bytes
CPC vergleichhigh,zh ;Vergleiche obere Bytes

brbs 0,aus
sbi portb,6
rjmp an
aus:
cbi portb,6
cbi adcsr,aden
rjmp kanal1
an:
rjmp grundposition


kanal1:

sbi adcsr,aden

ldi temp,0b01000001
out admux, temp

sbi adcsr, adsc
AD_busy1: sbis ADCSR,ADIF ;Flag da?, busy?
rjmp AD_busy1 ;springt raus, wenn fertig
in yl,adcl
in yh,adch

ldi vergleichlow,162
ldi vergleichhigh,0b00000001


CP vergleichlow,yl ; Vergleiche untere Bytes
CPC vergleichhigh,yh ;Vergleiche obere Bytes

brbs 0,aus1
sbi portb,4
rjmp an1
aus1:
cbi portb,4
cbi adcsr,aden
rjmp abfrage
an1:
rjmp kanal1

abfrage:
rjmp main


Das mit den Analogeingängen ist wirklich sehr suspekt....

Für Hilfe wäre ich sehr dankbar.

PS: Der Prescaler ist auf 64 da der Takt momentan auf Internen 8Mhz steht. Es handelt sich um einen ATMEGA 16

moonwalker99
18.03.2006, 14:41
Es scheint so als ob der ADC was anderes misst wenn man mit dem JTAG ICE debuggt als ohne das ICE... kann sich das einer erklären?!

Ich versuche mal das Problem zu konkretisieren:

Ich lese einen Spannung ein, über ein Poti, (4,7Kohm). Das Poti gibt mir eine Spannung von 0-5V auf den Analogeingang. Ist diese Schaltung überhaupt korrekt, oder muss da noch irgendwas dran? Also der eine Fuß ist an Masse, der andere an 5V und der Abgriff auf dem ADC-Port.
Das ganze sitzt auf einer Drehbaren Achse (Roboterarm). Ich fahre von unten einen Wert an, funktioniert recht sauber, bleibt ziemlich genau dort stehen wo ich will. Nun fahre ich das ganze drüber raus und das stelle ich über vergleichen korrekt fest, das ich drüber bin. Nun fährt der Arm aber nicht wieder so zurück wie ich es möchte. Das ganze ist sehr suspekt.
Muss ich da evtl irgendwas an der Schaltung ändern? Ich hoffe ihr versteht ungefähr um was es sich dreht.

Grüße

Bernhard.Erfurt
25.03.2006, 02:45
Da fehlt was:

CP vergleichlow,yl ; Vergleiche untere Bytes
CPC vergleichhigh,yh ;Vergleiche obere Bytes

besser so:

CP vergleichlow,yl ; Vergleiche untere Bytes
Verzweigungsbefehl....
CPC vergleichhigh,yh ;Vergleiche obere Bytes
Verzweigungsbefehl....


kleiner Tipp:


ldi vergleichlow,162
ldi vergleichhigh,0b00000001

besser wäre:

ldi vergleichlow,low(WERT)
ldi vergleichhigh,high(WERT)

Denn ein anderer muss ewig rechnen.

----------

Der ADC-Wert wird nicht korrekt eingelesen.

Schau mal, ob Du hier ein paar Anregungen abgucken kannst :)

in temp, ADMUX
andi temp, 0b11100000
subi temp, -2 ; KANAL 2
out ADMUX, temp



; neuen ADC-Wert lesen Wert verwerfen, da meist vom vorherigem ADC-Kanal
sbi ADCSRA, ADIF ; logisch "1" löscht ADIF flag !

MESSEN_ww:
sbis ADCSRA, ADIF ; warten bis ADIF flag gesetzt
rjmp MESSEN_ww

; neuen ADC-Wert lesen
sbi ADCSRA, ADIF ; logisch "1" löscht ADIF flag !

MESSEN_www:
sbis ADCSR, ADIF ; warten bis ADIF flag gesetzt
rjmp MESSEN_www

; ADC einlesen:
in temp1, ADCL ; immer zuerst low byte lesen
in temp2, ADCH ; danach das mittlerweile gesperrte high byte