Aktuelle Zeit: 23.02.2020 00:20

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: 21.02.2008 20:47 
Offline

Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
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.2 (Windows)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 21.02.2008 22:18 
Offline
Admin
Benutzeravatar

Registriert: 29.08.2004 11:27
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:
; 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

_________________
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic


Zuletzt geändert von Falko am 22.02.2008 19:30, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 22.02.2008 17:04 
Offline
Admin
Benutzeravatar

Registriert: 29.08.2004 11:27
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ]  Gehe zu Seite Vorherige  1, 2

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye