ADC als timer durch interrupt routine verwenden (AVR-ATtiny 84) Hallo, ich habe vor etwa 1 1/2 Jahren mit meinem Arduino das programmieren angefangen und habe mich nun zu den attinys vorgearbeitet. Ich möchte gernen einen VCO programmieren, der eine analoge Spannung liest und dadurch von einem array den nächsten wert an 8 digitale pins sendet. Die sollen dann durch eine r2r leiter den ton mit der "abgelesenen" Frequenz erzeugen. Bislang fast kein Problem. Einen ton (sinus) bekomme ich bislang bei einer Taktung von 8Mhz bei etwa 20 abgelesenen Werte pro sinus durchgang auf eine frequenz von ca 960Hz. Mein Problem ist, dass bei der geschwindigkeit ich die spannung nicht mehr lesen kann, weil die sich mit der timerinterrupt routine beisst. Im forum habe ich gelesen wie man die unter einen Hut bringen kann, es klappt bei mir aber nicht wie ich es mir vorstelle. Im Datenblatt vom tiny84 habe ich gelesen, dass es auch eine interrupt routine nach dem auslesen des adcs gibt. Da der adc immer eine genaue anzahl an cyclen braucht habe ich mir dann überlegt, dass ich diese interrupt als timer für die pin steuerung nehmen kann. Also adc gelesen bringt die routine dazu den richtigen wert auszugeben und startet den adc erneut. Da ich bei den avrs quadi anfänger bin wollte ich einmal eine Meinung hören, ob ich somit stabile Frequenzen hinbekommen könnte, oder ob ich komplett auf dem Holzweg bin und lieber über einen anderen Weg nachdenken sollte. Vielen Dank im Vorraus!
Es gibt einen Interrupt für den ADC. Allerdings hat der ADC nur eine relativ niedrige maximale Frequenz. Selbst wenn man mit nur 8 Bit Genauigkeit zufrieden ist, braucht der ADC für eine Wandlung 13 µs, besser 26 µs (1000 bzw. 500 kHz ADC Takt). Wenn man keine große Verzögerung einbaut, sollte das ausreichen, um in der ADC Routine auch das ausgeben der R2R werte unter zu bringen. Langsamer kann man den ADC natürlich immer noch laufen lassen. Als Alternative könnte man die Ausgabe auch in eine Timer interrupt laufen lassen und den ADC jeweils nach der Ausgang abfrage: wenn er nicht fertig ist, ignoriert man den ADC einfach. Wenn der ADC fertig ist, ließt man den Wert, und bestimmt die neue Frequenz. Den ADC muss man dabei ggf. zu Fuß auslesen und nicht über die ARDUINO Funktionen.
Hallo, dass es auch eine interrupt routine nach dem auslesen des adcs gibt Das ist falsch und steht so nicht im Datenblatt. Es gibt einen "ADC-Wandlung" ist fertig Interrupt-Vektor.
Vielen Dank, das hilft mir sehr weiter. Ich wusste nicht, dass man den nicht fertigen adc ignorieren kann. Das ändert natürlich viel. Ich schreibe alles zu Fuß, jedoch benuste ich den arduino als ISP. Mein Ziel wird es aber sein mehr mit atmel studio zu schreiben. Habe leider noch keinen windows pc und bin auch der suche nach einem günstigen. Vielen Dank nochmal!
Unter Linux (und MacOS) kann man wunderbar mit dem gcc und avrdude arbeiten. Einen Windows-PC brauchst du dafür nicht. (WinAVR nutzt auch nur den gcc.)
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.