-
        

Ergebnis 1 bis 3 von 3

Thema: ADCProblem Teil 2

  1. #1

    ADCProblem Teil 2

    Anzeige

    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.
    Code:
    .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

  2. #2
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.02.2005
    Ort
    Erfurt
    Alter
    52
    Beiträge
    134
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •