Lauflicht-Programm CMOS-ICs CD4094

Oskar01

Mitglied
24. März 2008
267
0
16
Köln
Sprachen
  1. Assembler
Hallo,

möchte heute ein Lauflicht-Programm mit zwei kaskadierten CMOS-ICs CD4094 am PortB eines ATTiny2313 vorstellen. So könnte ich mir auch prinzipiell eine Porterweiterung auf 16 Bit Breite denken im Sinne einer Seriell/Parallel-Umwandlung der Ausgabe über nur drei Portbits.

Der Baustein CD4094 bietet ein 8-Bit-Schieberegister mit Zwischenspeicher
und Tristate-Ausgängen.
Es können Low-current-Leuchtdioden bei 5 Volt Versorgungsspannung über
2,2 kOhm Widerstände von den Ausgängen direkt angesteuert werden.

Die Steuer-Logik des ICs CD4094 beinhaltet nun kurz folgendes:

Bei steigender Takt-Flanke (Clock) werden am Dateneingang (Data) anstehende Logikpegel in die Schieberegister-Flipflops eingelesen, um eine Stelle weitergeschoben und in den Zwischenspeichern (Latches) gespeichert.

Die Daten der Latches werden bei High-Pegel am Strobe-(Enable)-
Eingang auf die Ausgänge geschaltet.

Dabei ist für das Lauflicht-Programm unwichtig, ob zuerst Strobe oder Taktsignal (Clock)
programmiert wird, und ob Strobe "high" dauernd am Portausgang anliegt, oder dies Signal wie ein Impuls getoggelt wird, wie in diesem Programm gemacht.

Es können mehrere ICs kaskadiert werden, hier zwei Bausteine, so daß ein 16 Bit breites Wort seriell auf parallel gewandelt werden kann.

Nachteil des ICs:
Es besitzt keinen Reseteingang, so daß nach dem ersten Anlegen
der Betriebsspannung zufällige Werte an den Ausgängen erscheinen.
Strenggenommen müssten erst 16 Clockimpulse bei Strobe auf "low"
und Data auf "low" angelegt werden, dann Strobe auf "high" gesetzt
werden, um dann erst die LED-Ausgabe zu aktivieren (quasi zu resetten).
Habe ich mir geschenkt hier.

Zum Programm für den ATTiny2313:

Das Programm ergibt ein Lauflicht, bei dem nur eine Leuchtdiode
von Anfang zu Ende wandert (D0 bis D15).

Der Takt für das Schieberegister wird aus dem Timer1 im CTC-Modus mit
Timer-Interrupt generiert.

Von der Programm-Haupt-Endlosschleife ausgehend werden nun nacheinander mehrere Ausgabeschleifenunterprogramme aufgerufen, die jeweils das in der Interrupt-Service-Routine im gewünschten Vorteiler eingestellten Taktzyklus gesetzte Job-Flag-Register abfragen, und die ihrerseits wiederum die Unterprogramme für die Impulsgenerierung von Strobe und Clock aufrufen.

Wenn nur eine Leuchtdiode wandern soll, wird das scheinbar einfachste Beispiel für die Darstellung der Funktionsweise eines Schieberegisters hierbei nur durch das Programmieren von 16 Schleifenunterprogrammen ermöglicht, die in der Art einer Mehrfach-Verzweigung nacheinander vom Unterprogramm "endlos1" aufgerufen werden, um überdies damit zugleich auch die Schwierigkeit der begrenzten Sprungweite des RJMP-Befehls zu umgehen.
(Mit dem Rotate-Befehl (ROL) wäre dies sicher einfacher direkt über die Portausgänge der MCU und Leuchtdioden des STK500-EVA-Boardes zu bewerkstelligen, allerdings nur in 8-Bit-Breite. Wir möchten aber doch gerne ein 16-Bit-Lauflicht haben...)
Wird nicht so vorgegangen, bekommt man den Eindruck, als ob das eingerichtete Lauflichtmuster zu stehen scheint, also der ureigentliche Sinn und Zweck des Bausteins als Seriell/Parallel-Umwandler wird hier unmißverständlich deutlich.

Übrigens, die Bezeichnungen für die Ausgänge D0 bis D15 sind auf dieser Platine (IHK-Übungsstück) verkehrt herum angebracht.
Das Lauflicht läuft also von rechts nach links.

Man gewinnt auch - vor allem bei höheren Geschwindigkeiten - den Eindruck,
daß immer die zwei unmittelbar benachbarten Leuchtdioden leuchten.
Allerdings bemerkt man dabei auch, daß eine Übergabeverzögerung zwischen den beiden ICs nicht zu existieren scheint, so daß auch durchaus noch mehr ICs kaskadiert werden könnten.
Dies liegt in der Hauptsache an der Verarbeitungsgeschwindigkeit der Ausgänge der Schieberegister-Bausteine und nicht etwa an der Gruppenlaufzeit der Ausgabeschleifen, wie man sicher auch vermuten könnte.
Auch bringt die Entfernung der NOPs in den Impulsgenerierungs-Unterprogrammen für Clock und Strobe da keine Verbesserung, diese ominösen kürzesten Pausen in Form von No-operation-Anweisungen können sogar ganz entfallen, also SBI- und CBI-Befehle direkt hintereinander gesetzt werden, ohne daß dies bei der verwendeten Taktfrequenz noch einen Einfluß auf die Funktion des Schieberegister-ICs hätte. Jedenfalls im Testlauf bei 4-MHz-MCU Takt konnte ich in dieser Hinsicht keinen Unterschied feststellen.


Gruß von Oskar01

Bauteile:
2 x CD4094
R1, R2, R3 = 68 kOhm
R4 - R20 = 2,2 kOhm
C1 = 4,7 yF/35V Tantal
C2, C3 = 100 nF
D1 - D16 = low current LEDs
D17 = 1N4001 (Verpolschutz)
 

Anhänge

  • Shift_ASM.txt
    4,3 KB · Aufrufe: 45
  • Shift_2.JPG
    Shift_2.JPG
    38,3 KB · Aufrufe: 62
  • CD4094_5.PNG
    CD4094_5.PNG
    29,6 KB · Aufrufe: 57
  • CD4094_S1.png
    CD4094_S1.png
    5,3 KB · Aufrufe: 47
wie mache ich sowas in Bascom ?
also ich hab mal so gedacht,
Soft Spi,
Code:
Red Alias Schiebebyte.0
Green Alias Schiebebyte.1
Blue Alias Schiebebyte.2
Dim Schiebebyte As Byte
Declare Sub Send(byval Send_data As Byte)   
'SPI konfigurieren
Config Spi = Soft , Dout = Portd.5 , Clock = Portd.7
Latch Alias Portd.6                                         
Spiinit
oder muss ich diesen Output enable pin auch am Avr beschalten ? hjab gedacht man könnte den vielleicht auch mit Vcc verbinden ?

senden will ich so ,.
Code:
Sub Send(byval Send_data As Byte)                           'sendet automatisch die daten über spi
    Latch = 0
    Spiout Send_data , 1
    Latch = 1
End Sub
 
Hallo Bonze!

Der Thread von Oskar ist zwar schon etwas älter und er programmiert auch in ASM und nicht in BASCOM, aber OK..... :rolleyes:


Ich frage mich nun gerade, warum du so etwas überhaupt mit SPI befeuern möchtest? :hmmmm:
Hast du so eine zeitkritische Anwendung, dass ein "normales" SHIFTOUT innerhalb der Anwendung nicht genügen würde?

Kommt mir so vor, als würde das Problem eher hier liegen:
senden will ich so ,.


Wenn du das natürlich so WILLST, dann ist das etwas anderes..... :rolleyes:

Grüße,
Cassio
 
ne im endeffekt ists mir eigentlich egal wie hauptsache es will so wie ich :D

per shiftout siehts dann so aus oder :D?
Code:
dim Schiebebyte as byte
Red Alias Schiebebyte.0
Green Alias Schiebebyte.1
Blue Alias Schiebebyte.2
Dout Alias Portd.5
Latch Alias Portd.6
Clock Alias Portd.7

Sub Send(byval Send_data As Byte)                           'sendet automatisch die daten
    Latch = 0
    Shiftout Dout , Clock , Send_data
    Latch = 1
End Sub

Schiebebyte = 4
         Call Send(schiebebyte)
         Wait 1

dabei liegt output enabled auf Vcc

scheint zu funktionieren, jedoch setzt bei mir irgendwie der controller aus , sobald ich oben die einzelne bits aliasse,
es geht dann gar nichts mehr,.

kanns sein das es vielleicht speicherüberschneidungen gibt?
also wenn ich den code seperat teste funktinierts ohne problreme, im gesamt programm dann wieder nicht ,.
was sind so typische speicherbereiche?

also entweder sind die taster fürn arsch aufm pollin board, oder habn speicherproblem,. wenn ich fast die hälfte meines programms in ein anderes programm schreibe und separat teste funktionierts ohne probleme,.
 
Hallo Bonze!

Mit Sicherheit "bremst" der Hin- und Rücksprung zu bzw. von einer Subroutine das Programm...... weil alle Register gesichert werden. :cool:
Allerdings dauert das nicht 1 oder 2 Sekunden. :eek:

Der Feher muss daher an anderer Stelle liegen.

Grüße,
Cassio
 
Mit Sicherheit "bremst" der Hin- und Rücksprung zu bzw. von einer Subroutine das Programm...... weil alle Register gesichert werden.
Hallo Cassio,
das ist so nicht korrekt.
Wenn eine "normale" Sub oder ein Gosub Label aufgerufen wird, werden keine Register gespeichert. Das Programm verzweigt ja nur an eine andere Stelle. Alle Befehle sind beendet, also muss nur die Rücksprungadresse auf den HwStack gelegt werden. Das dauert nur einige Takte.
Nur bei einem Interrupt wird die aktuelle Registerbelegung gespeichert, weil man ja nie genau weiß, an welcher Stelle das Programm unterbrochen wurde.

Der Fehler muss daher an anderer Stelle liegen.
Davon gehe ich auch aus.

irgendwie stimmen die timer auch ned mehr, bzw wenn ich wait 1 einbaue, sind es in echt ca 4-5s
Du wirst wohl mal mehr von deinem Programm zeigen müssen, weil wir so nur raten können, was da schief läuft.

HBA
 
hab irgendwie das gefühl das es
Code:
Dim Schiebebyte As Byte                                     'ausgänge über schieberegister
Red Alias Schiebebyte.0
Green Alias Schiebebyte.1
Blue Alias Schiebebyte.2

On Ovf0 Pwm_timer                                           ' jump to fadingroutine when the timer0 overrun
Enable Ovf0
Enable Interrupts

do
select Case Programm 
      Case 1:
        'Call Send(3)                                       'rgb faden schnell komplett
         Fadezeit = 1
         Haltedauer = 1
         Gosub Rgb_fading
         Gosub Send
         Print "erreicht:" ; Erreicht
         Print "Schiebebyte: " ; Schiebebyte
end select

loop

Pwm_timer:
Incr Pwmctr

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

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

      If B_current < Pwmctr Then
         Schiebebyte.2 = 0
      Else
         Schiebebyte.2 = 1
      End If
Return
Rgb_fading:
      'Print "rgb fading"
     ' 'Rot
        If R_current < R_dim Then                           'aktueller rotwert kleiner als Roter Zielwert
             Incr R_current
          Elseif R_current > R_dim Then
             Decr R_current
          Else
             Erreicht.0 = 0                                 '&B00000110 rot zielwert erreicht
          End If
          Print "Rotwert: " ; R_current ; " / " ; R_dim
      'Grün
          If G_current < G_dim Then
             Incr G_current
          Elseif G_current > G_dim Then
             Decr G_current
          Else
             Erreicht.1 = 0                                 '&B00000101 grün zielwert erreicht
          End If
          Print "Grünwert: " ; G_current ; " / " ; G_dim
      'Blau
          If B_current < B_dim Then
             Incr B_current
          Elseif B_current > B_dim Then
             Decr B_current
          Else
             Erreicht.2 = 0                                 ' &B00000100 blau zielwert erreicht
          End If
          Print "Blauwert: " ; B_current ; " / " ; B_dim

      'Waitms Fadezeit
      'colourmixing
      If Erreicht = 0 Then                                  'alle zielwerte erreicht
         'Wait Haltedauer
         Erreicht = 7
         Incr Colourcounter                                 'colourcounter um 1 erhöhen
         If Colourcounter = 3 Then                          'colourcounter zurücksetzen
            Colourcounter = 0
         End If
         R_dim = Lookup(colourcounter , Redtable)           ' rot wert aus tabelle laden
         G_dim = Lookup(colourcounter , Greentable)         ' greenwert aus tabelle laden
         B_dim = Lookup(colourcounter , Bluetable)          ' blau

      End If
Return

das er diesen Interrupt nicht richtig ausführt, und mir diee pwmctr variable nicht korrekt hochzählt

mein schiebebyte sollte sich nämlich in abhängigkeit zu dem pwmctr wert ändern, tut es aber nicht,.

ich muss dazu sagen das der code schon 100% funktioniert hatte, als ich die Leds direkt am avr hatte,. wollte jetzt nur auf schieberegister umbauen,.
 
Der Ausschnitt sieht aber nicht per se falsch aus.
Ob er richtig ist oder deine Befürchtung stimmt, kann man nur beurteilen, wenn man mehr vom Programm sieht.

HBA
 
wenn ich die farben einzeln setze mit red =1, blue =1, green=1,
gehts ,.
aber irgendwie scheints an dem timer interrupt zu liegen,.
so hab mal die sw und hwstack größer hichgeschraubt, und siehe da, das prog läuft besser, mein fehler ist aber immernoch da, also es läuft von der geschwindigkeit her besser, jedoch fadet und wechselt immernoch nix,.
 
Hallo Cassio,
das ist so nicht korrekt.
Nur bei einem Interrupt wird die aktuelle Registerbelegung gespeichert, weil man ja nie genau weiß, an welcher Stelle das Programm unterbrochen wurde.

Hallo HBA!

Natürlich!
Danke, für den Zusatz und die "Richtigstellung"! :)


Allerdings...
......das er diesen Interrupt nicht richtig ausführt, und mir diee pwmctr variable nicht korrekt hochzählt.....

....muss sein Programm beim Sprung in die Sub doch erst alle Register sichern. ;)





Hallo Bonze!

Kann es sein, dass deine ISR viel zu schnell nacheinander aufgerufen wird? :hmmmm:

Grüße,
Cassio
 
mh könnte sein ,
hab den mega mit 16mhz getaktet , prescale auf 1 :D

aber egal was ich ändere ,
mein schiebebyte bleibt 0 , das versteh ich ja nicht, normalerweise müsste ja in dr rgb_fading rotuine je nach fallentscheidung mein schiebebyte verändert werden.

EDIT: irgendwas stimmt da eh nicht, weil
Send_data:
Print "Schiebebyte" ; Schiebebyte
Latch = 0
Shiftout Dout , Clock , Schiebebyte
Latch = 1
Return

erzeugt über uart garkeine ausgabe?! nur wenn ich den aufruf direkt in die hauptschleife schreibe,.
 
Hallo Bonze!

Hast du es mal mit den Optionen probiert, so wie ich es in meinem Beispiel gezeigt habe und es in der BASCOM-Hilfe angegeben ist?

Code:
'shiftout pinout,pinclock, var,parameter [,bits , delay]
' value for parameter :
'  0 - MSB first ,clock low
'  1 - MSB first,clock high
'  2 - LSB first,clock low
'  3 - LSB first,clock high

'The bits is a new option to indicate the number of bits to shift out
'For a byte you should specify 1-8 , for an integer 1-16 and for a long 1-32
'The delay is an optional delay is uS and when used, the bits parameter must
'be specified too!

'Now shift out 9 most significant bits of the LONG variable L
Shiftout Output , Clock , L , 0 , 9


Allerdings müsste bei "Print" doch etwas heraus kommen. :hmmmm:

Kannst du den ganzen Code mal hier einstellen, so wie HBA es schon vorgeschlagen hatte?
Ist auch egal, ob er uneffizient, oder unübersichtlich, oder was auch immer ist.....

Gruß,
Cassio
 
hier mein komplettes programm ,
Code:
$regfile = "m1284pdef.Dat"
$hwstack = 100
$swstack = 64
$framesize = 40
$crystal = 16000000                                         '8mhz
$baud = 9600
'$sim

'Ein/Ausgänge konfigurieren
Ddrd = &B11100000
Hoch Alias Pind.2
Runter Alias Pind.3
Dout Alias Portd.5
Latch Alias Portd.6
Clock Alias Portd.7
'Red Alias Portd.5                                           ' Green1 - first green led
'Green Alias Portd.6                                         ' Green1 - first green led
'Blue Alias Portd.7                                          ' Blue1 - first blue led
Dim Schiebebyte As Byte                                     'ausgänge über schieberegister
Red Alias Schiebebyte.0
Green Alias Schiebebyte.1
Blue Alias Schiebebyte.2

'Timer konfigurieren
Config Timer0 = Timer , Prescale = 256                      ' fading timer
Start Timer0                                                '  and timer0

'Interupts konfigurieren
On Ovf0 Pwm_timer                                           ' jump to fadingroutine when the timer0 overrun
Enable Ovf0
Enable Interrupts
On Int0 Prog_hoch
Enable Int0
On Int1 Prog_runter
Enable Int1
Enable Interrupts                                           'enable interrupts

'Variablen Konfigurieren
'->Programm Variablen
Dim Programm As Byte                                        'Programmzähler


'->RGB Variablen
Dim R_current As Byte                                       'Aktueller Wert Rot
Dim G_current As Byte                                       'Aktueller Wert Grün
Dim B_current As Byte                                       'Aktueller Wert Blau
Dim R_dim As Byte                                           'Zielwert Rot
Dim G_dim As Byte                                           'Zielwert Grün
Dim B_dim As Byte                                           'Zielwert Blau
Dim Erreicht As Byte
Dim Colourcounter As Byte                                   'welche farbe aus dem table gelsen werden soll
Dim Pwmctr As Byte                                          'PWM Zählerbyte
Dim Haltedauer As Byte                                      'zeit wie lange die Zielfarbe gehalten werden soll
Dim Fadezeit As Byte

'1Dimmwert farbvorgabe beim 1 start
R_current = 1
G_current = 1
B_current = 1
R_dim = 5
G_dim = 5
B_dim = 5

Pwmctr = 0
Erreicht = 7                                                'bezieht sich auf &b 00000111 = 7
Colourcounter = 0
Programm = 0
Schiebebyte = 0
'Sonstige Konfigurationen
Config Debounce = 30

'Hauptprogramm
Do
          If R_current < Pwmctr Then
               Red = 0
            Else
               Red = 1
            End If

            If G_current < Pwmctr Then
              Green = 0
            Else
              Green = 1
            End If

            If B_current < Pwmctr Then
              Blue = 0
            Else
               Blue = 1
            End If
         Gosub Rgb_fading

         'Gosub Send
           Latch = 0
           Shiftout Dout , Clock , Schiebebyte
           Latch = 1
         'Print "erreicht:" ; Erreicht
         Print "Schiebebyte: " ; Schiebebyte
Loop
End
'--------------------------------- Menü Routinen -------------------------------
Prog_hoch:
      Debounce Hoch , 1 , Count_up , Sub
Return
Count_up:
     If Programm > 11 Then
         Programm = 0
      Else
         Incr Programm

      End If
      Print "programmzaehler: " ; Programm
Return
Prog_runter:
     Debounce Runter , 1 , Count_down , Sub
Return
Count_down:
      If Programm > 0 Then
         Decr Programm
      End If
      Print "programmzaehler: " ; Programm
Return
'--------------------------------- PWM Routinen --------------------------------
Pwm_timer:
                                       'wird von timer interrupt aufgerufen
Incr Pwmctr
      If R_current < Pwmctr Then
         Red = 0
        ' Schiebebyte.0 = 1
      Else
         Red = 1
        ' Schiebebyte.0 = 0
      End If

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

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

Return
'--------------------------------- Programm Routinen ---------------------------
Rgb_fading:
     ' 'Rot
        If R_current < R_dim Then                           'aktueller rotwert kleiner als Roter Zielwert
             Incr R_current
          Elseif R_current > R_dim Then
             Decr R_current
          Else
             Erreicht.0 = 0                                 '&B00000110 rot zielwert erreicht
          End If
          'Print "Rotwert: " ; R_current ; " / " ; R_dim
      'Grün
          If G_current < G_dim Then
             Incr G_current
          Elseif G_current > G_dim Then
             Decr G_current
          Else
             Erreicht.1 = 0                                 '&B00000101 grün zielwert erreicht
          End If
          'Print "Grünwert: " ; G_current ; " / " ; G_dim
      'Blau
          If B_current < B_dim Then
             Incr B_current
          Elseif B_current > B_dim Then
             Decr B_current
          Else
             Erreicht.2 = 0                                 ' &B00000100 blau zielwert erreicht
          End If
          'Print "Blauwert: " ; B_current ; " / " ; B_dim

      'colourmixing
      If Erreicht = 0 Then                                  'alle zielwerte erreicht

         Erreicht = 7
         Incr Colourcounter                                 'colourcounter um 1 erhöhen
         If Colourcounter = 5 Then                          'colourcounter zurücksetzen
            Colourcounter = 0
         End If
         R_dim = Lookup(colourcounter , Redtable)           ' rot wert aus tabelle laden
         G_dim = Lookup(colourcounter , Greentable)         ' greenwert aus tabelle laden
         B_dim = Lookup(colourcounter , Bluetable)          ' blau

      End If
Return

Send:
   Print "Schiebebyte" ; Schiebebyte
    Latch = 0
    Shiftout Dout , Clock , Schiebebyte
    Latch = 1
Return
'End Sub
'--------------------------------- Datatables -----------------------------------
        '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

also habs jetzt soweit gebracht das mir die led blinkt, in versch,. farben , ein faden ists aber noch nicht scheint ein wenig langsam zu sein ,.

ok wenn ich möglichst keine sprünge verwende scheints zu gehen, es ist aber ein deutliches flackern zu erkenne, jetzt muss der code optimiert werden,.

wie soll ich das schieberegister ansprechen ?mit jedem timerüberlauf oder mit jedem programmzyklus?
 
Hallo Bonze!

Danke, dass du der Bitte um den Code nachgekommen bist. :)

Jetzt muss ich mich da nur erst mal durcharbeiten..... :rolleyes:


Grüße,
Cassio
 
Hallo Bonze!

Ich habe es eben mal überflogen und der richtige Aha-Effekt zu deinem Programm hat sich bei mir noch nicht eingestellt, aber eines ist mir spontan aufgefallen.


Code:
           Latch = 0
           Shiftout Dout , Clock , Schiebebyte
           Latch = 1


Soweit es mir bekannt ist, schiebt man erst die Daten in das Schieberegister und aktiviert dann den Latch einmal mit:

Code:
'Start Befehl noch vor Do-Loop:
           Latch = 1
.
..
...
           Shiftout Dout , Clock , Schiebebyte
           Latch = 0
           Latch = 1

Das 74HC595 übernimmt die Daten sobald das Latch von High auf Low wechselt.
Zu Beginn sollte die Latchleitung also auf High gesetzt werden.
Dann schiebst du "unsichtbar" die neuen Daten rüber und setzt das Latch einmal kurz auf Low.... und dann gleich wieder High.

Ich könnte mir vorstellen, dass bei deinem Code das "Reinschieben" der Bits mit "angezeigt" wird und die LED`s dann seltsam flackern.


Grüße,
Cassio
 
habs mal geändert, flackern tuts soweiso,.
jetzt vielleicht nen tick weniger,.
es handelt sich hier aber um ein MC14094 :)
das mit fem flackern,
ich hab ja nen mega1284p zum testen hier, der mit 16mhz läuft, wenn ich den prescale auf 1 stelle, dann läuft ermir zu schnell, stell ich auf 8, dann flackerts
muss irgendwie noch kleine veränderungen am code vornehmen,..

BTw das proramm ist ganz simple,
der timer zählt immer bis 255 hoch,
jetzt prüft das programm meine farb variablen, ist die aktuelle farbvariable kleiner dem zählwert, wird die farbe ausgegeben,
und das bei jedem durchlauf,. so ergeben sich die farbmischungen


habs mal so geändert
Code:
If Erreicht = 0 Then                                  'alle zielwerte erreicht
         Wait 1                                             'Haltedauer
         Erreicht = 7
         Incr Colourcounter                                 'colourcounter um 1 erhöhen
         If Colourcounter = 7 Then                          'colourcounter zurücksetzen
            Colourcounter = 0
         End If
         R_dim = Lookup(colourcounter , Redtable)           ' rot wert aus tabelle laden
         G_dim = Lookup(colourcounter , Greentable)         ' greenwert aus tabelle laden
         B_dim = Lookup(colourcounter , Bluetable)          ' blau
      End If
              Latch = 1
               Shiftout Dout , Clock , Schiebebyte
               Latch = 0
               Latch = 1
               Schiebebyte = Schiebebyte_alt
         Print "Colour" ; Colourcounter
 
nach langem rätseln warum es denn keinen effekt gibt wie wenn ich die leds direkt ansteuere, ist mir aufgefallen, das man theoretisch ja doppelt so viele anweisungen an das Schieberegister schicken mus als an die Leds.

Denn das Schieberegister ist ja Bi-stabil, d.h. es behält seinen Ausgangszustand , so müsste ich ja nach jedem übertragenen Byte nochmal den Wert 255 senden um die leds auszuschalten oder?

wert senden
leds aus
wert senden
leds aus

das müsste dann so in etwa aussehen
Code:
Portd.6 = 1
            Shiftout Dout , Clock , Schiebebyte , 0 , 8 , 0
            Portd.6 = 0
            Print "Schiebebyte: " ; Schiebebyte
            Portd.6 = 1

            Nullbyte = 255
            Shiftout Dout , Clock , Nullbyte , 0 , 8 , 0
            Portd.6 = 0
            Portd.6 = 1
 
Hallo Bonze!

Ich habe hier ja leider keine Hadware zum Testen und kann höchstens den Simulator verwenden........

Ist natürlich auch müßig den OVF0 immer von Hand zu bedienen. :rolleyes:
Aus dem Grunde habe ich mich damit noch nicht weiter befasst. :eek:


Mit den Schieberegistern hast du natürlich Recht.....
Der Zustand bleibt nach einer Anweisung natürlich erhalten!


Gruß,
Cassio
 

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