www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit ADC in ATTINY25


Autor: Chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.