Hallo miteinander,
ich bin dabei für mein Aquarium eine LED Beleuchtung zu Steuern. Dabei
sollen die LEDs ( eine LED- Beleuchtung, die in 5 LED- Stränge
aufgeteilt ist) bzw die LED- Stränge einzeln und oder auch zusammen
dimmbar sein.
Dabei soll per Tasterdruck ( für jeden Strang 1 Taster) ein- und
ausgeschatet werden. Beim Ein- und Ausschalten soll hoch und runter
gedimmt werden.
Zur Technik: ich nutze den Atmega8, AVR- Studio6. Der Atmega8 steckt
noch zum programmieren auf der MyAvr Programmierumgebung.
Und ich versuche mich gerade in C !!
Die LED- Stränge meist 3-7 LEDs pro Strang werden über einen MeanWell
LDD 350/700 gespeist.
Die LDDs haben einen PWM- Eingang mit dem das Dimmen möglich ist.
Ich habe etwas in C Programmiert und eine Lösung über die beiden PWM-
Ausgänge OC1A und OC1B realisiert. Aber ich brauche noch mehr PWM-
Ausgänge bzw. OC1X.
Desweiteren habe ich das Problem, dass sich die beiden PWM- Ausgänge nur
nach einander ein bzw. auschalten lassen. Woran es liegt weiß ich, aber
ich weiß nicht welche Möglichkeiten ich noch habe, da ich ein ziemlicher
neuling im programmieren bin. Das ist quasi mein erstes Projekt.
Hier nun meine Frage:
Kann ich auch einen normlen Ausgang (PORT C oder D als Ausgang
konfiguriert) dazu bringen mir einen PWM auszugeben??
Das müsste doch iwie gehen in dem ich den Ausgang mit einer bestimmten
Frequenz ein und ausschalte.
Ich habe hier im Forum viel über PWM gelesen.. aber alles war mit OCR1a
und OCR1b realisiert.
Zum bisherigen Code:
Rafael S. schrieb:> Kann ich auch einen normlen Ausgang (PORT C oder D als Ausgang> konfiguriert) dazu bringen mir einen PWM auszugeben??
Ja. Das nennt sich Software PWM. Dazu wirst du hier unzählige Artikel
finden.
Der Atmega88 hat übrigens 6 PWM-Kanäle.
mfg.
Rafael S. schrieb:> Desweiteren habe ich das Problem, dass sich die beiden PWM- Ausgänge nur> nach einander ein bzw. auschalten lassen. Woran es liegt weiß ich, aber> ich weiß nicht welche Möglichkeiten ich noch habe, da ich ein ziemlicher> neuling im programmieren bin.
Das liegt an deinem Programmaufbau bzw. daran das du noch zu sequentiell
denkst und nicht in Ereignissen. Wenn du beim Kochen neben dem Herd
stehen bleibst und darauf wartest, bis das Gulasch fertig ist ...
1
while(a<max){OCR1A=a;wait(50);a++;}
... dann kannst du eben nicht nebenher staubsaugen.
Du musst dein Denkweise umstellen. Nicht: das Programm soll darauf
warten, dass eine Endbedingung erreicht ist, sondern bei jedem Durchlauf
durch die Hauptschleife "Ist die Endbedingung erreicht, dann mach
nichts, andernfalls bewege dich einen Schritt auf die Endbedingung zu".
Vergleichbar damit eben nicht neben dem Herd stehen zu bleiben sondern
immer abwechselnd nach dem Gulasch schauen und staubsaugen bis eines
davon erledigt ist.
1
intmain()
2
{
3
uint16_tLicht1Vorgabe;
4
uint8_tTaste1Jetzt,Taste1Vorher;
5
6
.....
7
8
Licht1Vorgabe=0;
9
OCR1A=0;
10
11
Taste1Vorher=PIND&(1<<PD2);
12
13
while(1){
14
15
// Taste1 auswerten
16
// wird die Taste gedrückt, dann soll die Vorgabe für die Beleuchtung 1
17
// in die jeweils andere Position springen. Aus Maximum wird Minimum
18
// und umgekehrt
19
20
Taste1Jetzt=PIND&(1<<PD2);
21
22
if(Taste1Jetzt!=Taste1Vorher){// Die Taste hat sich veraendert?
23
Taste1Vorher=Taste1Jetzt;
24
if(!Taste1Jetzt){// interessant ist nur: sie wurde
25
// niedergedrueckt,
26
// d.h. die Frage "Wie steht sie jetzt?"
27
28
// Die Taste wurde also niedergedrückt
29
if(Licht1Vorgabe==0)// -> Die Vorgabe für LED 1 von Minimum
30
Licht1Vorgabe=1023;// auf Maximum umstellen und umgekehrt
hi,
ohhh... das wusste ich nicht.
Welche sind das??
Sie sind aber nicht wie die OC1A und OC1B direk nach aussen geführt.
ODER übersehe ich etwas ??
Die Geschichte mit der Software PWM war mir auch NEU. Danke für den
Tipp!!!!
Ich habe direkt gesucht und einen Link gefunden:
Beitrag "Software PWM mit Atmega8 funktioniert nicht"
Hat jemand von euch schon diesen Code aus dem letzten Beitrag
ausprobiert.
Es will bei mir nicht laufen.
@ Karl Heinz:
danke auch für deine Tipps. Ich glaube ich habe da wirklich bissl in die
falsche Richtung geschaut! Ich werde es mal so ausprobieren!!!
Besonders gut ist das Beispiel mit dem Saugen und Gulaschkochen ! :-)
Rafael S. schrieb:> hi,> ohhh... das wusste ich nicht.> Welche sind das??> Sie sind aber nicht wie die OC1A und OC1B direk nach aussen geführt.> ODER übersehe ich etwas ??
Er sagte Mega 88 (achtundachzig). Du hast aber einen Mega 8
Rafael S. schrieb:> Beitrag "Software PWM mit Atmega8 funktioniert nicht">> Hat jemand von euch schon diesen Code aus dem letzten Beitrag> ausprobiert.>> Es will bei mir nicht laufen.
Was heisst 'will nicht'.
Nach schnellem Drüberschauen sollte der anstandslos eine LED an Port C /
1 durch dimmen.
Du tauscht natürlich ganz oben das F_CPU gegen die Taktfreqquenz deines
Prozessors aus
1
#define F_CPU 3686400
und wenn deine LED an einem anderen Pin hängt, dann änderst du das eben
im Code entsprechend. So schwer ist das ja nicht zu finden, wo der Port
C angesprochen wird (auf das DDR Register nicht vergessen!)
spess53 schrieb:> Hi>>>Du hast aber einen Mega 8>> Da ist OC2 noch verfügbar.>
Ja. Aber er hat keine 6 PWM Stufen. Der TO braucht 5, somit sind ihm 3
zu wenig.
Karl H. schrieb:> Was heisst 'will nicht'.>> Nach schnellem Drüberschauen sollte der anstandslos eine LED an Port C /> 1 durch dimmen.
Tut mir leid... war ein Fehlalarm. Ich hatte eine kleinen Fehler
gemacht. Meine Schuld.
Die LED dimmt hoch, geht aus und dimmt dann wieder hoch... und das in
Schleife.
Karl H. schrieb:>> Er sagte Mega 88 (achtundachzig). Du hast aber einen Mega 8
Richtig.. ich habe den Atmega8. Habe in der Antwort auch jetzt erst
gemerkt das da 88 und nicht 8 steht. Sorry!
Gruß
Rafael S. schrieb:> Richtig.. ich habe den Atmega8. Habe in der Antwort auch jetzt erst> gemerkt das da 88 und nicht 8 steht. Sorry!
Den kannst du dir trotzdem beim nächsten Mal mitbestellen und anstelle
des Mega8 in die Platine stecken, er ist pinkompatibel. Das gleiche gilt
auch für den Mega48 und Mega 168/328. Dies sind die modernen Nachfolger
deines Mega8 Urgesteins :-P
Matthias S. schrieb:> deines Mega8 Urgesteins :-P
hi hi ... :-)
Ja da hast du definitiv recht. Das sollte ich mir durch den Kopf gehen
lassen!
Danke für die Tipps!!!