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 :)
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.
PB4 irgendwo als Ausgang konfiguriert? PORTB|= ( 0 << PB4 ) http://www.mikrocontroller.net/articles/Bitmanipulation#Bits_l.C3.B6schen
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
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 ...
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.
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 - ...
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...
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
Da du noch relativ neu zu seien scheinst, den Fuse CKDIV8 (Divide clock by 8) hast du entfernt ? http://www.engbedded.com/fusecalc
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.