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.
Wo schaltest du denn den Interrupt für den ADC ein? Das hab ich nicht gefunden.
//ADCSRA = 0b0000.x000; #3 ADC Interrupt Enable Das wird ja nie gesetzt, also auch kein Interrupt ausgelöst. Grüße, Peter
in der Datei adc.c in Zeile 48 ADCSRA |= ( 1 << ADC); // IRQ nach Conversion aufrufen wird der IRQ aktiviert. Gruß, dasrotemopped.
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.
habe viel Doku Text im Quellcode, damit ich nicht jedesmal durch das Datenblatt scrollen muss. Gruß, dasrotemopped.
Das Bit zum Interrupt einschalten heißt ADIE, nicht ADC. ADCSRA |= ( 1 << ADIE); // IRQ nach Conversion aufrufen
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
Und loop sollte als volatile deklariert werden, weil es im Interrupt und Hauptprogramm verwendet wird. Grüße, Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.