Forum: Mikrocontroller und Digitale Elektronik ATtiny13a ADC funktioniert nicht


von dasrotemopped (Gast)


Lesenswert?

Hallo zusammen,

ich habe mir mit dem ATTiny13a ein kleines Experimentierprojekt 
aufgesetzt. Am ATtiny habe ich mit dem Timer an PB0 eine LED mit PWM zum 
Blinken gebracht und kann die Blinkgeschwindigkeit über einen Taster 
IRQ-gesteuert an PB2 ändern. Funktioniert so weit auch wenn der Taster 
prellt und die Einstellung etwas unkomfortabel ist.
Habe mir aber gedacht, den ADC mit einem Poti (50k) an PB4 (ADC2) mit 
verschiedenen Spannungswerten zu füttern, die dann als neuer Wert für 
die Blinkgeschwindigkeit dienen, also am Poti drehen und die 
Blinkgeschwindigkeit ändert sich. Aber anscheindend wird nie eine AD 
Wandlung durchgeführt. Die ISR vom AD Wandler wird nie angesprungen ( 
hab zum Debuggen noch eine LED an PB1 angeschlossen, die beim IRQ vom 
Taster auch brav anzeigt, das die PCINT2-ISR aktiviert wurde.

Das Beispiel vom GCC-Tutorial habe ich an den ATtiny angepasst, macht 
aber auch keinen Unterschied. Wenn ich das "Conversion Complete" Flag in 
einer Schleife abfrage um dann erst das Programm nach erfolgtem 
Abschluss weiter laufen zu lassen macht der uC an den LEDs nix mehr.

Habe den Sourcecode in C vom AVRStudio hier bereitgelegt:
http://home.arcor.de/markus.horbach/dateien/Tiny_Timer_20101226.zip

Ich hoffe auf erleuchtende Tips,

Gruß,

dasrotemopped.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Wo schaltest du denn den Interrupt für den ADC ein? Das hab ich nicht 
gefunden.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

//ADCSRA = 0b0000.x000; #3 ADC Interrupt Enable

Das wird ja nie gesetzt, also auch kein Interrupt ausgelöst.

Grüße,

Peter

von dasrotemopped (Gast)


Lesenswert?

in der Datei adc.c in Zeile 48
ADCSRA |=  ( 1 << ADC);   // IRQ nach Conversion aufrufen
wird der IRQ aktiviert.

Gruß,

dasrotemopped.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Abgesehen davon ist eine Vorgehensweise wie

while(1){
[...]
adc_conv_start();
[...]
}

nicht gerade gut, man sollte vor dem Neustart schon warten, bis die 
vorherige Konvertierung fertig ist. Oder gleich den Freerunning-Mode 
verwenden.

von dasrotemopped (Gast)


Lesenswert?

habe viel Doku Text im Quellcode, damit ich nicht jedesmal durch das 
Datenblatt scrollen muss.

Gruß,

dasrotemopped.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Das Bit zum Interrupt einschalten heißt ADIE, nicht ADC.

ADCSRA |=  ( 1 << ADIE);   // IRQ nach Conversion aufrufen

von dasrotemopped (Gast)


Lesenswert?

ja, das wars !! ADC nach ADIE geändert und das Poti ändert die 
Blinkfrequenz. Hab dabei auch gleich eine Kontrolle eingebaut, das eine 
neue AD Wandlung erst gestartet wird wenn die letzte Abgeschlossen ist.

Danke an alle !

Gruß,

dasrotemopped

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Und loop sollte als volatile deklariert werden, weil es im Interrupt und 
Hauptprogramm verwendet wird.

Grüße,

Peter

von dasrotemopped (Gast)


Lesenswert?

volatile hab ich auch noch eingefügt.
Habe den korrigierten Code auch hochgeladen.

Hmm, der Tiny ist erst zu 58% voll. Was kann ich jetzt noch einbauen ?

Danke noch mal an dich , Peter, für die prima Hilfe.

Gruß,

dasrotemopped.

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.