Forum: Mikrocontroller und Digitale Elektronik ADC als timer durch interrupt routine verwenden (AVR-ATtiny 84)


von Oli G. (Gast)


Lesenswert?

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!

von Lurchi (Gast)


Lesenswert?

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.

von Uwe (de0508)


Lesenswert?

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.

von Oli G. (Gast)


Lesenswert?

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!

von S. R. (svenska)


Lesenswert?

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