www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Attiny13 ADC Probleme


Autor: Tiny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich probiere gerade den ADC ans laufen zu kriegen, klappt leider nicht 
so wie gedacht ;)
Ich hoffe ihr konnt mir bei meinem kleinen Problem helfen.
.include "tn13def.inc"
    ldi r16, 0b11101111
    out DDRB, r16
    ldi r16, 0b00001000
    out PORTB, r16
    ldi r16, 0b01100010
    out ADMUX, r16
    ldi r16, 0b11000101
    out ADCSRA, r16


    ldi r16, 0b00000000
schleife:    cp r5, r16
    breq schleife
  


    ldi r16, 0b00000000
    out PORTB, r16


ende:   rjmp ende


Das kleine Programm soll eigentlich nur überprüfen ob der ADC überhaupt 
einen Wert ungleich Null ins Register 5 ( ADCH ) ablegt, und wenn ja 
eine LED anschalten. Als Eingang für den ADC hab ich einen 
Spannungsteiler aus einem Widerstand 100kohm und einem LDR.
Na ja, es klappt halt nicht, der Inhalt von r5 bleibt konstand 0. Wo ist 
der Fehler?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tiny schrieb:


> Das kleine Programm soll eigentlich nur überprüfen ob der ADC überhaupt
> einen Wert ungleich Null ins Register 5 ( ADCH ) ablegt,

>     ldi r16, 0b00000000
> schleife:    cp r5, r16
>     breq schleife

also noch unverständlicher kann man das nun wirklich nicht schreiben.
Und nein, das vergleicht nicht, ob das Register ADCH jemals ungleich 0 
wird. r5 ist nicht ADCH

Lies doch bitte im AVR-Tutorial über den ADC nach. Im Tiny 13 
funktioniert zwar die Einstellung der Referenzspannung im Detail ein 
wenig anders, aber das Prinzip ist trotzdem identisch.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tiny:

Tip: Die CPU-Register (r0 bis r31) und die I/O-Register sind Zweierlei.

...

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

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank erstmal für eure Hilfe. Ich hab noch weiter gemacht, aber es 
klappt leider immer noch nicht.
include "tn13def.inc"
  ldi r16, 0b11101111
  out DDRB, r16
  ldi r16, (1<<REFS0) | (1<<ADLAR) | (1<<MUX1) 
  out ADMUX, r16
  ldi r16, (1<<ADEN) |  (1<<ADPS2) | (1<<ADPS0)
  out ADCSRA, r16
  sbi ADCSRA, ADSC
schleife:  sbic ADCSRA, ADSC
  brne schleife 

  ldi r16, ADCH
  cpi r16, 100   ; Schwellwert
  brlo aus

  ldi r16, 0b00001000
  out PORTB, r16
  rjmp ende

aus:  ldi r16, 0b00000000
  out PORTB, r16
ende:  rjmp ende

Was Cih machen möchte ist folgendes. Die LED soll je nach Lichteinfaall 
an oder aus geschaltet werden. Für den Schwellwert hab schon viele Werte 
ausprobiet und habe entdeckt, dass ADCH immer 5 ist. Egal ob ich den 
Finger auf den LDR halte oder nicht.
Ich sehe einfach nicht, was ich falsch machen. Vielleicht fällt einem 
von euch der Fehler auf.
Vielen Dank im Vorraus.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Für den Schwellwert hab schon viele Werte
>ausprobiet und habe entdeckt, dass ADCH immer 5 ist.

Wie?

Und du weißt auch, das dein Programm nach maximal ein paar ms, eher 
wesentlich weniger, nichts mehr macht?

MfG Spess

Autor: Tiny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schwellwert im Quellcode geändert, neu kompiliert, auf den mc gezogen 
und wieder laufen lassen. Ist der Wert kleiner 5 Leuchtet die LED, bei 
größeren Werten nicht.
Das das Programm erstmal nicht viel macht ist mir schon klar, entweder 
leuchtet die LED am Ende oder nicht. Wenn das mit dem ADC so klappt wie 
ich mir das denke kommt da natürlich noch eine Schlaife rum.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zieh die Schleife gleich rundum.
Ohne kannst du doch gar nicht vernünftig testen.


vor dem
  sbi ADCSRA, ADSC
machst du ein Label rein
  ...
  out ADCSRA, r16
loop:
  sbi ADCSRA, ADSC
schleife:  sbic ADCSRA, ADSC
  ...

und aus dem
    rjmp ende
machst du ein
    rjmp loop

fertig.

Finger auf den LDR, die LED muss umschalten.
Finger weg, die Led muss wieder zurückgehen.

Welchen Wert hat dein RL?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm.
Hast du der LED keinen Vorwidertand spendiert?

Autor: Tiny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorwiderstand ist dran, hab ich nur vergessen einuzeichnen. Zu den 
anderen Widerstandswerten: (ich glaube das war mit LD gemeint?)

R1: 10kohm
R2: 100kohm
LDR: 1kohm unter der Lampe 200kohm mit Finger drauf

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach das ist ein 2-er und kein L
Tschuldigung, konnte ich nicht identifizieren.

d.h. mit Finger drauf hast du einen Spannungsteiler 100k-200k, das sind 
dann ca. 3.6V am ADC Pin (mit Voltmeter nachmessen).
Und wenn die Lampe draufscheint sind das 100k-1k, also praktisch 0V.

Das sollte sich im ADC Wert bemerkbar machen. Schwellwert so ungefähr 
100 müsste gehen. Wobei man der ersten Messung des ADC nach dem 
Einschalten (angeblich) nicht so ganz trauen kann (daher auch die 
Schleife)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum benutzt du die interne Referenz?
Lass doch den ADC die Versorgungsspannung als Referenz nehmen!

Autor: Tiny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sp folgendes hab ich jetzt gemacht:
-Schleife ist drum
-Vcc ist als Referenz eingestellt
- Ich hab zwischen dem ADC Pin und GND gemessen. 0.54V im Hellen, 2.6 
mit Finger drauf.
- hab nen anderen attiny13 genommen, ergebniss bleibt gleich

Hab wieder diverse Schwellwerte ausgetestet. ADCH bleibt bei 5

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal das Programm, bitte

(SChön langsam bin ich auch mit meinem Latein am Ende :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier

schleife:  sbic ADCSRA, ADSC
  brne schleife

Der brne gehört da nicht hin. Das muss ein ganz normaler rjmp sein

Autor: Tiny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier bitte :)
include "tn13def.inc"
  ldi r16, 0b11101111
  out DDRB, r16
  ldi r16, (0<<REFS0) | (1<<ADLAR) | (1<<MUX1) 
  out ADMUX, r16
  ldi r16, (1<<ADEN) |  (1<<ADPS2) | (1<<ADPS0)
  out ADCSRA, r16
  loop:
  sbi ADCSRA, ADSC
schleife:  sbic ADCSRA, ADSC
  brne schleife 

  ldi r16, ADCH
  cpi r16, 100; Schwellwert
  brlo aus

  ldi r16, 0b00001000
  out PORTB, r16
  rjmp ende

aus:  ldi r16, 0b00000000
  out PORTB, r16
ende:  rjmp loop

Autor: Tiny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, im Schaltplan hab ich eine Verbindung durchgestrichen (von der 
Diode zu Pin 1 ) Da ist auch wirklich keine!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK. Ändere den brne noch auf einen rjmp.
Jetzt seh ich auch nichts mehr im Programm, was mich stutzig machen 
würde. Die Konfig-Register hab ich mit dem Datenblatt gecheckt. Sind m.M 
nach vernünftig.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch

Da seh ich noch was


   ldi r16, ADCH

das geht so nicht.
Das erklärt auch, wo deine 5 herkommen :-)
ldi (LoaD Immediate) wird benutzt um einen konstanten Zahlenwert in ein 
Register zu laden. In deinem Fall, ist das dann die Adresse vom Register 
ADCH. Das willst du aber nicht. Du willst den Inhalt von ADCH! Und weil 
ADCH zu den I/O Registern gehört:

   in   r16, ADCH

Autor: Tiny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das wars! Funktioniert!
Vielen dank für deine ausdauernde Hilfe! :)
Deine Erklärung leuchtet auch ein. 0x05 ist ja Die Adresse von ADCH

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tiny schrieb:
> Vielen dank für deine ausdauernde Hilfe! :)

gern geschehen

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.