direkt ein ladbares-Schieberegister 74HCT165 und einem 74595 auf einer Platine verbunden habe.
Nun wollte ich aber 4 x 74595er kaskadieren und diese über LPT mithilfe eines einzelnen 74165er-Schieberegister laden.
Nur da funktioniert mein Programm wohl nicht korrekt. Der Aufbau ist simpel. Ich habe eine Platine mit einem 74165er und LPT-Anschluss.
dann sind dort drei Ausgänge herausgeführt, die die Seriellen Daten über Data, Takt und Load zu einer weiteren Platine mit 4 Bausteinen von
74595er verbinden. An nun zwei Bausteinen, zusammen 16Bit habe ich eine BCD-Platine von Sprut, die er für mich freundlicherweise programmiert hat,
angeschlossen, welche einen PIC mit einer 4Segmentanzeigen bestückt ist. Manuell über ein Mäuseklavier funktioniert diese BCD-Anzeige korrekt. Aber wenn ich mein Programm mit den drei Platinen benutze, werden die Werte nicht korrekt angezeigt. anstelle von 1111 wird mir dann 2222, von 2222 dann 4444 usw. angezeigt. Es sieht so aus, also ob die Bits um ein Bit zu weit hinausgeschoben werden. Leider kann ich mir den Fehler nicht erklären und hoffe, wenn es am
Programm liegen sollte, das ihr mir hier weiter helfen könnt.
Hier einige Referenzen dazu:
http://www.nxp.com/documents/data_sheet/74HC_HCT165.pdf
http://www.falko-pure.de/html/projekt_74165_595.html
http://www.sprut.de/electronic/pic/proj ... bcdled.htm
Und hier mein Source, mit dem ich dann die Bits manuell setzen kann. Für BCD von 2 Segmente benötigt man ein Byte, welches in vier Nibbles (Halbbytes)
in Form von BCD die Werte pro Ziffer schreibt. Beispiel 00010001 würde in der Anzeige 11 anzeigen, wenn das Programm richtig laufen würde.
Soweit ich konnte habe ich weit möglichst den Code kommentiert und hoffe es kommt verständlich rüber.
Zur Ansteuerung der LPT benutze ich die Library InpOut32.dll und InpOut64.dll
Code: Alles auswählen
; Author: Falko Luensmann
; Homepage: www.falko-pure.de
;
; Parallel to Serial Interface with IC 74HC165, 74HCT165, 74LP165
; Zur Ansteuerung der LPT wird die Inpout32.DLL bzw. Inpout64.DLL gebraucht.
;
; Verwendete Signale der LPT:
; Datenregister D0-D7 = Pin 2 bis Pin 9 --> Bytewerte ausgeben
; Steuerregister inv C0 = Strobe = Pin 1 (PullUp 4,7k)
; Steuerregister inv C1 = AutoFeed = Pin 14 (PullUp 4,7k)
; Steuerregister C2 = Init = Pin 16 (PullUp 4,7k) Für Folge-ICs 74595er!
; Data Register D0..D7 = Pin 2..9 8Bit Daten parallel am 74165
;Belegung LPT und 74HC165
;--------------------------------------------------------------------------------------
; 74HCT165 | LPT | VCC,GND und Beschreibung |
;-------------------|---------------|-------------------------------------------------|
; PIN 1 inv. PL| Pin 1 Strobe| Strobe 1 x 1-0-1 (lade Serial-Register) |
; PIN 2 CP | Pin 16 Init | Taktsignal 8 x 0-1-0 (schiebe Bits aus Register)|
; PIN 3 D4 | Pin 6 D5 | PullUp 4,7kOhm |
; PIN 4 D5 | Pin 7 D6 | PullUp 4,7kOhm |
; PIN 5 D6 | Pin 8 D7 | PullUp 4,7kOhm |
; PIN 6 D7 | Pin 9 D8 | PullUp 4,7kOhm |
; PIN 7 inv Q7 | -------- | nc (not connect) |
; PIN 8 GND | Pin 18..25 | GND |
; PIN 9 Q7 | -------- | SerialData Out |
; PIN 10 DS | -------- | GND |
; PIN 11 D0 | Pin 2 D1 | PullUp 4,7kOhm |
; PIN 12 D1 | Pin 3 D2 | PullUp 4,7kOhm |
; PIN 13 D2 | Pin 4 D3 | PullUp 4,7kOhm |
; PIN 14 D3 | Pin 5 D4 | PullUp 4,7kOhm |
; PIN 15 inv CE | -------- | GND |
; PIN 16 VCC | -------- | VCC +5V |
;-------------------------------------------------------------------------------------
;- Window Constants
;
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
#String_0
#CheckBox_0
#CheckBox_1
#CheckBox_2
#CheckBox_3
#CheckBox_4
#CheckBox_5
#CheckBox_6
#CheckBox_7
#Button_0
#Button_1
#Text_0
#Text_1
#Text_2
#Text_3
#Text_4
#Text_5
#Text_6
#Text_7
EndEnumeration
Global BA.w
BA=$E080; Meine zwei LPT auf PCI-Karte LPT1=E080, LPT2=E480. Standard sind LPT1=384, LPT2=E280; LPT3=3BC
Procedure Open_Window_0()
If OpenWindow(#Window_0, 480, 355, 183, 235, "Test 74165 und 74595", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
StringGadget(#String_0, 40, 25, 90, 20, "")
CheckBoxGadget(#CheckBox_0, 10, 90, 20, 20, "")
CheckBoxGadget(#CheckBox_1, 30, 90, 20, 20, "")
CheckBoxGadget(#CheckBox_2, 50, 90, 20, 20, "")
CheckBoxGadget(#CheckBox_3, 70, 90, 20, 20, "")
CheckBoxGadget(#CheckBox_4, 90, 90, 20, 20, "")
CheckBoxGadget(#CheckBox_5, 110, 90, 20, 20, "")
CheckBoxGadget(#CheckBox_6, 130, 90, 20, 20, "")
CheckBoxGadget(#CheckBox_7, 150, 90, 20, 20, "")
ButtonGadget(#Button_0, 30, 120, 110, 40, "Senden")
ButtonGadget(#Button_1, 30, 180, 110, 40, "Programmende")
TextGadget(#Text_0, 10, 70, 20, 20, "D7")
TextGadget(#Text_1, 30, 70, 20, 20, "D6")
TextGadget(#Text_2, 50, 70, 20, 20, "D5")
TextGadget(#Text_3, 70, 70, 20, 20, "D4")
TextGadget(#Text_4, 90, 70, 20, 20, "D3")
TextGadget(#Text_5, 110, 70, 20, 20, "D2")
TextGadget(#Text_6, 130, 70, 20, 20, "D1")
TextGadget(#Text_7, 150, 70, 20, 20, "D0")
EndIf
EndProcedure
Procedure.a GetBin(); Welche der 8 Bits wurden gesetzt?
DOUT.a=0
If GetGadgetState(#CheckBox_7)=1:DOUT+1:EndIf
If GetGadgetState(#CheckBox_6)=1:DOUT+2:EndIf
If GetGadgetState(#CheckBox_5)=1:DOUT+4:EndIf
If GetGadgetState(#CheckBox_4)=1:DOUT+8:EndIf
If GetGadgetState(#CheckBox_3)=1:DOUT+16:EndIf
If GetGadgetState(#CheckBox_2)=1:DOUT+32:EndIf
If GetGadgetState(#CheckBox_1)=1:DOUT+64:EndIf
If GetGadgetState(#CheckBox_0)=1:DOUT+128:EndIf
SetGadgetText(#String_0,RSet(Bin(DOUT),8,"0")+" = "+RSet(Hex(DOUT),2,"0")+"H")
ProcedureReturn DOUT
EndProcedure
If OpenLibrary(0, "inpout32.dll")
Prototype.i ProtoIOx32_0() ;kein Parameter
IOx32IsOpen.ProtoIOx32_0 = GetFunction(0, "IsInpOutDriverOpen")
Prototype.i ProtoIOx32_1(PortAdr) ;1 Parameter
IOx32Inp32.ProtoIOx32_1 = GetFunction(0, "Inp32")
Prototype.i ProtoIOx32_2(PortAdr, WertB) ;2 Parameter
IOx32Out32.ProtoIOx32_2 = GetFunction(0, "Out32")
;- Load Library INPOUT32
If IOx32IsOpen()
IOx32Out32(BA+2,1!11) ; Pin1 von LPT anfangs auf High
Open_Window_0()
GetBin()
Repeat ; Start of the event loop
Event = WaitWindowEvent() ; This line waits until an event is received from Windows
WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
GadgetID = EventGadget() ; Is it a gadget event?
EventType = EventType() ; The event type
;You can place code here, and use the result as parameters for the procedures
If Event = #PB_Event_Gadget
If GadgetID = #String_0
ElseIf GadgetID = #CheckBox_0
GetBin()
ElseIf GadgetID = #CheckBox_1
GetBin()
ElseIf GadgetID = #CheckBox_2
GetBin()
ElseIf GadgetID = #CheckBox_3
GetBin()
ElseIf GadgetID = #CheckBox_4
GetBin()
ElseIf GadgetID = #CheckBox_5
GetBin()
ElseIf GadgetID = #CheckBox_6
GetBin()
ElseIf GadgetID = #CheckBox_7
GetBin()
ElseIf GadgetID = #Button_0
;D0..D7 - Daten am 74HCT165 über das LPT-Daten-Register anlegen.
IOx32Out32(BA,GetBin())
;Hier folgt nun die Ansteuerung über das LPT-Control-Register
;C0(invertiert) Pin 1 = Strobe (Lade parallele Bits ins serielle Register 1-0-1)
;C1(invertiert) Pin 14 = Takt (8x 0-1)
;C2 Pin 16 = Load (Master-Strobe) für weitere IC-Gruppen, die seriel gefüllt werden.(1 x 0-1)
;Das XOR 11 dient zum korrekten setzen der invertierten Bits 00001011 des Controlregisters
;Strobe 1-0-1 Lade 8Bits von LPT in das serielle Register des 74HCT165
IOx32Out32(BA+2,2!11) ; Strobe Lo LPT-PIN 1
IOx32Out32(BA+2,3!11) ; Strobe Hi
;8 Takte senden 0-1-0
For i= 1 To 8
IOx32Out32(BA+2,3!11) ; Takt Lo
IOx32Out32(BA+2,1!11) ; Takt Hi LPT-PIN 14 (C1 invertiert)
Next i
;Master Strobe (Load) 0-1-0 für nachfolgende serielle IC's oder Baugruppen
IOx32Out32(BA+2,5!11) ; Load Hi LPT-PIN 16 (C2)
IOx32Out32(BA+2,1!11) ; Load Lo
ElseIf GadgetID = #Button_1
Event = #PB_Event_CloseWindow
EndIf
EndIf
Until Event = #PB_Event_CloseWindow ; End of the event loop
EndIf
EndIf
IOx32Out32(BA,0) ; LPT-Datenregister D1..D7 auf Low.
IOx32Out32(BA+2,0!11) ; LPT-Controlregiister auf Standardausgaben zurück setzen.
CloseLibrary(0)
End
;
Falko