Forum: Mikrocontroller und Digitale Elektronik Ansteuerung einer RGB LED mittels PWM in Bascom und Atmega 8


von Robert A. (neostrider)


Lesenswert?

Hallo,

Ich habe folgendes ungelöstes Problem,

Ich habe einen BCD Schalter 0-9 mit dem möchte ich 10 Unterprogramme 
ansteuern.

Ziel ist:

0 Alle Farben an
1 Rot
2 Gruen
3 Blau
4 Rot und Gruen
5 Gruen und Blau
6 Blau und Rot
7 Lauflicht
8 der Reihe nach durchdimmen

9 Geschwindigkeitsabhängig von Blau nach Rot übers Tachosignal dimmen


Ich habe das Problem bisher so gelöst das über eine IF Abfrage der 
Zustand des BCD Schalters abgefragt wird und Anhand dessen Zustandes in 
ein Unterprogramm gesprungen wird.

Dort Angekommen wird dieses Ausgeführt und am Ende wieder hoch zum 
Anfang gesprungen.

Wie Kann ich jetzt Punkt 8 also die Farbkombinationen durchdimmen und 
Punkt  9 von Blau nach Rot Frequenzabhängig dimmen realisieren.

Gibt es für die Abfrage des BCD Schalters noch eine elegantere 
Möglichkeit.

Sorry habe gerade erst mit Microproz angefangen.



$regfile = "m8def.dat"

$crystal = 8000000

Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output



Rot Alias Portb.0
Gruen Alias Portb.1
Blau Alias Portb.2




Do
Anfang:



If Pinc.0 = 0 And Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 0 Then
Do
jmp Prog0
Loop
End If

If Pinc.0 = 1 And Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 0 Then
Do
jmp Prog1
Loop
End If

If Pinc.0 = 0 And Pinc.1 = 1 And Pinc.2 = 0 And Pinc.3 = 0 Then
Do
jmp Prog2
Loop
End If

If Pinc.0 = 1 And Pinc.1 = 1 And Pinc.2 = 0 And Pinc.3 = 0 Then
Do
JMP Prog3
Loop
End If

If Pinc.0 = 0 And Pinc.1 = 0 And Pinc.2 = 1 And Pinc.3 = 0 Then
Do
jmp Prog4
Loop
End If

If Pinc.0 = 1 And Pinc.1 = 0 And Pinc.2 = 1 And Pinc.3 = 0 Then
Do
jmp Prog5
Loop
End If

If Pinc.0 = 0 And Pinc.1 = 1 And Pinc.2 = 1 And Pinc.3 = 0 Then
Do
jmp Prog6
Loop
End If

If Pinc.0 = 1 And Pinc.1 = 1 And Pinc.2 = 1 And Pinc.3 = 0 Then
Do
jmp Prog7
Loop
End If

If Pinc.0 = 0 And Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 1 Then
Do
jmp Prog8
Loop
End If

If Pinc.0 = 1 And Pinc.1 = 0 And Pinc.2 = 0 And Pinc.3 = 1 Then
Do
jmp Prog9
Loop
End If


Prog0:
Rot = 1
Gruen = 1
Blau = 1
jmp Anfang


Prog1:
Rot = 1
Gruen = 0
Blau = 0
jmp Anfang

Prog2:
Rot = 0
Gruen = 1
Blau = 0
jmp Anfang

Prog3:
Rot = 0
Gruen = 0
Blau = 1
jmp Anfang

Prog4:
Rot = 1
Gruen = 1
Blau = 0
jmp Anfang

Prog5:
Rot = 0
Gruen = 1
Blau = 1
jmp Anfang

Prog6:
Rot = 1
Gruen = 0
Blau = 1
jmp Anfang


Prog7:

jmp Anfang


Prog8:

jmp Anfang


Prog9:

jmp Anfang




Loop

Return

MfG,

neostrider


von Otto (Gast)


Lesenswert?

Hallo ROBERT;

> Wie Kann ich jetzt Punkt 8 also die Farbkombinationen durchdimmen

zähle einen Zähler hoch und übertrage den Inhalt an Port B.

also:

a=a+1

000
001
010
011
.
.
.
111

> Geschwindigkeitsabhängig von Blau nach Rot übers Tachosignal dimmen

welches Tachosignal ?

Otto

von Matthias (Gast)


Lesenswert?

 für die Abfrage des BCD Schalters noch eine elegantere
Möglichkeit....

CASE...
unter der annahme das basic sowas kann..
hoho

von Otto (Gast)


Lesenswert?

Hallo Robert,

die "BCD-Abfrage" kannst Du auch in einer Schleife
realisieren - ungefähr so (ich kenne BASCOM nicht):

for bcd = 1 to 16
   if pinc = bcd
   call bcd
next

Gruss Otto

von Gromit (Gast)


Lesenswert?

Hallo Robert,

Tja, aller Anfang ist im Nebel ....

Ich programmiere auch mit Bascom. Gerade weil es für normale Lösungen 
super geeignet ist.

Zum BCD Schalter: Bascom kennt den Befehl

SELECT CASE <Variable>
 CASE 0 (alle Bits o)
  Code
 CASE 1 (Bit 0 ein)
  Code
 CASE 2 (bit 1 on)
  Code
 CASE 3

 ....

 CASE ELSE
  Code für wenn nichts zutrifft
 END SELECT


Das durchdimmen kannst Du auf verschiedene Arten realisieren. Es hängt 
aber von der Feinheit des Übergangs der Farben ab. Mit PWM geht das am 
besten. PWM heisst, dass ein im AVR enthaltener Zähler (meistens) ein 
PWM Signal erzeugen kann. Dazu übergibt man dem Zähler ein 
Pulsverhältnis irgendwo zwischen 0/100 und 100/0 Prozent. Der Zähler 
kann damit den Zählerausgang selbständig, das heisst ohne Software, 
dauerhaft mit dieser Impulssequenz ansteuern.

In Bascom sieht das folgerndermassen aus:

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

Compare1a = 128
Compare1b = 128

Damit wird ein Tastverhältnis von 50% ein und 50% aus erziehlt.
Mehr Info bekommst Du bei Bascom, oder bei ATMEL in den entsprechenden 
Dokus.

Gruss
Uwe








von Matthias (Gast)


Lesenswert?

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

hilfe...

Wäre es nicht sinnvoller C zu nehmen..

von Robert A. (neostrider)


Lesenswert?

Mmh also so langsam dimmts mir aber wie bekomm ich den BCD Schalter in 
die Case Variable ?

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.