Ich habe folgenden Code (Umsetzung eines C-Codes aus dem I-Net, Tastenabfrage-Code hier aus dem Forum) zum Testen von TM1637 7-Segment-Anzeigen über einen USB-RS232 Konverter, der soweit gut funktioniert. Nach dem Beenden des Programms wird die Com-Schnittstelle auch geschlossen, das kann ich an einer Status-LED meines Interfaces erkennen. Aber bei einem weiteren Start kann die COM-Schnittstelle nicht wieder geöffnet werden. Erst wenn ich den Konverter vom USB-Port abziehe und wieder verbinde, also den Treiber dadurch in Windows entlade, kann die Schnittstelle vom Programm wieder geöffnet werden. Das Problem liegt also wohl am Treiber des Konverters. Habt ihr eine Idee, wie ich das Problem beseitigen kann?
-Ralf
Code: Alles auswählen
Global hellig.b
Global port.b
port = 0
;
; Segmentbelegung der Anzeige:
;
; a
;
; ---
;
; f | g | b Segment | a | b | c | d | e | f | g | Doppelpunkt (nur fuer POS1) |
;
; --- ---------------------------------------------------------------------------------
;
; e | | c Bit-Nr. | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
;
; ---
;
; d
;
; Bit 7 der 7-Segmentanzeige POS1 ist der Doppelpunkt
;
; /* ----------------------------------------------------------
;
; TM1637 - Definitionen
;
; ---------------------------------------------------------- */
;
Procedure tm1637_start()
SetSerialPortStatus(port, #PB_SerialPort_RTS, 1) ;Clk high
SetSerialPortStatus(port, #PB_SerialPort_DTR, 1) ;DIO high
Delay(1)
SetSerialPortStatus(port, #PB_SerialPort_DTR, 0) ;DIO low
EndProcedure
Procedure tm1637_stop()
SetSerialPortStatus(port, #PB_SerialPort_RTS, 0) ;Clk low
Delay(1)
SetSerialPortStatus(port, #PB_SerialPort_DTR, 0) ;DIO low
Delay(1)
SetSerialPortStatus(port, #PB_SerialPort_RTS, 1) ;Clk high
Delay(1)
SetSerialPortStatus(port, #PB_SerialPort_DTR, 1) ;DIO high
EndProcedure
Procedure tm1637_write(value.b)
For i = 0 To 7
SetSerialPortStatus(port, #PB_SerialPort_RTS, 0) ;Clk low
If value & 1
SetSerialPortStatus(port, #PB_SerialPort_DTR, 1) ;DIO high
Else
SetSerialPortStatus(port, #PB_SerialPort_DTR, 0) ;DIO low
EndIf
Delay(1)
value >> 1
SetSerialPortStatus(port, #PB_SerialPort_RTS, 1) ;Clk high
Delay(1)
Next i
SetSerialPortStatus(port, #PB_SerialPort_RTS, 0) ;Clk low
Delay(1)
SetSerialPortStatus(port, #PB_SerialPort_RTS, 1) ;Clk high
Delay(1)
SetSerialPortStatus(port, #PB_SerialPort_RTS, 0) ;Clk low
EndProcedure
;
; /* ----------------------------------------------------------
;
; Benutzerfunktionen
;
; ---------------------------------------------------------- */
;
; /* ------------------- SELECTPOS ---------------------------
;
; waehlt die zu beschreibende Anzeigeposition aus
;
; --------------------------------------------------------- */
Procedure tm1637_selectpos(nr)
tm1637_start()
tm1637_write(64)
tm1637_stop()
tm1637_start()
tm1637_write(192+nr)
EndProcedure
;
; /* ----------------------- SETBRIGHT ------------------------
;
; setzt die Helligkeit der Anzeige
;
; erlaubte Werte fuer Value sind 0 .. 15
;
; ---------------------------------------------------------- */
Procedure tm1637_setbright(value)
tm1637_start()
tm1637_write(128+value)
tm1637_stop()
EndProcedure
;
; /* ------------------------- CLEAR -------------------------
;
; loescht die Anzeige auf dem Modul
;
; --------------------------------------------------------- */
Procedure tm1637_clear()
tm1637_selectpos(0)
For i=0 To 5
tm1637_write(0)
Next i
tm1637_stop()
tm1637_setbright(hellig)
EndProcedure
; /* ---------------------- SETZIF ---------------------------
;
; gibt ein Ziffer an einer Position aus
;
; --------------------------------------------------------- */
Procedure tm1637_setzif(pos, zif)
tm1637_selectpos(pos)
tm1637_write(zif)
tm1637_stop()
EndProcedure
;
; /* ----------------------- INIT ----------------------------
;
; öffnet den COM-Port
;
; ---------------------------------------------------------- */
Procedure tm1637_init()
cp = OpenSerialPort(port, "COM4", 300, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
If Not cp
MessageRequester("","Port nicht geöffnet")
CloseSerialPort(port)
End
EndIf
EndProcedure
Macro GetBit(value,bit)
(value>>bit&1)
EndMacro
Procedure.s gedrueckteTaste()
For X = 0 To 255
If getbit(GetKeyState_(X),7) KName$ = Space(255)
GetKeyNameText_(MapVirtualKey_(X,0)*$10000,KName$,255)
ProcedureReturn KName$
EndIf
Next
EndProcedure
hellig= 15;
tm1637_init()
tm1637_clear()
; led7sbmp[0] = 63
; led7sbmp[1] = 6
; led7sbmp[2] = 91
; led7sbmp[3] = 79
; led7sbmp[4] = 102
; led7sbmp[5] = 109
; led7sbmp[6] = 125
; led7sbmp[7] = 7
; led7sbmp[8] = 127
; led7sbmp[9] = 111
; led7sbmp[10] = 119 ;a
; led7sbmp[11] = 124 ;b
; led7sbmp[12] = 57 ;c
; led7sbmp[13] = 94 ;d
; led7sbmp[14] = 121 ;E
; led7sbmp[15] = 113 ;F
Repeat
Taste.s = gedrueckteTaste()
If Taste="ESC" ; press Esc to quit
CloseSerialPort(port)
End
ElseIf Taste="1"
tm1637_clear()
tm1637_setzif(2,6) ;1. Stelle
ElseIf Taste="2"
tm1637_clear()
tm1637_setzif(1,91) ;2. Stelle
ElseIf Taste="3"
tm1637_clear()
tm1637_setzif(0,79) ;3. Stelle
ElseIf Taste="4"
tm1637_clear()
tm1637_setzif(5,102) ;4. Stelle
ElseIf Taste="5"
tm1637_clear()
tm1637_setzif(4,109) ;5. Stelle
ElseIf Taste="6"
tm1637_clear()
tm1637_setzif(3,125) ;6. Stelle
EndIf
Delay(1)
ForEver