PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Komme mit meinem Programm nicht weiter (PWM LED Leiste)



hardstyleroxx
16.12.2006, 16:11
Hallo,

ich bin gerade dabei mir eine LED leiste zu bauen. Die ansteuerung will ich mit einem ATmega/Tiny machen.

Es geht darum RGB Leds zu dimmen und somit viele Farben zu erzeugen.

Die PWM erzeugung funktioniert bei mir wunderbar. Es wird immer automatisch von Dunkel auf Hell gedimmt und umgekehrt.
Mein Problem liegt jetzt dadrin, das die LEDs nicht alle gleichzeitig an und ausgehen sollen, sondern nacheinander.

Ich habe mir überlegt, dass ich einfach immer ein Byte um 1 erhöhe wenn einmal von Hell auf Dunkel gefadet wurde. Wenn das byte 3 ist, dann wird es wieder auf 1 gesetzt.

Dann habe ich jeder Farbe einen Wert vom Byte zugeordnet.
Also kann z.B Rot erst angehen wenn Blau wieder aus ist. Grün kann dann erst angehen wenn Rot wieder aus ist usw.

Aber irgentwie will das Programm nicht so wie ich. Wäre nett wenn jemand mal einen Blick raufwerfen kann um mir zu sagen wo da mein Denkfehler liegt.






$regfile = "m8def.dat"
$crystal = 8000000 'Interner 8mhz Quarz


'#####Ausgänge#####

Config Portb = Output

Rot Alias Portb.5 'Grüne LED an Portb.5
Blau Alias Portb.4 'Rote LED an Portb.4
Gruen Alias Portb.3 'Blaue LED an Portb.3



'#####Deklarationen#####

Dim Zurueck As Bit 'PWM rückwärts Bit
Dim Helligkeit As Byte 'Helligkkeitswert
Dim Weiter As Byte 'Byte für die nächste LED

'###Hilfsbits und -bytes###

Dim Ro1 As Bit
Dim Bl1 As Bit
Dim Gr1 As Bit


'#####Timer#####

Enable Interrupts

Enable Timer0
On Timer0 Int_timer0
Config Timer0 = Timer , Prescale = 256


Enable Timer1
On Timer1 Int_timer1
Config Timer1 = Timer , Prescale = 8

Const Timervorgabe = 45536 'Vorgabewert von RNAVR Berechnet


'#####Grundstellung bei Anlage Ein#####

Weiter = 1
Helligkeit = 3
Zurueck = 0
Ro1 = 0
Bl1 = 0
Gr1 = 0

'#####Hauptschleife#####


Do

If Weiter = 1 Then
Set Bl1
Else
Reset Bl1
End If

If Weiter = 2 Then
Set Ro1
Else
Reset Ro1
End If

If Weiter = 3 Then
Set Gr1
Else
Reset Gr1
End If




Loop

'#####Hauptschleife Ende#####





'#####Timer0 isr#####

Int_timer0:


'###Blau###


If Bl1 = 1 Then Toggle Blau

If Blau = 1 Then
Timer0 = 256 - Helligkeit
Else
Timer0 = Helligkeit
End If


'###Rot###

If Ro1 = 1 Then Toggle Rot

If Rot = 1 Then
Timer0 = 256 - Helligkeit
Else
Timer0 = Helligkeit
End If


'###Gruen###

If Gr1 = 1 Then Toggle Gruen

If Gruen = 1 Then
Timer0 = 256 - Helligkeit
Else
Timer0 = Helligkeit
End If


Return



'#####Timer1 isr#####

Int_timer1:

Timer1 = Timervorgabe 'Timervorgabewert von RNAVR berechnet

If Weiter = 4 Then Weiter = 1

If Helligkeit = 3 Then
Reset Zurueck
Incr Weiter
End If

If Zurueck = 0 Then Incr Helligkeit

If Helligkeit = 255 Then Set Zurueck

If Zurueck = 1 Then Decr Helligkeit


Return

End

hardstyleroxx
18.12.2006, 16:09
Kann mir echt keiner helfen? Versuche schon seit vielen Stunden den Fehler zu finden, aber ich sehe da echt nichts falsches. :(

1hdsquad
18.12.2006, 17:00
Ich werf mal nen Blick drauf, wenn ich Zeit habe (Referat in Geschichte :-( )
MFG

helimike0705
28.12.2006, 18:23
hallo
habe mal in deiner do-loop schleife die reset-befehle durch das
jeweilige port ersetz
z.b.
reset bl1 durch portb.3 = 0
okay habe nur einen 2313 mit 4mhz zum testen und von timer-ausrechnen
leider noch keine ahnung(lerne gerade bascom).
aber probiere mal was passiert.

gruß

helimike0705
30.12.2006, 17:27
so,habe mich jetzt 2 tage damit beschäftigt und das ist rausgekommen.
läuft auf einen 2313 aber auch auf deinem mega8.
pass es dir an und sehe selbst.

hardstyleroxx
27.01.2007, 14:12
sorry jungs tut mir leid das ich so lange nichts geschrieben habe, hatte kaum zeit und eh nicht mehr damit gerechnet das jemand antwortet. Werde mir das Programm mal ansehen und es anpassen.
Wenn die Leiste dann läuft mache ich auch gerne Bilder.

Danke!

helimike0705
27.01.2007, 15:28
hallo habe dieses lauflicht auch noch um ein paar code zeilen erweitert mit einem nettem effekt.probiers mal aus.auf dem 2313 läuft es wunderbar nur auf dem mega 8 sind einige ports mit komischen verhalten,weiß nur noch nicht warum.
gruß mike

hardstyleroxx
27.01.2007, 15:54
Kannst du mir denn mal erklären, was das Lauflicht mit den erweiterten Funktionen genau machen soll? Werde es dann mal testen.

Was ich nicht verstehe ist folgendes:

Toggle Portb.i
Toggle Portb.a

was soll das i und das a da?

helimike0705
27.01.2007, 17:19
erstmal zum ersten lauflicht, läuft es bei dir.
zum 2. der port i und a sind die port die durchlaufen. dabei
ist a der der hinterherläuft.nur sehe dir in der toogelschleife mal die
a zeile an sie wird um eins gemindert.wenn du am ende des ports ankommst wird i und a wechseln gedimmt ,bis sie an bleiben.
wie gesagt auf dem 2313 ist der effekt prima nur beim mega8 ist das nicht der fall.bin aber noch am experimentieren.wenn du die leds am port c anschliesst ist der effekt schon teilweise vorhanden. wenn ich wüsste wie ich ein video einstellen könnt würde ich es dir da mal zeigen.

helimike0705
27.01.2007, 17:30
in dem gepostetem programm habe ich alle ports vom mega8 mal aktiviert,ab besten läuft es aber nur auf portb.natürlich musst du die prescaler und teiler anpassen nach deinem quartz und so weiter.

helimike0705
27.01.2007, 17:55
berichtigung:nicht portb sonder portc läuft besser,habe mal ein prog angehängt das mit 16 mhz und den ensprechenden prescalern läuft.
die anderen ports sin ausgeklammert.

aber mal eine andere frage wie wird der code eingefügt so wie in deiner anfrage.

gruß mike

helimike0705
27.01.2007, 18:45
noch etwas ,bin grade am probieren,einen zeitkritische constante ist
auch die waitms in der do loop schleife,die diesen effekt erzeugt.es soll
normal ein entsprechende port ausfaden,nur bleibt er an bei bestimmten
waitms zeiten und damit pobiere ich grade,es entstehen eigenartige effekte.

hardstyleroxx
27.01.2007, 18:52
Also ich habe das erste jetzt mal getestet. an Portb.0 - Portb.2 sind LEDs drann. Die gehen auch wie ich es haben wollte nacheinander an, blos gehen die voll zackig an und aus bei mir. Wenn sie erst ma eine gewisse Helligkeit erreicht haben gehts alles flüssig.
Richtig verstanden habe ich trotzdem nicht was du da gezaubert hast. Ich brauche ja nur 3 Outputpins für meine LEDs, wie kann ich das jetzt umändern? Also von mir aus Portb.0-Portb.2, wenn er dann Portb.2 erreicht hat, soll er wieder bei Portb.0 weiter machen.

helimike0705
27.01.2007, 18:58
okay verstanden werde dir das programm mal so schreiben das deine
drei led so gedimmt werden wie du es gerne hättest.
also led eins geht an und langsam aus dann die nächste an und wieder aus
dann die dritte und dann wieder von vorn.
ist das so recht.

hardstyleroxx
27.01.2007, 19:03
Genau so meinte ich das. Kannst du (oder jemand anderes) mir mal bitte erklären was denn an meinem Code Falsch ist? Ich habe den schon so oft kontrolliert und finde einfach den Fehler nicht... ](*,)

@helimike0705

Um hier einen Code einzufügen, musst du auf "Antwort erstellen" klicken und dann hast du über deinem Textfeld viele Formatierungsmöglichkeiten. Eine davon heisst "code". Einfach raufklicken und deinen Code einfügen.

helimike0705
27.01.2007, 19:13
so hoffe es funzt
[/code]

helimike0705
27.01.2007, 19:15
okay ,kam etwas zu spät aber der code ist ja dran.
hatte diese icon angeklick ,man sieht es ja stehen,also dann den code
als text anhängen -> richtig.

helimike0705
27.01.2007, 19:25
entschuldige bei deiner port wahl musst du in der do loop schleife
schreiben
If I = 6 Then I = 3

helimike0705
27.01.2007, 19:33
okay auch noch in der zu weisung i
i=3, sonst läuft es erst bei portb0 los und das dauert solang bis er sich
zum portb 3 durchgedimmt hat,ich weiß ja nicht was an deinen anderen
ports noch dran ist.hast ja noch ein haufen speicher frei für andere sachen.

okay schon passiert , danke für den hinweis mit dem editieren.
also so etwas habe ich mir auch schon überlegt bin auch greade am tüfteln.aber mit diese code geht das nicht.man muss da ja drei timer am laufen habe,denke ich,einer für jede led.wenn das läuft kann man
die zeiten noch so gestalten das die leds auch ducheinander dimmen.
nicht in einer bestimmten folge,dann sind wir soweit das du das
farbspectrum durchlaufen kannst,so wolltest du es ja bestimmt mal haben.

hardstyleroxx
27.01.2007, 19:43
Hey,

ja genauso hab ichs mir vorgestellt. =D>
ich bin gerade am tüfteln wie ich die LEDs überlappend laufen lassen kann, aber irgentwie geht das mit dem Code nicht.
Also wenn Rot am ausgehen ist, soll blau angehen usw.
hast du da vielleicht einen Lösungsansatz für mich? ich brauche nichtmal Code würde mich schon freuen wenn mir jemand mal erklären könnte wie ich das aus dem vorhandenen Code am besten Realisiere.

Danke erstmal!


@helimike0705
Wenn du mehrer Beiträge hintereinander schreiben möchtest, editier einfach den letzen den du geschrieben hast und setze den text dazu! Doppel oder gar 4-Fach Post werden nämlich nicht gerne gesehen.

hardstyleroxx
27.01.2007, 20:12
du hast mich falsch verstanden mit dem Editieren ;)
Du sollst nur Editieren wenn du den letzen Beitrag selber geschrieben hast und nicht wenn ich z.B den letzen Beitrag geschrieben habe.

helimike0705
28.01.2007, 09:06
habe einen code im netz gefunden und an den mega8 angepasst
sowie an die ports 3- 5 in deinem fall.


'code gefunden bei http://www.amhamberg.de
'an mega8 portb.3 bis .5 angepasst mit 8mhz
'internen takt,geändert am 28.01.2007

$regfile = "m8def.dat"
$crystal = 8000000

Ddrb = &B11111111
Portb = &B00000000


Dim A As Integer
Dim B As Integer
Dim C As Integer
Dim X As Integer
Dim Y As Integer

Dim Onoff1 As Bit
Dim Onoff2 As Bit


Declare Sub Dimmen(byval Led1 As Integer , Byval Led2 As Integer)

Do

Do
A = Rnd(3) + 3
B = Rnd(3) + 3

If A <> B Then Exit Do
Loop

If Portb.a = 1 And Portb.b = 1 Then
C = 3
While C = A Or C = B
Incr C
Wend
If Portb.c = 1 Then
Call Dimmen(a , B)
Else
Call Dimmen(a , C)
End If
Else
Call Dimmen(a , B)
End If

Loop

End

Sub Dimmen(byval Led1 As Integer , Byval Led2 As Integer)

If Portb.led1 = 0 Then
Onoff1 = 1
Else
Onoff1 = 0
End If

If Portb.led2 = 0 Then
Onoff2 = 1
Else
Onoff2 = 0
End If

For X = 0 To 500
For Y = 1 To 500
If X > Y Then
Portb.led1 = Onoff1
Portb.led2 = Onoff2
Else
Portb.led1 = Not Onoff1
Portb.led2 = Not Onoff2
End If
Next
Next
Portb.led1 = Onoff1
Portb.led2 = Onoff2
Waitms 500

End Sub

hardstyleroxx
28.01.2007, 13:30
also bei mir funktioniert der code nicht. wie siehts bei dir aus?


EDIT: es funktioniert doch, hab es nochmal von der hp runtergeladen.
Das kommt dem Ergebnis doch schon relativ nahe, blos leider verstehe ich in dem Programm rein gar nichts :roll:
Irgentwie sehe ich da nich einen Timer oder ähnliches.

Jetzt sind blos immer 2 LEDs an und eine Dimmt sich aus (Abwechselnd), was ja irgentwie blöde ist, da dann ja viel zu oft alle 3 aufeinmal an sind (RGB = weiss) und man nie die einzelfarben Rot, Grün und Blau hat.

helimike0705
28.01.2007, 16:03
als bei mir läuft der code so wie ich ihn einstellte.habe es mit 16 mhz sowie mit interne 8 und 4 mhz laufen lassen.
hast schon recht aber war ja ein vorschlag,mit dem weiss ist das halt so in dem fall.timer hat er nicht benutzt läuft alles software-mässig ab.
bin auch noch am probieren eine art regenbogenverlauf zuerstellen.
also in der art vor und zurück.aber in bascom das zu prgrammieren wird
aufwendig.in assembler würde das besser und einfacher laufen,kann aber
kein assembler und programmiere mit bascom erst seit ein paar wochen.
wie du meinem autor-namen entnehmen kannst mache ich bei schönem wetter andere sachen.naja man kann nicht alles können.aber ich bleibe am ball.wenn du etwas gefunden hast kannst du es mir ja per e-mail schicken oder hier einstellen.

hardstyleroxx
28.01.2007, 16:30
ja mache ich, ich bin schon die ganze zeit am probieren.

hardstyleroxx
31.01.2007, 02:21
ich habs geschafft!!!! =D>

Ist zwar mehr als kompliziert gecodet, aber immerhin erfüllt es voll und ganz seinen zweck.



$regfile = "m8def.dat"
$crystal = 8000000 'Interner 8mhz Quarz


'#####Ausgänge#####

Config Portb = Output

Gruen Alias Portb.2 'Grüne LED an Portb.5
Rot Alias Portb.1 'Rote LED an Portb.4
Blau Alias Portb.0 'Blaue LED an Portb.3




'#####Deklarationen#####

Dim Helligkeit As Byte 'Helligkkeitswert


'###Hilfsbits und -bytes###

Dim Ro1 As Bit
Dim Bl1 As Bit
Dim Gr1 As Bit

Dim Reverse As Bit

Dim Zler1 As Byte
Dim Zler2 As Byte
Dim Halb As Byte
Dim Ganz As Byte

'#####Timer#####

Enable Interrupts

Enable Timer0
On Timer0 Int_timer0
Config Timer0 = Timer , Prescale = 256


Enable Timer1
On Timer1 Int_timer1
Config Timer1 = Timer , Prescale = 8

Const Timervorgabe = 32203

Helligkeit = 5

'#####Hauptschleife#####


Do



Loop

'#####Hauptschleife Ende#####





'#####Timer0 isr#####

Int_timer0:

If Ro1 = 1 Then
Toggle Rot
If Rot = 1 Then
Timer0 = 256 - Helligkeit
Else
Timer0 = Helligkeit
End If
End If

If Bl1 = 1 Then
Toggle Blau
If Blau = 1 Then
Timer0 = 256 - Helligkeit
Else
Timer0 = Helligkeit
End If
End If

If Gr1 = 1 Then
Toggle Gruen
If Gruen = 1 Then
Timer0 = 256 - Helligkeit
Else
Timer0 = Helligkeit
End If
End If

Return


'#####Timer1 isr#####

Int_timer1:

Timer1 = Timervorgabe 'Timervorgabewert von RNAVR berechnet

If Helligkeit = 250 Then
Set Reverse
Incr Zler1
End If

If Helligkeit = 1 Then
Reset Reverse
Incr Zler2
End If



'####Moodlight####

'###rot###

If Zler2 = 0 Then Set Ro1
If Zler1 = 1 Then Reset Ro1
If Zler1 = 2 Then Set Ro1
If Zler2 = 3 Then Set Ro1
If Zler1 = 4 Then Reset Ro1
If Zler2 = 2 Then Reset Ro1

'###Gruen###

If Zler2 = 0 Then Set Gr1
If Zler1 = 2 Then Reset Gr1
If Zler1 = 3 Then Set Gr1
If Zler2 = 3 Then Reset Gr1
If Zler2 = 4 Then Set Gr1

'###Blau###

If Zler2 = 1 Then Reset Bl1
If Zler2 = 0 Then Set Bl1
If Zler2 = 2 Then Set Bl1
If Zler1 = 3 Then Reset Bl1
If Zler1 = 4 Then Set Bl1

'//////////////////////////////////////////////


If Zler1 > 4 Then Zler1 = 0
If Zler2 > 4 Then Zler2 = 0




If Reverse = 1 Then Decr Helligkeit
If Reverse = 0 Then Incr Helligkeit


Return






End