Hallo, wie noch in Auszuegen folgt habe ich ein Programm geschrieben u. a. um den ADC auszulesen. Durch einen rjmp-Befehl komme ich am Ende wieder an den Anfang des Programmes springt. In der Simulation (AVR-Studio) werden bei jedem Durchgang neue Werte in die Register geschrieben (wenn sich diese aendern). In der Praxis aber sendet mir mein Controller jeweils immer nur den ersten eingelesenen Wert. Woran koennte das liegen? Anbei Auszuege: ; Initialisierung ; --------------- ldi all0, ((1<<ADEN)|(1<<ADSC)|(1<ADFR))+7 out ADCSR, all0 ldi all0, RAMEND out SPL, all0 input: ldi all0, 0 out ADMUX, all0 in batl, ADCL in bath, ADCH ldi all0, 1 out ADMUX, all0 in senl, ADCL in senh, ADCH ldi all0, 2 out ADMUX, all0 in widl, ADCL rcall spg_category rcall sen_correct ret Vielen Dank, Thomas H.
Nach dem du einen anderen AD-Kanal ausgewählst, solltest du ne weile warten. Kannst also z.B. den ersten Wert auswerten und darstellen oder in ner Loop-Schleife ein bischen Zeit vergeuden.
Ich habe mich getaeuscht. Mein Controller liesst ueberhaupt keine Werte ein. Woran kann das nun liegen. Ich habe eigentlich alles initialisiert (glaube ich). Was, das kann man ja oben sehen. Weiss da jemand Rat? Thomas H.
Ist das ein schreibfehler von dir das bei der Initialisierung "...|(1<ADFR)..." eine eckige Klammer fehlt? Bei sowas schreib ich lieber die Bitfolge hin (0b11100111). Den Stackpointer würde ich als erstes setzen. Aber ob das dein Problem ist, kann ich nicht sagen. Versuch doch mal nur einen Kanal auszulesen . . . ldi all0, RAMEND out SPL, all0 ldi all0, ((1<<ADEN)|(1<<ADSC)|(1<<ADFR))+7 out ADCSR, all0 ldi all0, 0 out ADMUX, all0 input: in batl, ADCL in bath, ADCH ;do some blabla rjmp input
Hallo Steffen, an der Klammer liegt es nicht. Ich habe auch schon die Bitfolge versucht. Das mit einem Kanal auch und den ganzen Controller habe ich auch schon gewechselt. Durch Tests habe ich herausbekommen, dass bei einem Aufruf in die Register immer Nullen geschrieben werden (ADCL + ADCH). Vorherige Inhalte werden geloescht. Ich weiss nicht mehr so recht weiter. Kann es an irgendwelchen Interrupts liegen? Tschau, Thomas H.
Hallo auch, in der Codesammlung hier im Forum gibt es ein Listing für ADC Single und Free Run. Den schaue dir mal an. Dann ist dir sicher geholfen. Ach ja, welcher Controller ist das eigentlich? Gruß, Günter
Hallo Guenther, es handelt sich um einen AT90S2333. In der Codesammlung habe ich auch schon nachgesehen. Etwas was 1:1 passen wuerde habe ich nicht gefunden aber dennoch recht hilfreiche Tipps. Ich habe auch schon solche Listings eingebaut, aber es hat trotzdem nicht funktioniert. Darum suche ich nach wie vor nach einem auf das noetigste abgespeckte Programm wo ich genau sehe worauf es ankommt bzw. vor allem was ich vorher initialisieren muss. Ich bin fast schon mit meine Ideen am Ende. Viele Gruesse, Thomas H.
Hallo auch, habe grade was in die Codesammlung gepostet. Diese Routine haut hin, achte aber auch auf den Nachtrag. Probiers mal aus. Bei Fragen, fragen! Gruß, Günter
Deine Initialisierung ist schon IO. Bei mir funktionierts so jedenfalls. Hab dir aber mal meine AD.INC angefügt. Mit ad_init wird der freerun-Modus ausgewählt und die AD-Wandlung gestartet, sowie Kanal 0 ausgewählt. Nach dem Umschalten der Kanäle muss ich aber ne weile warten. Währe zwar nicht schlecht, wenn man sofort die Werte des anderen Kanals bekommen würde, aber man kann die Zeit ja auch sinnvoll einsetzen. Beispielsweise im SRAM zwischenspeichern, mathematische Funktionen Aufrufen...etc.
Vielen Dank fuer die zahlreiche Mithilfe und Beteiligung! Ich habe jetzt die beiden oberen Codes von euch 1:1 uebernommen und es funktioniert. Ich weiss zwar immer noch nicht warum meines nicht funktioniert hat, da es am Ende eigentlich das Gleiche (od. Selbige) war - aber es geht jetzt. Meine Fehlersuche hat nun etwas mehr Zeit. Nachmals vielen Dank und das ist ein tolles Forum, Thomas H.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.