Hallo Falko,
erst mal Danke für die Mühe die du dir gemacht hast. Ich habe das Thema erst mal wieder zurückgestellt, da es doch nicht so einfach aussah das ich es zu 100% hinbekommen würde. Ist ja ein Hobby von mir was PureBasic angeht, und da ich es für ein Projekt in der Firma anwenden wollte - wo ich natürlich keinen Pfennig bekommen würde, nur viel Zeitaufwand meinerseits - habe ich es dann erst mal gelassen. Wenn ICH es dann nicht hinbekommen würde, hätte ich dann nur das Gerede "Erst sagen es geht auch billiger - aber es funktioniert nicht etc. bla bla bla - und auf das habe ich keine Lust - grosse Schnauze, nichts dahinter bleibt dann doch an einem hängen - und das ist schlecht als Deutscher hier in der Türkei wenn man dann so etwas hat.
Mit dem Fenster komme ich nicht ganz klar
www.falko-pure.de/Programme/ReadWrite_USB_RS232.exe
Aber andere hier im Forum bekommen ja auf diese Weise auch etwas mit.
Berechnete Zahlen und deren Anzeige ausserhalb vom PC
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Hallo HemSA,
das mit Projekten in Firmen kenne ich. Es gibt leider immer bestimmte Kollegen, die sich dagegen aufwiegen, wenn sie Angst haben, das man denen durch programmieren und Ideen ihren Rang abstoßen könnte. Für mich ist
es nur ein Hobby und ich habe schon einige Steine in den Weg gelegt bekommen. Daran kann man leider nichts ändern.
Nun zum Fenster. Du meinst das mit den zwei Reihen, jeweils acht Checkboxen.
Die erste Reihe dient dazu um beim IC MOS4094 (8Bit Schieberegister)
die Ausgänge zu setzen. Damit kannst du dann 5V Logikpegel von D0-D7
mittels serielle Schnittstelle oder USB2Seriell auf die Ausgänge schalten.
Die untere Reihe gibt dir acht Signalzustände aus, die an den Eingängen
des IC's 4021 reinkommen. Das heißt, wenn dann an den Eingängen 5V
angelegt wird, kannst du in der unteren Reihe sehen, welcher Eingang ein Signal bekommt.
Ich habe mir die Schaltungen, so wie ich sie hier im Forum als LochMaster-Image gepostet habe, selbst nachgebaut und versucht die
BCD-Werte Digital anzeigen zu lassen. Zwar ist das Programm noch nicht
ganz fertig, bzw. muss ich da noch einen Fehler finden. Aber die 7Seg-LED's zeigen schön die Zahlen von -99 bis 99 an. Ich poste es
trotzdem mal als Alpha herein.
Falls jemand (vielleicht auch Du) diese Schaltungen nachbaut, könntet ihr
ja mit suchen um diesen Fehler auszuschalten. Falls ich den Fehler eher
finde, poste ich die Korrektur hier ins Forum. Vielleicht ist hier aber
jemand schneller als ich
An der Computerausgabe kann man es nun nicht sehen. Aus irgend einen Grund werden zwar die angezeigten Zahlen in Beta PB2 geschrieben und dann an einer beliebigen Zahl wie z.B. 16 mit einer Null anstelle der Sechs
überschrieben. Wie gesagt. ich bin noch am Suchen.
Vorläufiger Testsource für die 7Seg-Anzeige in Verbindung mit dem seriellen Interface.
Gruß, Falko
[Edit] Ich habe nun den Fehler gefunden und bereinigt.
das mit Projekten in Firmen kenne ich. Es gibt leider immer bestimmte Kollegen, die sich dagegen aufwiegen, wenn sie Angst haben, das man denen durch programmieren und Ideen ihren Rang abstoßen könnte. Für mich ist
es nur ein Hobby und ich habe schon einige Steine in den Weg gelegt bekommen. Daran kann man leider nichts ändern.
Nun zum Fenster. Du meinst das mit den zwei Reihen, jeweils acht Checkboxen.
Die erste Reihe dient dazu um beim IC MOS4094 (8Bit Schieberegister)
die Ausgänge zu setzen. Damit kannst du dann 5V Logikpegel von D0-D7
mittels serielle Schnittstelle oder USB2Seriell auf die Ausgänge schalten.
Die untere Reihe gibt dir acht Signalzustände aus, die an den Eingängen
des IC's 4021 reinkommen. Das heißt, wenn dann an den Eingängen 5V
angelegt wird, kannst du in der unteren Reihe sehen, welcher Eingang ein Signal bekommt.
Ich habe mir die Schaltungen, so wie ich sie hier im Forum als LochMaster-Image gepostet habe, selbst nachgebaut und versucht die
BCD-Werte Digital anzeigen zu lassen. Zwar ist das Programm noch nicht
ganz fertig, bzw. muss ich da noch einen Fehler finden. Aber die 7Seg-LED's zeigen schön die Zahlen von -99 bis 99 an. Ich poste es
trotzdem mal als Alpha herein.
Falls jemand (vielleicht auch Du) diese Schaltungen nachbaut, könntet ihr
ja mit suchen um diesen Fehler auszuschalten. Falls ich den Fehler eher
finde, poste ich die Korrektur hier ins Forum. Vielleicht ist hier aber
jemand schneller als ich
An der Computerausgabe kann man es nun nicht sehen. Aus irgend einen Grund werden zwar die angezeigten Zahlen in Beta PB2 geschrieben und dann an einer beliebigen Zahl wie z.B. 16 mit einer Null anstelle der Sechs
überschrieben. Wie gesagt. ich bin noch am Suchen.
Vorläufiger Testsource für die 7Seg-Anzeige in Verbindung mit dem seriellen Interface.
Gruß, Falko
[Edit] Ich habe nun den Fehler gefunden und bereinigt.
Code: Alles auswählen
; Ansteuerung zur 7-Segment-Anzeige,
; die ich hier im Forum gepostet habe.
; Testprogramm erstellt by Falko
; Zusätzlich angewendete Lib ist die MVCOM-Lib für
; den RS232-USB-Kram :)
Global Window_0, Spin_0, Button_0, Button_1, Button_2, i, Font_0, Dout.b
Font_0=LoadFont(#PB_Any,"Arial",24,#PB_Font_Bold)
Structure VisualDesignerGadgets
Gadget.l
EventFunction.l
EndStructure
Global NewList EventProcedures.VisualDesignerGadgets()
Global Dout.b
Global HCom.l
Procedure Delayus(t.l) ; µseconds ist Rechnerabhängig!
Structure DLong
lowlong.l
hilong.l
EndStructure
DLong=0
hitimefreq.DLong
QueryPerformanceFrequency_(@hitimefreq)
hitimecount1.DLong
hitimecount2.DLong
QueryPerformanceCounter_(@hitimecount1)
Repeat
QueryPerformanceCounter_(@hitimecount2)
Until Int((hitimecount2\lowlong - hitimecount1\lowlong)/(hitimefreq\lowlong/1000000.0))>=t
;Debug "time in µ: " + Str((hitimecount2\lowlong - hitimecount1\lowlong)/(hitimefreq\lowlong/1000000.0))
EndProcedure
Procedure Austausch()
;Shared Stelle.l, n.l, m.l
ComSetRTS(HCom,1) ;Strobe on (DTR)
Delayus(20) ;wait 2 µseconds
ComSetRTS(HCom,0) ;Strobe off
Stelle=1 ;position = 1
Din=0
For n=1 To 8
If (Dout & Stelle) XOr 0
ComSetTXD(HCom,1) ;TxD on
Else
ComSetTXD(HCom,0) ;TxD off
EndIf
If ComGetDCD(HCom) = 1
Din=Din+Stelle
EndIf
Delayus(10) ;wait 1 µseconds
ComSetDTR(HCom,1);Clock on (DTR)
Stelle=Stelle*2 ;position=position*2
Delayus(10) ;wait 1 µseconds
ComSetDTR(HCom,0);Clock off
Next n
ComSetRTS(HCom,1) ;Strobe on (DTR)
Delayus(20) ;wait 1 µseconds
ComSetRTS(HCom,0) ;Strobe off
; Next n; all states behind, you can see when if this next
EndProcedure
Procedure RegisterGadgetEvent(Gadget, *Function)
If IsGadget(Gadget)
AddElement(EventProcedures())
EventProcedures()\Gadget = Gadget
EventProcedures()\EventFunction = *Function
EndIf
EndProcedure
Procedure CallEventFunction(Window, Event, Gadget, Type)
ForEach EventProcedures()
If EventProcedures()\Gadget = Gadget
CallFunctionFast(EventProcedures()\EventFunction, Window, Event, Gadget, Type)
LastElement(EventProcedures())
EndIf
Next
EndProcedure
Procedure Open_Window_0()
Window_0 = OpenWindow(#PB_Any, 48, 23, 264, 135, "7-Seg-Anzeige", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
If Window_0
If CreateGadgetList(WindowID(Window_0))
Spin_0 = SpinGadget(#PB_Any, 90, 15, 80, 48, -99, 99,#PB_Spin_ReadOnly|#PB_Spin_Numeric)
SetGadgetFont(Spin_0, FontID(Font_0))
Button_0 = ButtonGadget(#PB_Any, 5, 70, 80, 40, "Anzeigen")
Button_1 = ButtonGadget(#PB_Any, 93, 70, 80, 40, "Auto-Test")
Button_2 = ButtonGadget(#PB_Any, 180, 70, 80, 40, "Beenden")
SetGadgetState (Spin_0, 0)
EndIf
EndIf
EndProcedure
Open_Window_0()
HCom=ComOpen("com3:9600,n,8,1",0,0,0)
If HCom > 0
Else
MessageRequester("Fehlermeldung","COM-Schnittstelle kann nicht geöffnet werden!",#PB_MessageRequester_Ok );Error if Com not activate
EndIf
Procedure IsNegative(Wert)
If Left(Str(Wert),1) = "-" ; Bei zwei oder drei Segmenten wird das erste Zeichen auf Minus geprüft
Dout!64
EndIf
EndProcedure
Procedure VerifyDigit() ; Hier wird die Zahl für die Digitalanzeige zerpflückt. Ist noch nicht
; ganz korrekt, da einige Zahlen durch eine Null überschrieben werden.
Protected Digits.b
Wert=Val(GetGadgetText(Spin_0)); Wert vom Windows einlesen
Digits=Len(Str(Wert))
If Digits=1 ; Ein Segment wird benötigt
Dout = Wert+16 ;Einerstelle anzeigen (rechtes IC gibt mit High auf Latch den BCD-Wert aus)
Austausch()
Dout=Dout!16; PE oder Latch vom rechten IC auf Low
Austausch()
Debug "Ein Segment: "+RSet(Bin(Wert+16),8,"0")+" --> "+Str(Wert)
ElseIf Digits=2 ; Zwei Segmente werden benötigt
Dout = Val(Right(Str(Wert),1))+16 ;Einerstelle anzeigen
Austausch()
Dout!16
Austausch()
Dout = Val(Left(Str(Wert),1))+32 ;Zehnerstelle anzeigen (linkes IC gibt mit High auf Latch den BCD-Wert aus)
IsNegative(Wert)
Austausch()
Dout!32 ; PE oder Latch vom linken IC auf Low
Austausch()
Debug "Zwei Segmente: " + RSet(Bin(Val(Left(Str(Wert),1))+32),8,"0") + " --> " + Left(Str(Wert),1) + " ; " + RSet(Bin(Val(Right(Str(Wert),1))+16),8,"0") + " --> " + Right(Str(Wert),1)
ElseIf Digits=3 ; Drei Segmente werden benötigt
Dout = Val(Right(Str(Wert),1))+16 ;Einerstelle anzeigen
Austausch()
Dout!16
Austausch()
Dout = Val(Mid(Str(Wert),2,1))+32 ;Zehnerstelle anzeigen
IsNegative(Wert)
Austausch()
Dout!32
Austausch()
Debug "Drei Segmente: " + RSet(Bin(Val(Mid(Str(Wert),2,1))+32),8,"0") + " --> " + Mid(Str(Wert),2,1) + " ; " + RSet(Bin(Val(Right(Str(Wert),1))+16),8,"0") + " --> " + Right(Str(Wert),1)
EndIf
EndProcedure
Repeat
Event = WaitWindowEvent()
Gadget = EventGadget()
Type = EventType()
Window = EventWindow()
Select Event
Case #PB_Event_Gadget
CallEventFunction(Window, Event, Gadget, Type)
Select Gadget
Case Button_0
VerifyDigit()
Case Button_1
For i=-99 To 0
SetGadgetState(Spin_0,i):SetGadgetText(Spin_0,Str(i))
VerifyDigit()
If WindowEvent()=#PB_Event_Gadget And EventGadget()=Button_2
Break 2
EndIf
Next i
For i=1 To 99
SetGadgetState(Spin_0,i):SetGadgetText(Spin_0,Str(i))
VerifyDigit()
If WindowEvent()=#PB_Event_Gadget And EventGadget()=Button_2
Break 2
EndIf
Next i
Case Button_2
Event=#PB_Event_CloseWindow
EndSelect
Austausch()
EndSelect
Until Event = #PB_Event_CloseWindow
Dout=%111111:Austausch(); Digitalanzeige ausschalten und Com ausschalten
Dout=%001111:Austausch()
Delay(100)
ComClose(HCom)
End
Zuletzt geändert von Falko am 22.02.2008 19:30, insgesamt 1-mal geändert.
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
So, da bin ich wieder.
Nun läuft das Programm mit der Hardware so wie es soll.
Den Source habe ich im vorherigen Eintrag korrigiert.
Dazu gekommen ist nun auch ein Autotest-Button, sodass man nun nicht von
-99 bis 99 im Spin-Gadget klicken muss um alle Digitalen Zahlen der Hardware
zu testen
Hierzu nun auch ein Video um die Funktion zu sehen. Das mit dem blinkenden
Minus ändere ich noch
Video zu 7-SEG-Anzeige mit Purebasic
Viel Spass beim Nachbauen und Programmieren der Hardwareansteuerung.
Grüße ... Falko
Nun läuft das Programm mit der Hardware so wie es soll.
Den Source habe ich im vorherigen Eintrag korrigiert.
Dazu gekommen ist nun auch ein Autotest-Button, sodass man nun nicht von
-99 bis 99 im Spin-Gadget klicken muss um alle Digitalen Zahlen der Hardware
zu testen
Hierzu nun auch ein Video um die Funktion zu sehen. Das mit dem blinkenden
Minus ändere ich noch
Video zu 7-SEG-Anzeige mit Purebasic
Viel Spass beim Nachbauen und Programmieren der Hardwareansteuerung.
Grüße ... Falko