Die Software setzte ich in Visual Basic 6 um. Der Quelltext sieht wie folgt aus:
Dim Eingang As String
Dim counter As Integer
Private Sub cmdabout_Click()
frmabout.Visible = True
Form1.Enabled = False
End Sub
Private Sub cmdclear_Click()
lstbox.Clear
End Sub
Private Sub cmdexit_Click()
End
End Sub
Private Sub cmdport_Click()
MSComm1.CommPort = Text2.Text
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive: Eingang = Eingang + MSComm1.Input
End Select
counter = counter + 1
If counter = 2 Then
counter = 0
Eingabe = 0
End If
Text1.Text = Eingang
End Sub
Private Sub cmdstart_Click()
cmdstop.Enabled = True
cmdclear.Enabled = True
cmdstart.Enabled = False
End Sub
Private Sub cmdstop_Click()
Text1.Text = ""
cmdstop.Enabled = False
cmdstart.Enabled = True
End Sub
Mittels einer DLL wird der USB-Anschluss zu einem virtuellen COM-Port umgewandelt. Das heißt man programmiert nur noch einen COM-Port, anstatt einen USB-Port.
Mithilfe von Microsoft Comm.Control, welche man noch zu den Komponenten hinzufügen muss, kann man den virtuellen COM-Port verwalten (öffnen, schließen etc.)
Zusätzlich habe ich noch bestimmte Buttons mithilfe einer Funktion gesperrt, wenn z. B. Start oder Stop aktiv ist. (So lässt sich der Start-Button nur einmal drücken, danach ist der Start Button gesperrt und es muss zuerst der Stop-Button gedrückt werden.
Zusätzlich kann man die listbox löschen, in der die gewünschten Daten gespeichert worden sind.
Wichtig ist auch noch zu erwähnen dass der Zähler abwarten muss bis 2 Byte übertragen worden sind. Dieser muss dann wieder null gesetzt werden, da sonst immer weiter gezählt werden würde.
Die zusätzliche DLL, welche benötigt wurde, um einen virtuellen COM-Port zu erzeugen, wurde von der Firma FTDI-Chip zum download bereitgestellt.
Als kleinen Anhang habe ich noch ein 'About'-Fenster eingefügt, wo die Informationen über die Software zu sehen sind (Ersteller / Bearbeiter).
Das Projekt wird demnächst insofern erweitert, dass man die gewonnenen Werte in einer Datei (Excel oder einem vergleichbaren Programm) abspeichern kann.
Pic-Programm
Da der PIC keinen richtigen ADC hat wird mit Hilfe des Komparators die Spannung gemessen. Die analoge Spannung wird immer mit Vref (2,5V) verglichen und je nachdem ob die Spannung an RA1 höher oder niedriger ist wird der Ausgang RA3 auf 'high' oder auf 'low' gesetzt so dass die eingehende Spannung immer um Vreff "rumeiert". Dieser Vorgang wird 1024 mal wiederholt (10 bit). Dabei wird gezählt wie oft der Ausgang RA3 auf 'low' war und somit die Spannung gemessen (Ux=0V->0x 'low' gesetzt. Ux=5V->1024x 'low' gesetzt). Das Zählergebnis wird dann ins RS232 Register geschrieben und von der Hardware gesendet.
Programm (da das Programm direkt aus MPlab kopiert ist kommen die Zeichen so zustande (wenn ein ; vorgestellt ist hat der nachfolgende Text in der Zeile keine ausführende Funktion und dient nur zur Erklärung).
Das Programm für den PIC sieht wie folgt aus:
;
; Prozessor-Takt 4 MHz
;
; Includedatei für den 16F628 einbinden
#include <P16f628A.INC>
ERRORLEVEL -302 ; SUPPRESS BANK SELECTION MESSAGES
; Configuration festlegen:
; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF
; Variable festlegen
counter equ 0x20 ;
result_l equ 0x22 ;
result_h equ 0x23 ;
;**************************************************************
; Programmanfang
org 0
;**************************************************************
; Initialisierung *********************************************
init
clrf INTCON ; Interupt disable
; initialisierung des adc**************************************
bsf STATUS, RP0
movlw 0xEC ; Vref ein, Vref zu RA2
movwf VRCON ; LowRangeMode, VR = 12 = 2,5 V
bcf TRISA, 3 ; RA3 output des 'DAC'
bcf STATUS, RP0
movlw 0x06 ; 2 Komparatoren mit Referenzspannung
movwf CMCON ; Comp1 out = RA3
;**************************************************************
; USART initialisieren
BSF STATUS,RP0 ; Bank1
MOVLW B'10000100' ; Sender: RS232
MOVWF TXSTA
BCF STATUS,RP0 ; Bank 0
MOVLW 0x90 ; Empfänger: RS232
MOVWF RCSTA
; USART Baudrate einstellen
BSF STATUS,RP0 ; Bank1
MOVLW D'12' ; Set Baud rate 19,2 kBPS bei 4 MHz
MOVWF SPBRG
BCF TXSTA, BRGH ; BRGH=0
BCF STATUS,RP0 ; Bank 0
;**************************************************************
mainloop
call CAdc ; wandeln
RS232out
btfss PIR1,TXIF ; ist Sender leer ?
goto RS232out ; nein, noch nicht leer
movfw result_l
movwf TXREG ; und in den RS232-Sender schreiben
goto mainloop
;**************************************************************
; Wandeln der spannung*****************************************
CAdc
clrf counter
clrf counter+1
clrf result_l
clrf result_h
movlw 0x03 ; 2 Komparatoren mit Referenzspannung
movwf CMCON
loop
btfsc CMCON, C1OUT ; ist Komparator High oder low
goto complow ; low
comphigh
nop ; high
bcf PORTA, 3 ; 'DAC' = 0
incfsz result_l, f ; zählen der 'Spannung'
goto eat2cycles
incf result_h, f
goto endloop
complow
bsf PORTA, 3 ; 'DAC' = 1
nop
goto eat2cycles
eat2cycles
goto endloop
endloop
incfsz counter, f ; Zahl der Zyklen Zählen
goto eat5cycles
incf counter+1, f
movf counter+1, w
andlw 0x04 ; nur Bit 2 einblenden
btfsc STATUS, Z ; Bit 2 =1 ? 1024 Zyklen vorbei?
goto loop ; nein
goto exit ; ja
eat5cycles
goto $+1
nop
goto loop
exit
movlw 0x06 ; 2 Komparatoren mit Referenzspannung
movwf CMCON ; Comp1 out = RA3
return
end