Hallo an Alle!
Ich habe es endlich geschafft bei meinem AVR Board Light die zwei
Potentiometer anzuschließen und die Signale an meinen PCzu senden.
Das merkwürdige ist jetzt, dass nur einer der beiden konstant richtige
werte liefert. Der andere schwankt enorm hin und her. Ich bin neu auf
diesem Gebiet und habe keine Ahnung wodran es liegen könnte. Mit nur
einem Potentiometer an dem AD Wandler angeschlossen hab ich keine
Probleme...
Hier ist der Assembler Code den ich benutze:
Kenn mich mit zwar mit AVR nicht gut aus, aber nochmalerweise muss du
dem AD Port ein bißchen Zeit geben um sich zu stabilisieren. Wenn du zu
schnell bist kommt nur Müll bei raus.
Was auch hilfreich ist mehrfach hintereinander einlesen und dann
auswerten.
Schau auch das deine Eingangsbeschaltung dem Bsp. aus dem Datenblatt
enspricht.
Gruß
Sebastian
> Ist es ein Softwareproblem oder ien Hardwareproblem?
Hehe, du machst ja deinem Namen alle Ehre und verheimlichst den
Schaltplan und bietest stattdessen nur ein Softwarelisting. Damit ist
deine Frage eine Fangfrage geworden. Softwareproblem natürlich! Nee
halt! Oder Hardwareproblem! Oder beides?
Hallo Sascha!
Wie finde ich heraus wie schnell mei ADC-Takt ist? Ich bin ein totaler
Neuling in der Microkontroller Programmierung :(
Bei dem ATmega8 gehen zwischen 50 und 200 kHz.
Peter
PeterNoPlan schrieb:> Hallo Sascha!>> Wie finde ich heraus wie schnell mei ADC-Takt ist? Ich bin ein totaler> Neuling in der Microkontroller Programmierung :(>> Bei dem ATmega8 gehen zwischen 50 und 200 kHz.
jo, die untersten 3 Bit in ADCSRA sind die Taktteilerbits.
Bei dir sind alle 0 und damit ist der Teiler=2
3,386MHz / 2 = 1,84MHz
dein Teiler sollte mid. 32 betragen => 115kHz
damit müssen die unteren 3 Bits in ADCSRA 101 sein (siehe Seite 205)
Sascha
Okay also ich hab das mal mit dem rcall und dem reti bereinigt. Auch das
mit den Taktteilerbits habe ich glaube ich korrekt gelöst. Wo genau muss
ich jetzt eine Verzögerung reinmachen, damit die 2. AD Wandlung nicht
immer zwischen o und dem richtigen Wert springt?
direkt nach dem ADMUX Befehl?
PeterNoPlan schrieb:> ldi r16,0b10000101 ;Wandlung starten> out ADCSRA,r16> sbi ADCSR,ADSC> ldi r16,0b01000000 ;PortC.0 einlesen> out ADMUX,r16Oliver J. schrieb:> Sollte man ADMUX nicht konfigurieren, bevor eine Wandlung startet?
Sehe ich auch so.
Skua C:\> schrieb:> Versuch mal so.> ldi r16,0b01000000 ;PortC.0 einlesen> out ADMUX,r16> ldi r16,0b10000101 ;Wandlung starten> out ADCSRA,r16> sbi ADCSR,ADSC>> PeterNoPlan schrieb:>> Was meinst du mit konfigurieren?>> Gemeint ist das beschreiben des Registers
Okay danke! Trotzdem bleibt das Problem weiterhin bestehen. Wo muss ich
jetzt eine Verzögerung einfügen, damit der ADMUX sich erholen kann?
Oliver J. schrieb:> Aktiviert reti nicht global die Interrupts? Sollte man das wirklich> verwenden, um eine Subroutine zu verlassen?
Jetzt bin ich noch verwirrter :D Eben hies es doch noch ich soll immer
mit reti einen rcall abschließen...
Oliver J. schrieb:> PeterNoPlan schrieb:>> Jetzt bin ich noch verwirrter :D Eben hies es doch noch ich soll immer>> mit reti einen rcall abschließen...>> Wer schreibt das?
Oh Tatsache! Habe mich verlesen... anstatt ret hab ich reti
geschrieben...
Löst trotzdem mein Problem nicht :(
Hi
> sbis ADCSR,ADIF ;Warten bis Wandlung beendet ist
Was soll denn die Abfrage von ADIF?
Datenblatt:
ADSC will read as one as long as a conversion is in progress. When the
conversion is complete, it returns to zero.
Also Frage ADSC ab. ADIF musst du nämlich auch noch per Hand
zurückstellen.
MfG Spess
Oliver J. schrieb:> PeterNoPlan schrieb:>> Löst trotzdem mein Problem nicht :(> Hätte mich auch gewundert. :)>> Versuch das Warten aufs Ergebnis mal so (auch bei Messung1):messung2:> [...]> wait2:> sbis ADCSR,ADIF ;Warten bis Wandlung beendet ist> rjmp wait2
Hmm scheint auch nicht zu gehen:
spess53 schrieb:> Hi>>> sbis ADCSR,ADIF ;Warten bis Wandlung beendet ist>> Was soll denn die Abfrage von ADIF?>> Datenblatt:>> ADSC will read as one as long as a conversion is in progress. When the> conversion is complete, it returns to zero.>> Also Frage ADSC ab. ADIF musst du nämlich auch noch per Hand> zurückstellen.>> MfG Spess
Wenn ich ADSC abfrage funktioniert nurnoch einer der beiden
Potentiometer. Das kann doch nicht sein :(
Ich verzweifel gerade wirklich...
Hat nicht jemand zufällig ein Beispielcode um 2 Analoge WErte zum PC zu
schicken?
Hallo,
> sbis ADCSR,ADSC ;Warten bis Wandlung beendet ist> rjmp ...
Das scheint mir nicht korrekt zu sein; hier sollte es eher lauten:
>> sbic ADCSR,ADSC ;Warten bis Wandlung beendet ist>> rjmp ...
Schliesslich wird das ADSC-Bit am Ende der Wandlung zurückgesetzt, und
erst dann soll es weitergehen ...
Und das "reti" am Ende der Messungs-Routinen sollte durch ein "ret"
ersetzt werden, denn das "reti" beendet eine Interrupt-Routine (auch
wenn das "reti" hier auch funktionieren würde, da keine Interrupts
freigegeben sind).
Hallo an alle! Ich habe das Problem mit den 2 Potentiometern noch immer
nicht gelöst.
Ich bekomme zwar korrekte Werte von dem einen doch der andere ist
einfach nur komisch...
Er gibt als minimalwert immer 15 aus. Außerdem springt der Wert nach 3-5
korrekten werten immer auf 0 zurück und dann geht es wieder von vorne
los...
Ich habe ein Screenshot angehängt, damit ihr sehen könnt, was ich meine.
Im folgenden ist natürlich mein derzeitiger Assembler Code:
spess53 schrieb:> HI>>> sbis ADCSR,ADIF ;Warten bis Wandlung beendet ist>> Beratungsresistent?>> MfG Spess
Nicht wirklich. Ich habe es mit sbic getestet aber danach kam garnichts
mehr an.
schließ doch mal die Hardware aus, indem du die Potis an den
ADC-Eingängen tauschst. Oder du kommentierst den funktionierenden im
Programm aus.
Damit kannst du doch rausbekommen, ob es ein Hardwareproblem ist oder ob
die zwei ADC-Abfragen im Programm schuld sind.
Du weißt dann zumindest das beide Poti unabhängig voneinander
funktionieren.
> out ADCSRA,r16> sbi ADCSR,ADSC
^^
Warum zwei verschiedene Registernamen? Die korrekte Bezeichnung des
ADC-Steuerregisters ist "ADCSRA" (in beiden Fällen).
> ldi r16,0b11100101 ;Wandlung starten> out ADCSRA,r16> sbi ADCSR,ADSC
Hier werden im Steuerregister einige "falsche" Bits gesetzt. Bei der
unschönen Binärdarstellung ist dies nur schwer erkennbar:
- Das Bit "ADFR" ist gesetzt; für den Single-Betrieb nicht korrekt (auf
0 setzen)
- Der ADC wird zweimal getriggert. Einmal durch Schreiben des ganzen
Registers (Bit "ADSC" ist hier gesetzt) und noch mal durch explizites
Setzen von ADSC. Hier sollte beim Schreiben von ADCSRA das "ADSC" Bit 0
sein.
Also so wie hier:
Okay, ich habe jetzt mal die Potis vertausch und jetzt funktioniert der
ander nicht mehr, weshalb ich einen Hardwaredefekt ausschließe.
ist der Quellcode so jetzt richtig?