Forum: Compiler & IDEs Probleme bei 8fach ADC und PWM mit ATmega16


von Bernd M. (adventureman1972)


Angehängte Dateien:

Lesenswert?

Ich möchte mit Soft-PWM acht einzeln überwachte Akkus an ihre 
Ladschlussspannung bringen und dort halten. Der jeweilige PWM-Ausgang 
geht über 5,6KOhm auf die Basis eines BD238 (NPN). Der Kollektor bekommt 
5V Versorgungsspannung und der Emitter ist am Pulspol des Akkus 
angeschlossen. Der Minuspol des Akkus wiederum an Masse. Die 
ADC-Wandlung für den Akku liegt am Pluspol des Akkus.
Das ganze klappt mit einer ADC-Wandlung auch sehr gut. Sobald aber eine 
zweite ADC-Wandlung dazu kommt wird das Programm so langsam das man die 
Pulse der PWM mitzählen kann. Im GCC bin ich nicht fündig geworden.

Verwendet wird AVR-Studio 4.15; Pony-Prog 3.07a Beta; ATmega 16 16Mhz 
auf einem Pollin-Evaluationsboard

Die Fuses sind richtig, da andere Programm in der richtigen 
Geschwindigkeit ablaufen.

Vielleicht kann mir jemand mal auf die Sprünge helfen, denn ganz so fit 
bin ich noch nicht in der µC-Materie.

von Karl H. (kbuchegg)


Lesenswert?

Splitte dein Programm in Funktionen auf!

Es ist doch Unsinn zb. den ADC Code 8 mal im Programm zu haben, wenn 
alles was sich ändert, die Kanalnummer ist. Da kann man auch eine 
Funktion schreiben, die die Kanalnummer erhält und den Messwert 
zurückliefert (die simple Variante).

Des weiteren willst du dich unbedingt über Timer informieren!
So ein Timer kann in regelmässigen Zeitabständen eine Funktion ausführen 
(die sog. Interrupt Service Routine oder ISR)

In der ISR kannst du deine PWM unterbringen und du kannst dort auch die 
ADC Wandlung eines Kanals anstossen, die du im nächsten ISR Aufruf 
auswertest. Bei jedem ISR Aufruf kommt reihum der nächste Kanal drann. 
Oder: Der ADC kann dich aber auch selbst über ein fertiges 
Wandlerergebnis mit einem Interrupt informieren, woraufhin in der 
zugehörigen ISR auf den nächsten Kanal geschaltet wird und die nächste 
Wandlung angestossen wird.

Kurz und Knapp: Dein ganzer jetziger Programmaufbau ist Sch....
So wirst du nicht zum Ziel kommen.
Möglichkeiten gibt es viele, aber so gut wie alle führen über Interrupts 
und ISR. Nur so kannst du erreichen, dass dein Programm mehr oder 
weniger x-Dinge 'gleichzeitig' macht.

von Bernd M. (adventureman1972)


Lesenswert?

Danke für die schnelle und ehrliche Antwort.
Kannst du mir eine Starthilfe für ISR und Splitten geben?

von Karl H. (kbuchegg)


Lesenswert?


von Bernd M. (adventureman1972)


Lesenswert?

War wieder zu einfach mal dort nachzuschauen.

Habe mir die entsprechenden Artikel durchgelesen, komme aber nicht so 
wirklich weiter da die meisten Beispiele in Assembler sind.

Klar ist, das Programm soll geteilt werden. Ich denke, da die 
PWM-Regelung auf den PORT's PC0 bis 7 Zeitkritischer ist als die 
AD-Wandlung, sollten die ADC's per Interupt gestartet werden. Oder 
können beide ausgegliedert werden?
Wie fange ich das Ganze an? Soviel Erfahrung habe ich leider noch nicht.

Ein einfaches Beispiel zum Anschauen wäre nicht schlecht.

von STK500-Besitzer (Gast)


Lesenswert?

>War wieder zu einfach mal dort nachzuschauen.

>Habe mir die entsprechenden Artikel durchgelesen, komme aber nicht so
>wirklich weiter da die meisten Beispiele in Assembler sind.

Dann nimmst du halt das hier:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

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.