Einfaches Programm für PWM AUsgabe in BASECOM

Folienkondensator

Neues Mitglied
28. Mai 2012
89
0
0
Sprachen
  1. ANSI C
  2. Assembler
Hallo

Ich hab vor 8 Glühbirnen per PWM zu dimmen. Und das nach einem bestimmtem zyklus.

Beispiel:

Porta,0 100%
porta,1 80%

Warteschleife (10 Min. oder so)

Porta,0 10%
Porta,1 40%

Warteschleife
und so weiter und so fort.

Im grunde genommen eine art langsame Lauflichtsteuerung mit 8 Kanälen die per PWM gedimmt werden.
Weil das alles möglichst einfach zu ändern sein soll und vorallem da extrem lange Werteschleifen drinnen sind die auch noch relativ genau sein sollen, hab ich mir gedacht das alles einfach per BASECOM zu machen.

Ich hab mal gegooglet und folgenden Code gefunden:
Code:
$regfile = "m16def.dat"
$crystal = 4000000

Config Porta.1 = Output
Config Porta.2 = Output

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Do
 Compare1a = 205
 Compare1b = 51
Loop

End

Das wäre genau das was ich bräuchte. nur sobald ich noch ein paar Kanäle mehr mit dran hänge meckert BASECOM-AVR.
Anscheinend funktionieren da nur drei Kanäle (A B C und ab D kommt ein Fehler). wiso?
Anschlißend mal der erweiterte Code
Gruß

Code:
$regfile = "m16def.dat"
$crystal = 4000000

Config Porta.0 = Output
Config Porta.1 = Output
Config Porta.2 = Output
Config Porta.3 = Output
Config Porta.4 = Output
Config Porta.5 = Output
Config Porta.6 = Output
Config Porta.7 = Output


Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Compare C Pwm = Clear Up , Compare D Pwm = Clear Up , Compare E Pwm = Clear Up , Compare F Pwm = Clear Up , Compare G Pwm = Clear Up , Compare H Pwm = Clear Up , Prescale = 1024

Do
 Pwm1a = 1024
 Pwm1b = 50
 Pwm1c = 50 
 Pwm1d = 50 <- Ab hier meckert Basecom-AVR
 Pwm1e = 50


Loop

End
 
Schon mal einen Blick ins Datenblatt des (von Dir gewählten) Mega16 geworfen?
Es gibt 2 8bit-Timer (Timer0 und Timer), und einen 16bit-Timer.
Timer0 besitzt einen PWM-Kanal (OC0), Timer1 2 (OC1A, OC1B) und Timer2 wieder nur einen (OC2).
Mehr gibt die Hardware dieses Chip nicht her... (Also brauchst Du 'ne Software-Lösung)

Edit: Darum meckert Bascom...
 
...oder du verwendest einfach einen atmega2560...
 
Hi,

...oder du verwendest einfach einen atmega2560...
Naja ... OK ... Traktorpulling um den Brief um die Ecke in den Briefkasten einzuwerfen :p :rolleyes: :cool:

Ist ein wenig Overkill ;) Da würde ich eher nen externen Baustein nehmen der sich irgendwie steuern läßt und mehrere PWM-Kanäle hat. (Hab ich irgendwo schonmal gesehen).

Gruß
Dino
 
Hallo,

Ist ein wenig Overkill Da würde ich eher nen externen Baustein nehmen der sich irgendwie steuern läßt und mehrere PWM-Kanäle hat. (Hab ich irgendwo schonmal gesehen).
Stimmt schon, ist aber schnell und einfach, außerdem ist kein großer Preislicher Unterschied
zwischen Mega32 + externen PWM-controller und dem Mega2560.

Außerdem sollte der Mega1280 bzw 640 ja auch gehen - dann etwas weniger oversized...

Natürlich wäre die Sofware-lösung am elegantesten, aber auch am aufwändigsten
und wahrscheinlich mit dem "ungüstigsten" Ergebnis.(µC ausgelastet, kl.Auflösung, kl.Frequenz)
 
Hallo
Ich hab mir mal eine Softwarelösung gesucht. und ich denke damit macht es wirklich am meisten Sinn. vorallem weil ich ja genügend Mega8 rum liegen hab.
In Problem dabei ist jetzt nur dass ich nicht wirklich weis wie ich gleichzeitig mit dem PWM Signal eine Wartezeit von genau einer Stunde einhalten soll und nach ablauf von einer Stunde PWM die nächsten PWM Signale zu senden.
Kurzes Beispiel damit ihr wisst was ich überhaupt machen will:

ch1= 80%pwm
ch2= 10%pwm
ch3= 100%pwm

30 Min. warten (Die oben genannten PWM Signale laufen praktisch 30 Min. lang ab. danach folgen die nächsten PWM Taktungen)

ch1= 30%pwm
ch2= 30%pwm
ch3= 30%pwm

10 Min. warten

usw...

Da ein Timer zu schnell ist und die Software PWM ja immer laufen muss weis ich nicht wo ich so lange Wartezeiten her holen soll. und vorallem sollen sie auch noch (relativ) genau sein. +- 1-2% sind drinnen.
Ist sowas überhaupt machbar?
Gruß
 
Hi,

Da ein Timer zu schnell ist und die Software PWM ja immer laufen muss weis ich nicht wo ich so lange Wartezeiten her holen soll. und vorallem sollen sie auch noch (relativ) genau sein. +- 1-2% sind drinnen.
Ist sowas überhaupt machbar?
In eine Word-Variable passen 16 Bit. Wenn man also irgendwelche Zeittakte zählt dann kann man bis 65535 hochzählen. Die Zeittakte erzeugt dir ein Timer (zB ein Interrupt beim Timerüberlauf - TOVF). Wenn der Zeittakt jede Sekunde ist dann könntest du damit zB 1092 Minuten oder 18,2 Stunden abdecken. Bei 10tel Sekunden als Zeittakt entsprechend weniger. Es gibt aber auch Variablen mit 32Bit Länge.

Gruß
Dino
 
Ok, wie Funktioniert HW-PWM bei den AVR eigentlich? (einfachheitshalber gehe ich von fastPWM aus)
-der Timer zählt (mit dem Prozessortakt/Vorteiler) von 0 bis Top (und dann entweder wieder von 0 los)
-bei jedem Increment wird (im Hintergrund) geprüft, ob der Zähler eines der OC-Register erreicht hat - ist dies der Fall, kippt der OC-Pin
-beim Überlauf des Timers kippt er wieder zurück.

Wenn Du das also in SW nachempfinden willst, mußt Du bei jedem Increment prüfen, ob die Pulsweite(n) erreicht wurde(n) - folglich muß der Timer also bei jedem increment (Deiner PWM-Variable) überlaufen. Hier mußt Du entscheiden, welche Periodenzeit Dein PWM haben soll, und welche Auflösung Du brauchst.
Dann ist natürlich der Prozessorakt wichtig.
Das mit dem 2ten Timer (für die Ladezyklen der neuen PWM-Werte) hat Dino ja schon angedeutet). Mit dem Timerüberlauf (CTC) schaffst Du Dir eine geeignette Zeitbasis, in der entsprechenden ISR wird ein Zähler incrementiert. Wenn Dieser Zähler zu schnell ist (trotz maximaler Zeitbasis), hängst Du da einfach einen weiteren Zähler dran:
Code:
zaehler1=zaehler1+1
if zaehler1=0 then zaehler2=zaehler2+1
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)