Ich versuch im Moment den ADC auszulesen und auf die serielle Schnittstelle zu legen. Nur aus irgndeinem Grund funktioniert das ganze nicht wie es soll. Code im Anhang. Fehlerbeschreibung: Mache ich in die Main Loop ein einfaches ldi UART, 'A' rcall serout und kompiliere. dann bekomm ich ständig A's zugeschickt am PC(das funktioniert also!) Nehme ich das wieder raus, und tu diese Auslese-Schleife in die Main, kommt definitiv NICHTS an am PC. Der muss wohl irgndwo in der Busy-waitschleife stehen bleiben. Könnte mir aber nicht vorstellen warum. Jemand ne Idee? Ich verzweifel hier gerade
Überall hast es gemacht: 1<<Bitbezeichnung um ein Bit an die richtige Stelle zu schieben. Statt SBR würde ich lieber "ORI" (OR immediate) verwenden, ist umgänglicher und gibt es in jedem Prozessor. SBR ist eine Erfindung von Atmel und genau das selbe wie ORI (siehe Hilfe in AVR-Studio). Hier ein paar Änderungen: loop: lds temp, ADCSRA ; sbr temp, ADSC ori temp, 1<<ADSC sts ADCSRA, temp not_rdy: ;Anstatt auf den ADC-Interrupt würde ich lieber mit ADSC=0 prüfen, ;ob eine Konvertierung fertig ist (wird vom ADC auf 0 gesetzt, wenn ;fertig). lds temp, ADCSRA ; sbrs temp, ADIF sbrc temp, ADIF rjmp not_rdy ;Was soll das? Im Prinzip wird nur das Hi-Byte seriell ;ausgegeben ; lds UART, ADCL ; lds UART, ADCH ; rcall serout lds UART, ADCL rcall serout ;Zusätzlicher CALL lds UART, ADCH rcall serout rjmp loop Ob das die Lösung Deines Problems ist kann ich nicht versprechen aber ein paar Fehler sind ausgemertzt. MfG Andi
Oh man, der Teil mit dem not_rdy sollte natürlich so aussehen: not_rdy: lds temp, ADCSRA ; sbrs temp, ADIF sbrc temp, ADSC rjmp not_rdy MfG Andi
Nene, das mit den Bytes hab ich mir schon so gedacht ! Es SOLL nur das High-Byte ausgegeben werden. Es gibt ja das ADLAR bit im ADCSRA Register. Damit kann man eine andere Register anordnung aktivieren, damit sich ganz einfach die 8 MSBs lesen lassen. die 2 LSBs liegen in ADCL (siehe ATMEGA48 Datenblatt seite 244 oben): When an ADC conversion is complete, the result is found in these two registers. When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH. The ADLAR bit in ADMUX, and the MUXn bits in ADMUX affect the way the result is read from the registers. If ADLAR is set, the result is left adjusted. If ADLAR is cleared (default), the result is right adjusted. "...aber ein paar Fehler sind ausgemertzt." Tz, das hätt ich jetzt zwar nicht geglaubt, dass es an diesem ORI zeugs liegt, aber genau das wars. Bekomme jetzt die richtigen Daten. Funktionierender Code im Anhang, wer's brauch ;)
Was heißt da "Tz"? Dir wurde geholfen und ein kleines Danke wäre angebracht!!! Das mit dem ADLAR ist mir persöhnkich vollkommen klar und ich kann ja nicht riechen dass das "lds UART,ADCL" ein Überbleibsel ist. Im Prinzip lag es einfach nur daran, das Du das Bit ADSC nicht mit 1<<ADSC an die richtige Stelle gschoben hast und evtl. noch an der Abfrage ob der ADC fertig ist. Ob mit SBR oder ORI ist egal da, wie oben schon erwähnt, beides das selbe ist. MfG Andi
Hallo, Danke erstmal, ist mir vorhin untergekommen :-) Gut, riechen kannst du es natürlich nich, aber so aus dem Zusammenhang und der Kommentierung hätte ich das zuerst vermutet, als dass ich ein rcall serout vergessen hab. Trotzdem Danke vielmals. Und ich hab da gestern Abend noch dran gezweifelt :-)
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.