Hallo, ich bin gerade ziemlich ratlos, habe gestern den ganzen Nachmittag damit verbracht, den ADC im ATTINY25 zum laufen zu bringen... leider nur mit einem Teilerfolg. Da ich selbst nach einer Nacht drüber schlafen den Fehler nicht finde wende ich mich mal vertrauensvoll und mit der hoffnung um Hilfe an euch :-) Den Schaltplan habe ich im Dateianhang angehängt. Die Beschaltung ist rein eine Testbeschaltung, mehr nicht. Sobald ich das Poti über einen Gewissen Schwellwert drehe sollte die LED leuchten. Jetzt zu meinem Problem: Wenn ich das Poti über den Schwellwert drehe und anschließend Betriebsspannung anlege leuchtet die LED, wenn ich anschließend das Poti unter den Schwellwert drehe bleibt die LED an. Nehme ich nun die Betriebsspannung weg, lasse den Poti unter dem Schwellwert und lege anschließend die Spannung wieder an bleibt die LED aus. Aber auch hier keine Veränderung wenn ich das Poti wieder über den Schwellwert drehe, die LED bleibt aus. Erst nach erneutem entfernen und wieder anlegen der Betriebsspannung leuchtet die LED. Deshalb gehe ich davon aus das die Einstellungen soweit passen aaaaber irgendwie übernimmt der nach der ersten Messung keinen neuen Wert in das ADCL Register. Ich find den Fehler einfach nicht :-( Hier ist der Code. Geschrieben in Assembler im AVR Studio. ;----- ANFANG CODE! ------ .nolist .include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn25def.inc" .list .def temp = r16 .def low_reg = r17 .def mid_reg = r18 .def high_reg = r19 .def counter = r20 ldi temp,0x03 ;> definiert PB0, PB1 und PB2 als Ausgang out DDRB,temp ldi temp,0x03 ;> Setzt Ausgänge PB0, PB1 und PB2 auf "High" out PortB,temp ldi temp,0b10000000 out ACSR,temp ;> schaltet Comparator aus! ldi temp,0x00 out ADCSRB,temp start: ;> ab hier beginnt Programm! ;=========================================== ; ANALOGWERT LESEN ;=========================================== ldi temp,0b00000011 ;> wählt als REF-Spannung VCC aus und ADC3 (PB3) out ADMUX,temp nop ;> wartet, damit Änderungen übernommen werden nop ldi temp,0b11000000 ;> Schaltet ADC ein und startet eine Single Conversion out ADCSRA,temp wait_mid: in temp,ADCSRA ;> Liest ADC Status Register ein andi temp,0b00010000 ;> Maskiert ADIF aus (wird gesetzt wenn die Messung abgeschlossen ist!) cpi temp,0b00010000 ;> Wenn ADIF = 1 dann weiter ansonsten warte weiter brne wait_mid ldi temp,0b00010000 out ADCSRA,temp ;> ADIF löschen indem mit einer "1" überschrieben wird in mid_reg,ADCL ;> Lese ADC Result Register ein (nur LOW, HIGH wird nicht benötigt!) ;=========================================== ; LED SOLL BEI SCHWELLWERT LEUCHTEN ;=========================================== cpi mid_reg,0x1F ;> willkürlich den Wert 1F als Schwelle genommen und vergleich mit Ergebnis des ADC brlo off ;> wenn mid_reg < 1F dann LED "AUS", ansonsten LED "AN" sbi PortB,0 ;> Schaltet LED "AN" nop ;> Wartet damit Änderungen am Port überbommen werden können rjmp start ;> Sprung zurück zu "start" off: cbi PortB,0 ;> Schaltet LED "AUS" nop ;> Wartet damit Änderungen am Port überbommen werden können rjmp start ;> Sprung zurück zu "start" ;----- ENDE CODE! ------ Bitte schaut mal drüber. Ich verstehe das einfach nicht wo da der Fehler liegen soll...
Vieleicht ist es ja das hier: >This means that if ADCL has been read, and a conversion completes before ADCH is >read, neither register is updated and the result from the conversion is lost. >When ADCH is read, >ADC access to the ADCH and ADCL Registers is re-enabled.
Hallo, tatsache, daran lags. Hab jetzt ADCH in temp eingelesen und mach danach einfach clr temp. Somit ist der ADC wieder freigegeben. Das gibts nicht, ich hab mir den ADC-Teil im Datenblatt alleine gestern bestimmt 10 mal durchgelesen... Vielen Dank für die Hilfe. Hätte alleine glaube ich noch ne Woche dran gesessen.
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.