Berechnete Zahlen und deren Anzeige ausserhalb vom PC

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

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.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Benutzeravatar
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:

Beitrag von Falko »

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 :wink:

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.
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
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:

Beitrag von Falko »

So, da bin ich wieder.

Nun läuft das Programm mit der Hardware so wie es soll. :allright:
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 :wink:

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 :wink:
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Antworten