-         

+ Antworten
Ergebnis 1 bis 8 von 8

Thema: zwei ADC vergleichen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473

    zwei ADC vergleichen

    Anzeige

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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    49
    Beiträge
    1.195
    Wo setzt Du denn die Werte für r16, r18 und DDRB?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    Im INIT Code - wie gesagt, der Kanalwechsel funktioniert ja auch

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.823
    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.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    49
    Beiträge
    1.195
    wie testest Du das denn hardwaremässig, bzw. mit dem Simulator?

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    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.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    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
    hier der Code:
    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken test_319.jpg  

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    etwas chaotisch, dein Code ...
    sieh Dir mal das Beispiel an.

    http://www.mikrocontroller.net/artic...-Tutorial:_ADC

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

+ Antworten

Berechtigungen

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