Forum: Mikrocontroller und Digitale Elektronik ADC mit ATtiny85-20PU


von Christian K. (christiankarle)


Angehängte Dateien:

Lesenswert?

Hallo liebe Community,

ich habe folgendes Problem:

Ich möchte über den ADC des ATtiny85 eine analoge Spannung in einen 
digitalen Wert umwandeln.

Für den Anfang soll der ADC, wenn die Spannung am Eingang 0V = GND 
beträgt, eine LED anschalten andernfalls die LED aus.

Im Anhang befindet sich mein C-Code...
Gerade stehe ich etwas auf dem Schlauch, da dieser Code nicht 
funktioniert. Für Tipps zur Verbesserung wäre ich sehr dankbar.

P.s: Die Schaltung soll am Ende der Entwicklung eine analoge Spannung 
von einem Mikrophon in einen digitalen Wert umwandeln und bei einen 
bestimmten Pegel ein LED-Band zum Blinken bringen :)

von Achim K. (aks)


Lesenswert?

1
if ( ADC_Read ( ) == 0 )
2
    {
3
      PORTB|= ( 1 << PB4 );
4
    }
5
    
6
    else
7
    {
8
      PORTB|= ( 0 << PB4 );
9
    }

was möchtest Du mit "PORTB|= ( 0 << PB4 )" erreichen? "|= 0" ändert 
nichts.
"&= ~( 1 << PB4 )" würde das Bit löschen.

von ??? (Gast)


Lesenswert?

PB4 irgendwo als Ausgang konfiguriert?

PORTB|= ( 0 << PB4 )
http://www.mikrocontroller.net/articles/Bitmanipulation#Bits_l.C3.B6schen

von Christian K. (christiankarle)


Angehängte Dateien:

Lesenswert?

Ok, funktioniert trozdem nicht...

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Christian Karle schrieb:
> Ok, funktioniert trozdem nicht...
ADCH muß immer ausgelesen werden!

Wenn du nur 8 Bit benötigst, setzt du das ADLAR-Bit in ADMUX und liest 
nur ADCH aus. Ansonsten liest du ADC als Ganzes aus. Also in deinem Fall
1
return ADC;

Überlass es dem Compiler, sich um die richtige Reihenfolge zu kümmern.

mfg.

: Bearbeitet durch User
von kopfkratzer (Gast)


Lesenswert?

Hmm,
das Tutorial bist Du schon durch:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe 
?
Dann kann es sein das Dein Poti nicht 100%ig auf GND geht, nimm also 
einen Schwellenwert ab dem Du sagst nun ist der Poti ganz am Anschlag, 
z.B. 16 o.ä.
ADC-Pins korrekt gesetzt in den I/O Registern ?
Teste es einfach mal mit einem Wert von 512, dann müßte die LED aus sein 
sobald Du den Poti über der Mittelstellung hast ...

von Holger L. (max5v)


Lesenswert?

Du könntest mal einen anderen ADC versuchen, evtl nicht gerade den an 
dem Resetpin.

Wenn du eine LED angeschlossen hast, funktioniert diese überhaupt ?
Das wäre auch noch einen Test wert.

von ??? (Gast)


Lesenswert?

Christian Karle schrieb:
> Ok, funktioniert trozdem nicht...

Welches Verhalten. "funktioniert nicht" ist nicht aufschlußreich.
- LED verkehrt rum oder kaputt
- ADCL erreicht nicht 0 - einen Bereich angeben
- PINs vertauscht
- Fuses stehen falsch
- ...

von Christian K. (christiankarle)


Angehängte Dateien:

Lesenswert?

Also die LED funktioniert, sie ist auch richtig herum gepolt.
Fuses ? Müssen bestimmte Fuses gesetzt sein damit der ADC funktioniert ?

Der CPU-Takt ist in den Fuses auf 8 MHz gesetzt mit dem Internen 
Quarz...

Ich habe den Bereich jetzt mal auf 200 hochgesetzt... Wenn ich den 
Eingang des ADC nun direkt mit GND verbinde tut sich nichts...

von Holger L. (max5v)


Lesenswert?

An welchem ADC Pin legst du denn GND an ?

von Christian K. (christiankarle)


Lesenswert?

Am ADC0 ;)

von Thomas E. (thomase)


Lesenswert?

Christian Karle schrieb:
> Also die LED funktioniert, sie ist auch richtig herum gepolt.
> Fuses ? Müssen bestimmte Fuses gesetzt sein damit der ADC funktioniert ?
Ja. Da du nach wie vor den Reset-Pin einliest, mußt du die RSTDSBL-Fuse 
setzen. Wenn du keinen HV-Programmer hast, kannst du deinen Controller 
danach allerdings wegschmeissen. Also nimm einen anderen Pin!

mfg.

: Bearbeitet durch User
von Christian K. (christiankarle)


Lesenswert?

Vielen Dank :) Es funktioniert nun :)

von Holger L. (max5v)


Lesenswert?

Da du noch relativ neu zu seien scheinst, den Fuse CKDIV8 (Divide clock 
by 8) hast du entfernt ?

http://www.engbedded.com/fusecalc

von Christian K. (christiankarle)


Lesenswert?

Ja :)

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
Noch kein Account? Hier anmelden.