www.mikrocontroller.net

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


Autor: Bernd M. (adventureman1972)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd M. (adventureman1972)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Bernd M. (adventureman1972)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.