PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 74HC595 Porterweiterung mit Bascom. Bitte um Hilfe.



Accenter
26.10.2012, 18:13
Für ein Projekt beötige ich um die 70 Ausgänge und komm deshalb nicht um einige 74HC595 Schieberegister herum. Hab nach Bascom Bespielen gegoogelt aber leider nur schwer verständliche Dinge gefunden. Habe keinerlei Erfahrung mit Schieberegistern bisher. Hat vielleicht jemand von euch einen Minimalcode für mich als Beispiel um mir das ganze zu verdeutlichen. So einfach gehalten wie es geht bitte :-)

Thomas E.
26.10.2012, 21:38
Im RN-Wissen ist unter "Portexpander am AVR" folgender Code dargestellt:


' SERiell nach PArallel (serpa) mit Hardware-Unterstuetzung
' Beispiel mit 2 Datenbytes

' SPI Bus (Hardware) als Master konfiguiren
Config SPI = Hard , Master = Yes

' SPI Bus initialisieren
' setzt das DDR Register entsprechend
Spiinit

' Bytes für die Daten
Dim Serpa(2) As Byte
Serpa(1) = &B10101010
Serpa(2) = &B00000000

' Die Bytes auf den SPI Bus schieben
Spiout Serpa(1) , 2

Dieser Code verwendet die Hardware-SPI, ein Arbeiten mit dem 595 als Portexpander ist aber auch mittels Software-SPI möglich. Dazu siehst du am Besten in der BASCOM-Hilfe unter "Serout" nach.

Steht die Hardware schon?

Accenter
26.10.2012, 21:44
Danke für die Hilfe. Die Hardware steht noch nicht, da bin ich flexibel. Ich kann mit dem Code leider nur wenig anfangen. Ich hatte gehofft jemand kann mir anhand einiger Zeilen demonstrieren was ich tun muß, um z.B. den Ausgang Q0 von 0 auf 1 zu schalten. Am besten so einfach wie möglich und "komplett zu Fuß" damit ich es verstehe. Zum Test würde ich da mal LED's ansteuern. da ich nichts zeitkritisches mache reicht für mich auch eine Lösung per Software SPI.

Thomas E.
26.10.2012, 21:59
Im Prinzip schiebst du nur einen Bitstrom seriell in das Schieberegister hinein. Wenn du einen 595 hast, dann hast du auch 8 Bits die du reinschieben musst. Erst wenn alle 8 Bits drinnen sind, wird mit einem Strobe an RCK dem 595 gesagt: "Du hast alles bekommen, jetzt schalte!" Dann werden die Ausgänge so geschaltet, wie das Bitmuster aussah.

Willst du also Q0 auf High und den Rest auf Low schalten, dann schiebst du 00000001 rein.
Willst du Q0 und Q5 auf High schalten und den Rest auf Low, dann schiebst du 00010001 rein. Das wäre übrigens auch die Dezimalzahl 17.

Als Grundlage für eigene Versuche solltest du die Zahlensysteme Binär, Dezimal und Hexadezimal verstehen und anwenden (also einen beliebigen Wert in ein anderes Zahlensystem konvertieren) können. Wenn diese Erfahrungen fehlen, würde ich erstmal dort ansetzen.

Accenter
26.10.2012, 22:11
Danke das hilft mir schonmal weiter das ganze zu verstehen. Bei einer seriellen Übertragung brauch ich auch ne Baudrate, oder? Bei "SER" schiebe ich das Bitmuster rein, mit "RCK" entscheide ich wann das ganze an den Ausgängen ausgegeben wird. Was hat es mit dem "SCK" aufsich? Da brauch ich ne Clock? Wie erzeuge ich die? Welche Frequenz muß diese haben? Wenn ich mehrere 595er kaskadiere wird dann einfach die Bitfolge länger, richtig?

Thomas E.
26.10.2012, 22:35
Lt. Wikipedia.org:

Baud [bɔːd], Bd ist die Einheit für die Symbolrate (Schrittgeschwindigkeit) in der Nachrichtentechnik und Fernmeldetechnik. 1 Baud ist die Geschwindigkeit, wenn 1 Symbol pro Sekunde übertragen wird. Jedes Symbol entspricht einer definierten, messbaren Signaländerung im physischen Übertragungsmedium. Die Baudrate einer Datenübertragung muss auf Sende- und Empfangsseite gleich sein.
Du bestimmst einfach eine Frequenz (nach oben allerdings begrenzt). Diese ist automatisch und ohne jegliches Abgleichen bei allen Schieberegistern die gleiche, da du sie ja alle über diesselbe Clockleitung taktest. Die Frequenz kannst du bei der Hard-SPI durch veschiedene Prescaler aus dem Systemtakt herunterteilen:

The SPI is clocked by the system clock which is divided by a the SPI divider. If you select a division factor of 4, and the system clock is 4 MHz, then the SPI clock will be 1 MHz.
The possible values are :
CLK2, CLK4, CLK8, CLK16, CLK32, CLK64 and CLK128
Bei der Soft-SPI kannst du ebenfalls frei über die Frequenz verfügen, in dem du als Befehlsattribut eine Baudrate nennst.
Du könntest übrigens auch auf einem Steckbrett ein Schieberegister rein nur mit Taster bedienen, sozusagen in Zeitlupe. Es gibt keine Mindestfrequenz, du kannst also in Ruhe überlegen, den Eingang auf einen Pegel legen und das Bit mit einem Tastendruck reinschieben.


Bei "SER" schiebe ich das Bitmuster rein, mit "RCK" entscheide ich wann das ganze an den Ausgängen ausgegeben wird.
Richtig. Den Strobe auf RCK macht man üblicherweise direkt nach dem Schieben. Es gibt auch Register ohne diese "Latch"-Funktion: Bei diesen flattern die Ausgänge während einem Schiebevorgang, da ja die Bits seriell durchgeschoben werden (total unpraktisch). Du schiebst quasi im Hintergrund und erst auf dein Kommando schalten alle Ausgänge um. Übrigens: Der Eingang G am 595 kann alle Ausgänge hochohmig schalten. Falls du LEDs mit den Schieberegistern bedienen willst, kannst du mit einem PWM-Takt an G diese dimmen - unabhängig von der Schieberei.


Wenn ich mehrere 595er kaskadiere wird dann einfach die Bitfolge länger, richtig?
Genau. Zu bedenken ist aber, dass das als erstes hinausgeschobene Bit am Ende der Schiebeoperation am letzten Schieberegister die letzte Stelle ist.

Accenter
26.10.2012, 23:45
Super, ich denk ich bekomm das hin. Werde das gleich mal am Steckbrett testen. Was hat es mit diesem "Strobe" aufsich? Beim reinschieben der Bitfolge muß an "RCK" was genau liegen? High? Low? Um die Bitfolge dann an die Ausgänge zu schicken muß ein Übergang von "High" auf "Low" erfolgen oder umgekehrt? Nach dieser Info kann ich loslegen :-)

Thomas E.
26.10.2012, 23:54
Super, ich denk ich bekomm das hin. Werde das gleich mal am Steckbrett testen.
Eine tolle Idee - du kannst quasi live zusehen was passiert. So sollte sich die Funktion schnell erschließen. :)


Was hat es mit diesem "Strobe" aufsich?
Ein High-Impuls.


Um die Bitfolge dann an die Ausgänge zu schicken muß ein Übergang von "High" auf "Low" erfolgen oder umgekehrt? Nach dieser Info kann ich loslegen :-)
Da müsste man im Datenblatt nachschauen. Oder du versuchst die Erkenntnis aus deinem Steckbrett-Aufbau zu gewinnen. ;)

Probier die Sache mal am Steckbrett aus und wenn etwas nicht funktioniert dann frag einfach. So versteht man es am schnellsten. Vergiss nicht für definierte Pegel an den Eingängen zu sorgen! Viel Spass beim Testen und ich hoffe du wirst uns berichten ob alles wie gewünscht funktioniert hat. :)

dussel07
27.10.2012, 02:24
Hab mal probiert das Beispiel der Elektronikerseite (http://www.dieelektronikerseite.de/uC Ecke/Lections/Porterweiterung - Darf's ein Port mehr sein.htm) für mich aufzubereiten.
Jetzt habe ich endlich die AND Funktion verstanden - -
Was ich immer noch nicht weiß: Warum Boolean statt Bit (definition Variable)
Hier das Bascomprogramm

'8Bit Binärzähler mit Schieberegister 74HC164
'PortD.0 an MR
'PortD.1 an CL
'PortD.2 an Da
'LED an allen Ausgängen des 74HC164



$regfile "m8def.dat"
$crystal = 1000000

Dim Zahl As Byte
Dim Sichern As Byte
Dim Outbit As Boolean 'Boolean?? warum nicht als Bit???
Dim Durchlauf As Byte

Config Portd.0 = Output
Master_reset Alias Portd.0
Config Portd.1 = Output
Tackt_eingang Alias Portd.1
Config Portd.2 = Output
Ausgang Alias Portd.2

Tackt_eingang = 0

Do
Sichern = Zahl : Master_reset = 0 : Master_reset = 1 'Alle LED kurz aus
For Durchlauf = 1 To 8 '8 Durchläufe für 8 Bit
Outbit = Sichern And 1 : Ausgang = Outbit 'Hier wird geprüft ob das letzte Bit 1 ist und dann endsprechend ausgegeben
Tackt_eingang = 1 : Tackt_eingang = 0 'das Bit ins Schiebregister
Shift Sichern , Right 'die Binärzahl um eine Stelle nach rechts schieben (rechtes Bit entfällt)
Next Durchlauf
Incr Zahl : Waitms 300 'Zahl plus 1 --- kurz warten
If Zahl >= 255 Then 'wenn Zahl größer gleich 255 dann
Zahl = 0 ' Zahl gleich 0
End If
Loop

'Beispiel:
'Zahl = 3 -> Sichern = 3 (00000011)
'Outbit = 00000011 AND 1 = 1
'Ausgang = 1
'Sichern (0011) schiebe nach rechts = 00000001
'nächster Durchgang 00000001 AND 1 = 1
'Ausgang = 1
'Sichern (00000001) schiebe nach rechts = 00000000
'nächster Durchgang 00000000 AND 1 = 0
'Ausgang = 0
'usw

Accenter
27.10.2012, 20:09
Habe hier noch eine tolle Seite gefunden die die Funktion erklärt. Man kann wie oben beschrieben alles auch ganz langsam ansteuern und somit genau lernen wie es funktioniert. Total einfach eigentlich wenn man es mal begriffen hat! Danke für die tolle Hilfe und Erklärung! http://conductiveresistance.com/interactive-595-shift-register-simulator/

Thomas E.
28.10.2012, 10:57
Habe hier noch eine tolle Seite gefunden die die Funktion erklärt. Man kann wie oben beschrieben alles auch ganz langsam ansteuern und somit genau lernen wie es funktioniert. Total einfach eigentlich wenn man es mal begriffen hat! Danke für die tolle Hilfe und Erklärung! http://conductiveresistance.com/interactive-595-shift-register-simulator/
Das ist wirklich eine tolle Seite! :)
Ich werde das gleich in den RN-Wissen-Artikel einbauen. :)
Danke für den Tipp!