Lauflicht-Programm CMOS-ICs CD4094

ich bin mir noch nicht sicher welche funktion output enable für einen funktion übernimmt, den egal ob ich an diesen pin des Schieberegisters was anschliße oder nicht, gibt mein schieberegister etwas aus ,.

Print "Schiebebyte: " ; Schiebebyte
Portd.6 = 1
Shiftout Dout , Clock , Schiebebyte , 1 , 8 , 0
Toggle Portd.6 'Portd.6 = 0
Toggle Portd.6 ' = 1
Waitms 5
Shiftout Dout , Clock , Nullbyte , 1 , 8 , 0
Toggle Portd.6 'Portd.6 = 0
Toggle Portd.6

ist suboptimal, es funktioniert zwar irgendwie aber auf keinenfall so, als wären die leds direkt angeschlossen,.

es wird irgendwie nicht richtig gefadet
bisschen besser ists so:

Portd.6 = 1
Print "Schiebebyte: " ; Schiebebyte
Shiftout Dout , Clock , Nullbyte , 0 , 8 , 0
Toggle Portd.6 'Portd.6 = 0
Toggle Portd.6
' = 1
Waitms 1
Shiftout Dout , Clock , Schiebebyte , 0 , 8 , 0
Toggle Portd.6 'Portd.6 = 0
Toggle Portd.6


is ja aber logisch, beim ersten sind die leds immer länger aus, als angeschaltet
beim zweiten ists umgekehrt
 
ich bin mir immernoch nicht so sicher was output enabled mache, denn egal ob was angeschlossen ist oder nicht , gibt das schieberegister an den ausgängen was aus,.


Hi Bonze!

Sorry, aber den Satz habe ich jetzt nicht verstanden!
Wie meinst du das jetzt? :hmmmm:


Gruß,
Cassio
 
Shiftout Dout , Clock , Nullbyte , 1 , 8 , 0

bisschen besser ists so

Shiftout Dout , Clock , Nullbyte , 0 , 8 , 0


Hi Bonze!

Was denn nun ? :hmmmm:

0 – MSB shifted out first when clock goes low
1 – MSB shifted out first when clock goes high
2 – LSB shifted out first when clock goes low
3 – LSB shifted out first when clock goes high


Ich habe hier ja auch noch ein paar RGB LED`s liegen.....
vielleicht sollte ich selber mal einen Testaufbau machen um deine Denkweise besser verstehen zu können. ;)

Gruß,
Cassio
 
mh also,.
brauch glaube ich nen neuen ansatz, das kann so nicht gehen
also, werd denke ich den timer0 interrupt nehmen,
das übernehm ich und die fadingtabelle

Config Timer0 = Timer , Prescale = 1
Start Timer0
On Timer0 Pwm_timer ' jump to fadingroutine when the timer0 overrun
Enable Timer0
Enable Interrupts

XXXXXXXXXXXXXXXXX
Portd.6 = 0
Print "Schiebebyte: " ; Schiebebyte
Shiftout Dout , Clock , Schiebebyte , 0 , 8 , 1
Portd.6 = 1
Portd.6 = 0
Shiftout Dout , Clock , Nullbyte , 0 , 8 , 1
Portd.6 = 1

'red, hred, or, hor, ye , gr , hgr, tuer, hbl, hhbl, bl, pu
Redtable:
Data 255 , 205 , 255 , 255 , 255 , 000 , 202 , 084 , 135 , 000 , 000 , 155
Greentable:
Data 000 , 092 , 144 , 135 , 255 , 255 , 255 , 255 , 206 , 134 , 000 , 048
Bluetable:
Data 000 , 092 , 000 , 000 , 000 , 000 , 112 , 159 , 235 , 139 , 255 , 255
Brighttable:
Data 255 , 092 , 255 , 010 , 255 , 100 , 112 , 159 , 235 , 139 , 255 , 255
 
Hallo Bonze!

Also ich würde das Programm auch etwas anders aufbauen. ;)

Was mir gerade noch einfällt.....
Hast du schon mal die "PRINT" Anweisungen heraus genommen?
Das bremst natürlich auch das Programm und damit den Ablauf.


Gruß,
Cassio
 
jepp hab ich , immer testweise,
ich denke mein ansatz war schon nicht schlecht, muss aber mal mit der byte übertragung zum schieberegister spielen,.
 
Hi,

zu deinem OE (OutputEnable) bei den Schieberegistern.
Sieh doch einfach mal ins Datenblatt von dem IC rein ...
OE ist Low-aktiv. Wenn du also GND anlegst schaltest du die Ausgangstreiber
an und wenn High (Vcc) dran ist dann sind die Ausgangstreiber hochohmig.
Das ist so als wenn du bei dem Atmel auf Eingang ohne PullUp schaltest. Dann
sind die Pins auch hochohmig. Nur das die Schieberegister keine parallelen
Eingänge haben.

Es kann ja sein das sich der Pin irgendein Potential zieht wenn du ihn nicht
anschließt und dann zufällig die Ausgänge des Registers anschaltet. Ich würde
mich da aber nicht drauf verlassen.

Anhang anzeigen 74_HCT_595_8Bit-SerInParOut-Latch.pdf

EDIT: Ups ... grad gesehen das du den 4094 verwendest ...
da ist es genau umgedreht ...
Anhang anzeigen HEF4094B_BusRegister.pdf
Data in the storage register appears at the
outputs whenever the output enable (EO) signal is HIGH.
Der Satz aus dem Datenblatt sollte es erklären ...

Gruß
Dino
 
jepp, habs OE im moment auf 5V, sobald ichs auf GND lege, geht alles aus ,.

hast du vielleicht eine idee wie ich mit dem schieberegister ein "fading" realisieren kan ?
ich muss immer die farbe senden und dann leds aus also 255 , oder?
 
Hi,

jepp, habs OE im moment auf 5V, sobald ichs auf GND lege, geht alles aus ,.

hast du vielleicht eine idee wie ich mit dem schieberegister ein "fading" realisieren kan ?
ich muss immer die farbe senden und dann leds aus also 255 , oder?
Das ist alles digital. Also eigentlich nur "ausgestülpte" Pins des Atmels.

Ich würde das folgendermaßen machen ...
Die Soft-PWM die man normalerweise auf den Port-Registern des Atmels
macht (mit an/aus-schalten) auf Variablen machen und die Bits der
Variablen auf die Schieberegister rausbringen. Das rausbringen muß dann
aber bei jedem Schritt des Rampenzählers der Soft-PWM passieren. Das
wird sehr hardwarelastig :eek: :rolleyes:

Also mal rechnen (Beispiel) ...
50Hz PWM-Frequenz ...
256 Helligkeitsschritte ...
16 LED-Ausgänge (Schieberegister-Pins) ...
=> rechne rechne rechne ...
50Hz x 256 => 12800Hz für die Soft-PWM Unterroutine (Timer-Interrupt)
1 / 12800Hz => 78ms Zeit in der zusätzlich alle 16 Bits für die LEDs zu den
Schieberegistern müssen :eek:
12800Hz x 16 LEDs => 204,8kHz Schieberegistertakt als absolutes Minimum.
eher wesentlich mehr (2..4MHz) und mit hardwareunterstützung über das
SPI-Daten-Register rausschieben.
Das wird ne sportliche Angelegenheit ... wieviele LEDs sollten das sein ?
Du mußt also in meinem Beispiel in 78ms die gesamten Bits der 16LEDs für die
Soft-PWM berechnen und danach alle Bits auf die Schieberegister rausbringen.
Je länger du mit der Berechnung verbringst desto weniger bleiben dir von den
78ms für das Rausschieben übrig und desto höher muß dein Datentakt für die
Schieberegister sein. Und ich glaube das du auch noch was anderes machen
willst als nur PWM berechnen und rausschieben. Also bleibt von den 78ms
noch weniger übrig weil du ja auch in deinem Hauptprogramm noch etwas
Zeit verbringen willst.

Sollte aber zu schaffen sein. Aber 16-20MHz muß der Atmel schon laufen
damit man ein wenig Reserve hat.

Gruß
Dino
 
ne sind nicht so viele leds, wollte mindestens nen Mega8 nehmen,.
zur Not auch mit inline Assambler.

ja hatte vor, also Schiebebyte
red alias Schiebebyte.0
green alias schiebebyte.1
blue alias schiebebyte.2

meine leds:
red=0
green=0
blue=0


und dann das Schiebebyte raustakten

soll ich dann in meine pwm routine:
incr pwmctr
farbe an /aus
und ausgabe machen ?
 
256 Helligkeitsschritte ...
Hallo Dino,
dass ist eher unnötig. Das Helligkeitsempfinden der Augen ist sehr stark nicht linear. Zwischen Helligkeitswert 255 und 200 ist kaum ein Unterschied, während es bei den kleinen Werten direkt stark ansteigt.
Daher habe ich bei mir nur 64 Schritte realisiert. Dann kannst du das gleichmäßiger Faden lassen. Und du hast 4 mal soviel Zeit.

1 / 12800Hz => 78ms [/QUOTE]
Ich denke, du meinst überall 78µs. 78ms wäre auch zu leicht zu erreichen.

HBA
 
ok, werd dann alle fade/pwm werte auf 64 setzen

Code:
Pwm_timer:
If Pwmctr < 64 Then
   Incr Pwmctr
Else
   Pwmctr = 0
End If

kommunikation mit dem schieberegister

return

oder meinst du die rgb farbwerte bei 255 lassen und nur den pwm counter auf 64 setzen?
 
Hi,

ok, werd dann alle fade/pwm werte auf 64 setzen

oder meinst du die rgb farbwerte bei 255 lassen und nur den pwm counter auf 64 setzen?
Der PWM-Rampenzähler muß schon mit deinen Werten übereinstimmen. Sonst
wäre das so als wenn du in ein 0,2L-Glas nen Liter reinkippst (Rest läuft
nebenher) und du versucht abzuschätzen wieviel du da nun reingekippt hast ;)

Bei Dimwert von 64 wäre der Kanal dann voll. Voller geht nicht. Er bleibt dann
von 64 bis 255 auf Voll. Ist ne blöde Stellkennlinie :eek:

Gruß
Dino
 
ja dann musste ich ja aber alle rgb farbwerte auch runterrechnen oder?

Code:
Do
   If Red < 64 Then
      Incr Red
   Else
      Red = 0
   End If
   If Green < 64 Then
      Decr Green
   Else
      Green = 64
   End If
   If Blue < 64 Then
      Incr Blue
   Else
      Blue = 0
   End If

    If Red < Pwmctr Then
       Schiebebyte.0 = 0
    Else
       Schiebebyte.0 = 1
    End If

    If Green < Pwmctr Then
       Schiebebyte.1 = 0
    Else
       Schiebebyte.1 = 1
    End If

    If Blue < Pwmctr Then
       Schiebebyte.2 = 0
    Else
       Schiebebyte.2 = 1
    End If

Loop
End
Pwm_timer:
If Pwmctr < 64 Then
   Incr Pwmctr
Else
   Pwmctr = 0
End If
      Portd.6 = 1                                           'latch setzen
        Shiftout Dout , Clock , Schiebebyte , 1 , 8 , 0
        Portd.6 = 0
        Portd.6 = 1
      'Portd.6 = 1
       ' Shiftout Dout , Clock , Nullbyte , 1 , 8 , 0
        'Portd.6 = 0


Return
 
irgendwie hab ichs vom verständnis her verstanden, jedoch will meine hardware nicht so wie ich..
ich kann zwar farben erzeugen, jedoch nur farben ohne abstufungen ,.
 
so, habs hinbekommen,
mit 64 stufen es fadet schön durch,.
die leds werden dann aber nicht ganz so hell oder?

und dadurch das meine interrupt routine so lang ist,
kann ich max mit nem prescaler von 8 fahren, was ner frequenz von 2Mhz entspricht,. vielleicht habt ihr da noch ne lösung
Code:
'Timer konfigurieren
'->Rgb
Config Timer0 = Timer , Prescale = 8                        ' fading timer
Enable Timer0
Start Timer0                                                '  and timer0

'Interupts konfigurieren
'->RGB
On Ovf0 Pwm_timer                                           ' jump to fadingroutine when the timer0 overrun
Enable Timer0
Enable Interrupts

'->RGB Variablen
Dim Pwmctr As Byte                                          'PWM Zählerbyte
Dim Schiebebyte_alt As Byte
Dim Schiebebyte As Byte
Dim Nullbyte As Byte
Dim Red As Byte
Dim Green As Byte
Dim Blue As Byte

Nullbyte = 255
Pwmctr = 0
Schiebebyte = 255
'Hauptprogramm
Portd.6 = 1
'startparameter
Red = 64
Green = 64
Blue = 64

Do
   If Red < 0 Then
      Incr Red
   Elseif Red > 0 Then
      Decr Red
   Else
      'Red = 0
      Print "rotwert erreicht!"
   End If
   If Green < 64 Then
      Incr Green
   Elseif Green > 64 Then
      Decr Green
   Else
      'Green = 0
      Print "grünwert erreicht!"
   End If
   If Blue < 0 Then
      Incr Blue
   Elseif Blue > 0 Then
      Decr Blue
   Else
      'Blue = 0
      Print "blauwert erreicht!"
   End If

   Waitms 250                                               'geschwindigkeit des fadens,.

'Menu___________________________________________________________________________
'Programm_______________________________________________________________________
    Print "|r " ; Red ; " |g " ; Green ; " |b " ; Blue
    'Print "Schiebebyte" ; Schiebebyte
'_______________________________________________________________________________
Loop
End
'--------------------------------- Menü Routinen -------------------------------

'--------------------------------- PWM Routinen --------------------------------
Pwm_timer:
If Pwmctr < 64 Then
   Incr Pwmctr
Else
   Pwmctr = 0
End If

 If Red < Pwmctr Then
       Schiebebyte.0 = 0                                    'led an
    Else
       Schiebebyte.0 = 1 'led aus
    End If

  If Green < Pwmctr Then
       Schiebebyte.1 = 0                                    'led an
    Else
       Schiebebyte.1 = 1                                    'led aus
    End If

    If Blue < Pwmctr Then
       Schiebebyte.2 = 0                                    'led an
    Else
       Schiebebyte.2 = 1                                    'led aus
    End If

         Portd.6 = 1                                        'latch setzen
        Shiftout Dout , Clock , Schiebebyte , 0 , 8 , 1     'µs warten
        Portd.6 = 0
        Portd.6 = 1
Return
 
Hi,

so, habs hinbekommen,
mit 64 stufen es fadet schön durch,.
die leds werden dann aber nicht ganz so hell oder?
ob du nun 64 oder 256 Schritte nimmst sollte an der Helligkeit nichts bringen.
Du hast nur eine grobere Schrittweite. Ob man einen Meter in Zentimeter
aufteilt oder in Zoll. Einmal sind es 100 Stücke und bei Zoll etwa 40. Ein
Meter bleibt aber trotzdem ein Meter. So wie bei dir Volle Pulle auch volle
Pulle bleiben sollte. Es scheint also nich irgendwo ein Fehler drin zu sein.
Am besten sieht man das mit nem Oszilloskop. Wenn das PWM-Signal auf
voll steht dann sollte der Ausgang dauerhaft an sein.

Gruß
Dino
 
ja, ok, ich glaube s liegt eher daran das durch das Schieberegister immer wenn grün 64 hat, rot ung blau auch kurz leuchten und somit das grün dreckig wird.
hab das mit ner einfachen abfrage gelöst, sodas wenn mein schiebebyte den max wert erreicht und sich nicht mehr ändert auch nicht mehr gepulst wird, sondern das schieberegister in seiner "letzten Position" verbleibt, und das ist ganz ok :)

=>
Code:
    If Schiebebyte <> Schiebebyte_alt Then              'ändert sich der Wert nicht mehr wird nicht mehr der ausgang gepulst, somit ergeben sich satte farben
           Portd.6 = 1                                      'latch setzen
           Shiftout Dout , Clock , Schiebebyte , 0 , 8 , 1  'µs warten
           Portd.6 = 0
           Portd.6 = 1
           Schiebebyte_alt = Schiebebyte
        End If
 

Ü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)