Das Programm steuert ein I2C-Bus-System. Dabei bedient es sich vorgegebener Hardwaretreiber, die softwaremäßig angesteuert werden und somit den Bus ansprechen.
Der Benutzer sendet die Daten vom PC aus über die serielle Schnittstelle an den Microcontroller. Dieser steuert über die spezielle Hardware den Bus. Empfangsseitig arbeitet auch ein Microcontroller, der die Daten wiederum über die serielle Schnittstelle zum PC überträgt.
Die Realisierung der Bedienerführung des Programms erfolgte in zwei Versionen. Die erste Version, die lediglich als Vorversion zur letztgültigen zweiten Version gedachte war, besteht nur aus dem in Assembler geschriebenen Programm für den Microcontroller, das über ein Terminalprogramm kommuniziert. Einstellungen müssen direkt im Programmcode vorgenommen und dieser anschließend erneut assembliert werden.
Die zweite Version besteht aus einem Assembler-Programm und einem auf Microsoft Windows basierenden Programm für den PC, das mit dem Assembler-Programm kommuniziert.
Die Hardwaretreiber des Busses werden von der Software angesprochen, indem diese entsprechende Werte in die zuständigen Register schreibt. Es gibt hierfür vier Register, die wie im folgenden erklärt zu verwenden sind.
S1ADR
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
GC |
In den ersten sieben Bits A0-A6 wird die eigene Adresse gespeichert, mit der der Teilnehmer im Bus angesprochen werden kann. GC bestimmt, ob das Gerät auf einen General Call reagiert; wobei 0 diesen erlaubt und 1 diesen ignoriert.
S1DAT
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
Bei einem Transmitter wird in dieses Register das zu übertragende Byte geschrieben. Ein Receiver zeigt damit das soeben empfangene Byte.
S1CON
CR2 |
ENS1 |
STA |
STO |
SI |
AA |
CR1 |
CR0 |
Die Bits CR0, CR1, CR2 legen die Übertragungsrate des Busses fest. Das Setzen von ENS1 aktiviert die Bus-Schnittstelle. Setzen von STA oder STO bewirkt eine Start- beziehungsweise Stoppaufforderung an den Bus. STA muß anschließend wieder rückgesetzt werden, STO macht dies selbständig. SI ist das Interrupt-Flag, welches bei jedem Bus-Interrupt gesetzt wird und anschließend rückgesetzt werden muß, um die Busübertragung fortzusetzen. Ein gesetztes AA läßt das Geräte ein Acknologe schicken, wenn es die Kommunikation erfordert, ein rückgesetztes AA hingegen läßt das Gerät nicht reagieren und damit ein Not Acknolege schicken.
S1STA
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
S0 |
Dieses Byte enthält nach einem vom Bus ausgelösten Interrupt den Status, in dem sich der Bus befindet und der den Interrupt ausgelöst hat.
Dieses Programm erfüllt die vier Funktionen Master Transmitter, Master Receiver, Slave Transmitter, Slave Receiver.
Zu Starten ist das Programm bei der Adresse 8000h.
Um die Übertragung als Master zu beginnen, muß "a" eingegeben werden. Abhängig vom Richtungsbit, das bei dieser Version im Programmcode in den Routinen "08h Start gesendet" beziehungsweise "10h Repeated-Start gesendet" eingestellt werden muß, wird das Terminal zum Master Transmitter oder zum Master Receiver.
Da das Programm alle für den Betrieb als Slave nötigen Interruptroutinen enthält, kann es auch als Slave angesprochen werden. Hierbei wird an Hand des empfangenen Richtungsbit zwischen Transmitter und Receiver unterschieden und automatisch die entsprechende Routine angesprochen.
Die Übertragung kann vom Transmitter, gleich ob Master oder Slave, mit "!" beendet werden.
Zu beachten ist, daß alle gleichzeitig am Bus verwendeten Programme unterschiedliche eigene Adressen besitzen müssen, was im Programmcode im entsprechenden Register S1ADR in der Routine "Initialisierung" einzustellen ist.
; I2C-Bus
; Entwickelt für µC-Kit von Kern
; Michael Popp; Februar 1998
Vereinbarungen
charin code 2730h ;Unterprogramm Zeicheneingabe
charout code 273Ch ;Unterprogramm Zeichenausgabe
anfang code 8000h ;Start-Adresse
inter code 802Bh ;Adresse für I2C-Interrupt
haupt code 8200h ;Adresse Hauptprogramm
s1adr data 0dbh ;Eigene Bus-Adresse
s1dat data 0dah ;Bus-Daten
s1con data 0d8h ;Bus-Kontrollen
s1sta data 0d9h ;Bus-Status
P1_6 bit 96h ;SCL-Pin
P1_7 bit 97h ;SDA-Pin
si bit 0dbh ;Interrupt Flag
aa bit 0dah ;Ackknowledge Flag
sta bit 0ddh ;Startbit
sto bit 0dch ;Stoppbit
es1 bit 0adh ;I2C-Bus-Interrupt aktivieren
Hauptprogramm
org anfang
mov dptr,#haupt ;
clr a ;
jmp @a+dptr ;
org haupt
call init ;Bus initialisieren
loop: mov a,s1sta
cjne a,#0F8h,loop ;Interrupts
call charin ;
cjne a,#61h,loop ;
call start ;
jmp loop ;
Initialisierung
; -> /
; <- /
; cha ea, es1, P1_6, P1_7, s1adr, s1con
; subr /
init: setb ea ;Interrupts aktivieren
setb es1 ;I2C-Bus-Interrupts aktivieren
setb P1_6 ;
setb P1_7 ;
mov s1adr,#10000000b ;Eigene Busadresse, General Call aktiviert
mov s1con,#11000101b ;Controllregister
;S1CON: 1 1 0 0 0 1 0 1
- ENS1 STA STO SI AA CR1 CR0
ret
Starten
; -> /
; <- /
; cha aa, sta, si
; subr /
start: setb aa
setb sta ;Startbit setzen
clr si
ret
Interruptroutinen
; -> /
; <- /
; cha s1dat, s1con, a
; subr charin, charout
; 00h alle Bus-Fehler
sta00:
reti
; 08h MT, MR Start gesendet
sta08:
mov S1DAT,#11000000b ;Richtungsbit auf senden
mov S1DAT,#11000001b ;Richtungsbit auf empfangen
clr sta ;
clr sto ;
setb aa ;
clr SI ;
reti
; 10h MT, MR Repeated-Start gesendet
sta10:
mov S1DAT,#11000000b ;Richtungsbit auf senden
mov S1DAT,#11000001b ;Richtungsbit auf empfangen
clr sta ;
clr sto ;
setb aa ;
clr SI ;
reti
; 18h MT Adresse+W gesendet, ACK empfangen
sta18: call charin ;Tastatureingabe
cjne a,#21h,lab18a ; ! zum Abbruch
setb sto ;Stopbit setzen
jmp lab18b ;Verarbeitung der Daten ueberspringen
lab18a: call charout ;
mov s1dat,a ;
lab18b: clr si ;Daten senden oder Verbindung beenden
reti
; 20h MT Adresse+W gesendet, NACK empfangen
sta20: setb STO ;Stop senden
clr SI
reti
; 28h MT Daten gesendet, ACK empfangen STANDARD
sta28: call charin ;Tastatureingabe
cjne a,#21h,lab28a ; ! zum Abbruch
setb sto ;Stopbit setzen
jmp lab28b ;Verarbeitung der Daten ueberspringen
lab28a: call charout ;
mov s1dat,a ;
lab28b: clr si ;Daten senden oder Verbindung beenden
reti
; 30h MT Daten gesendet, NACK empfangen
sta30: setb sto
clr si
reti
; 38h MT, MR Arbitration verloren beim Senden von Adresse oder Daten (Transmitter)
beim NACK (Receiver)
sta38: setb sto
clr si
reti
; 40h MR Adresse+R gesendet, ACK empfangen
sta40: clr si ;auf Daten vom Slave warten
reti
; 48h MR Adresse+R gesendet, NACK empfangen
sta48: setb sto
clr si
reti
; 50h MR Daten empfangen, ACK gesendet STANDARD
sta50: mov A,s1dat ;Daten vom Slave in Akku
cjne a,#21h,lab50a ; ! von Slave zum Beenden
clr aa
jmp lab50b
lab50a: call charout ;Datenausgabe
lab50b: clr si
reti
; 58h MR Daten empfangen, NACK gesendet
sta58: setb sto
clr si
reti
; 60h SR Adresse+W empfangen, ACK gesendet
sta60: clr si
reti
; 68h SR Arbitration verloren als adressierter Master,
; Adresse+W empfangen, ACK gesendet
sta68: setb sto
clr si
reti
; 70h SR General-Call empfangen, ACK gesendet
sta70: clr si
reti
; 78h SR Arbitration verloren als adressierter Master,
; General-Call empfangen, ACK gesendet
sta78: setb sto
clr si
reti
; 80h SR Daten empfangen, ACK gesendet (adressiert) STANDARD
sta80: mov A,S1DAT ;Daten vom Master in Akku
call charout ;Zeichen ausgeben
clr si
reti
; 88h SR Daten empfangen, NACK gesendet (adressiert)
sta88: clr si
reti
; 90h SR Daten empfangen, ACK gesendet (General Call)
sta90: mov A,S1DAT ;Daten vom Master in Akku
call charout ;Zeichen ausgeben
clr si
reti
; 98h SR Daten empfangen, NACK gesendet (General Call)
sta98: clr si
reti
; A0h SR Stop oder Repeated-Start empfangen
staA0: clr si
reti
; A8h ST Adresse+R empfangen, ACK gesendet
staA8: mov r5,#00h ;
call charin ;Zeicheneingabe
cjne a,#21h,labA8a ; ! von Slave zum Beenden
mov r5,#0FFh
labA8a: call charout ;Zeichen ausgeben
mov S1DAT,A ;
clr si ;Uebertragung
reti
; BOh ST Arbitration verloren als adressierter Master,
; Adresse+R empfangen, ACK gesendet
staB0: setb sto
clr si
reti
; B8h ST Daten gesendet, ACK empfangen STANDARD
staB8: cjne r5,#0FFh,labB8b
mov a,#0FFh
jmp labB8c
labB8b: call charin ;Zeicheneingabe
cjne a,#21h,labB8a ; ! von Slave zum Beenden
mov r5,#0FFh
jmp labB8c
labB8a: call charout ;Zeichen ausgeben
labB8c: mov S1DAT,A ;
clr si ;Uebertragung
reti
; C0h ST Daten gesendet, NACK empfangen
staC0: clr si
reti
; C8h ST AA=0, letzte Daten gesendet, ACK empfangen
staC8: mov S1DAT,0FFh ;S1DAT=11111111b
clr si
reti
Interruptsprünge
org inter
jmp intera
org 8F00h
intera:
mov A,S1STA ;Je nach Statusinhalt
mov dptr,#9000h ;Sprung auf jeweilige
jmp @A+dptr ;SUB-Routine
org 9000h
jmp sta00
org 9008h
jmp sta08
org 9010h
jmp sta10
org 9018h
jmp sta18
org 9020h
jmp sta20
org 9028h
jmp sta28
org 9030h
jmp sta30
org 9038h
jmp sta38
org 9040h
jmp sta40
org 9048h
jmp sta48
org 9050h
jmp sta50
org 9058h
jmp sta58
org 9060h
jmp sta60
org 9068h
jmp sta68
org 9070h
jmp sta70
org 9078h
jmp sta78
org 9080h
jmp sta80
org 9088h
jmp sta88
org 9090h
jmp sta90
org 9098h
jmp sta98
org 90A0h
jmp staA0
org 90A8h
jmp staA8
org 90B0h
jmp staB0
org 90B8h
jmp staB8
org 90C0h
jmp staC0
org 90C8h
jmp staC8
end
Das in Kapitel 3 beschriebene Assembler-Programm wurde um zur Kommunikation mit dem PC nötigen Zeilen ergänzt und wird nun über die serielle Schnittstelle mit einem PC-Programm angesprochen. Erstellt wurde dieses mit der Entwicklungsumgebung Microsoft Visual Basic 5.0 Enterprise Edition.
Um den mC mit dem PC-Programm ansprechen zu können, muß sich der mC im I²C-Bus-Status F8h befinden. Nun kann vom PC-Programm die Verbindung zum mC erstellt werden. Dabei beginnt das Programm die serielle Schnittstelle des PCs zu beanspruchen. Dann sendet es den Befehl 80h an den mC, worauf dieser seinen Status F8h zu melden hat. Geschieht dies korrekt, so schickt der PC nun die Adresse, die das Terminal laut den Einstellungen anzunehmen hat, an den mC, wo sie im entsprechende Register S1ADR gelegt wird. Weiters aktiviert der mC nun den I²C-Bus und den zugehörigen Interrupt.
Zu Beginn jeder Interrupt Service Routine des I²C-Busses sendet der Microcontroller seinen aktuellen Status an den PC. Der PC hat ebenfalls seinen eigenen Status, der in der Variablen "Status" gespeichert ist. Erhält nun der PC das OnComm-Ereignis, welches durch den Eingang von Daten über die serielle Schnittstelle ausgelöst wird, so wählt er in einer auf den aktuellen PC-Status bezogenen Case-Anweisung den auszuführenden Programmcode. Hier wird die vom Microcontroller kommende Nachricht, die nun den aktuellen Status des Microcontrollers enthält, eingelesen. Somit kann der PC seinen Status aktualisieren. Gleichzeitig wird ermittelt, ob der neue Status eine korrekte Fortsetzung des alten Status darstellt oder ob eine Fehler aufgetreten ist. Entsprechend verlaufen die weiteren Vorgänge im PC.
Bestimmte Statuszustände im PC erwarten sofort einen weiteren Eingang an Daten vom mC. Dazu wird im PC die Eigenschaft "Enabled" des Hauptfenster "FormMain" auf false gesetzt und der Timer aktiviert. Können nun wie erwartet Daten empfangen werden, so wird der Timer deaktiviert und das eingegangene Byte wird verarbeitet. Tritt jedoch das OnComm-Ereignis nicht auf, so schließt der PC nach Ablauf des Timers auf ein Fehlverhalten des mC und gibt eine Fehlermeldung am Bildschirm aus.
Um das Programm testweise mit einem Entwicklungs-Board in Betrieb nehmen zu können, muß vorerst mittels eines Terminalprogramms das Assembler-Programm über die serielle Schnittstelle in den mC geladen werden. Dabei darf das PC-Programm noch keinen Anspruch auf die Schnittstelle erheben. Dann ist das mC-Programm an der Adresse 8000h zu starten und die Verbindung mit dem Terminalprogramm zu trennen.
Nun wird mit dem PC-Programm über die Schnittstelle die Verbindung zum mC hergestellt, anschließend kann auch die Busverbindung erfolgen. Entnehmen Sie nähere Beschreibungen zu diesen Schritten dem zugehörigen Hilfesystem.
Das zum Programm gehörende Hilfesystem wurde mit Microsoft Help Workshop 4.02 erstellt.
Es beschreibt die Bedienung des Programms, so daß nähere Erläuterungen in dieser Dokumentation nicht erforderlich sind.
Sofort nach dem die Verbindung zum Microcontroller hergestellt wurde sendet der PC entsprechend den in der Record-Variablen "Einstellungen" gespeicherten Einstellungen die folgenden Werte an den Microcontroller.
PC-Variable |
mC-Variable |
Beschreibung |
Einstellungen.OwnAddress |
S1ADR.0 bis S1ADR.6 |
Terminal-Adresse |
Einstellungen.GetGC |
S1ADR.7 |
General Call annehmen |
Mit den folgenden festgelegten Werten fordert der PC den mC zu bestimmten Aktionen auf. Der mC empfängt diese Aufforderungen im Hauptprogramm und führt die entsprechende Aktion auch dort aus.
Code von PC |
Beschreibung |
80h |
Verbindung zu mC herstellen; mC-Status an PC; I²C-Bus aktivieren |
81h |
Verbindung zu mC trennen; I²C-Bus deaktivieren |
82h |
Startaufforderung an Bus; CALL START |
83h |
Stoppaufforderung an Bus; SETB STO |
84h |
AA rücksetzen; CLR AA |
85h |
AA setzen; SETB AA |
In der Record-Variablen "Einstellungen" befinden sich die folgenden Einstellungen. Diese Variable wird bei jedem Programmstart aus der Datei "I2C.ini", die sich im aktuellen Verzeichnis befinden soll, geladen. Existiert die Datei nicht, so werden die Standardeinstellungen verwendet. Bei Programmbeendigung wird die aktuelle Variable "Einstellungen" in dieser Datei gespeichert.
Beschreibung |
Auf General Call reagieren |
Eigene Adresse |
An Speichern der Daten erinnern |
Wartezeit nach Aufforderung |
Serielle Schnittstelle |
Ausgewählter Slave oder General Call |
Slavetyp |
Slaveadresse |
Kennung |
Modus |
Beschreibung |
XX |
|
PC ohne Verbindung |
LC |
|
Link Controller; Verbindungsversuch zu mC |
|
Alle |
Bus-Fehler |
F8 |
|
PC mit mC verbunden, kein Bus-Betrieb |
LB |
MT, MR |
Link Bus; Verbindungsversuch mit Bus |
|
MT, MR |
Start gesendet |
|
MT, MR |
Repeated-Start gesendet |
|
MT |
Adresse+W gesendet, ACK empfangen |
|
MT |
Adresse+W gesendet, NACK empfangen |
|
MT |
Daten gesendet, ACK empfangen; STANDARD |
MT |
MT |
Master transmitting; Master sendet derzeit |
|
MT |
Daten gesendet, NACK empfangen |
|
MT, MR |
Arbitration verloren beim Senden von Adresse oder Daten (Transmitter), beim NACK (Receiver) |
|
MR |
Adresse+R gesendet, ACK empfangen |
|
MR |
Adresse+R gesendet, NACK empfangen |
|
MR |
Daten empfangen, ACK gesendet; STANDARD |
MR |
MR |
Master empfängt derzeit |
RS |
MR |
Receiver stopped |
|
MR |
Daten empfangen, NACK gesendet |
|
SR |
Adresse+W empfangen, ACK gesendet |
|
SR |
Arbitration verloren als adressierter Master Adresse+W empfangen, ACK gesendet |
|
SR |
General-Call empfangen, ACK gesendet |
|
SR |
Arbitration verloren als adressierter Master General-Call empfangen, ACK gesendet |
|
SR |
Daten empfangen, ACK gesendet (adressiert); STANDARD |
SR |
SR |
Slave empfängt derzeit (adressiert) |
|
SR |
Daten empfangen, NACK gesendet (adressiert) |
|
SR |
Daten empfangen, ACK gesendet (General Call) |
GR |
SR |
Slave empfängt derzeit (General Call) |
|
SR |
Daten empfangen, NACK gesendet (General Call) |
A0 |
SR |
Stop oder Repeated-Start empfangen |
A8 |
ST |
Adresse+R empfangen, ACK gesendet |
B0 |
ST |
Arbitration verloren als adressierter Master Adresse+R empfangen, ACK gesendet |
B8 |
ST |
Daten gesendet, ACK empfangen; STANDARD |
ST |
ST |
Slave transmitting; Slave sendet derzeit |
C0 |
ST |
Daten gesendet, NACK empfangen |
C8 |
ST |
AA=0, letzte Daten gesendet, ACK empfangen |
Die schattierten Zeilen enthalten Zustände, die nur im PC auftreten. Alle anderen Zustände treten im PC und im mC auf.
Beschreibungen zu einzelnen Einstellungsdetails der Fenster sind dem Hilfesystem zu entnehmen.
Option Explicit
Private Sub Form_Load()
IniPfadInit 'Pfad zur Datei I2C.ini festlegen
EinstellungenInit True 'Einstellungen laden
TextPfad = ''
Status = 'XX'
MenuDateiSpeichern.Enabled = False
SetAnzeigen
On Error Resume Next
MSCommI2C.CommPort = Einstellungen.SerialPort
On Error GoTo 0
TimerI2C.Interval = Einstellungen.StartWarten
CommonDialogHelp.HelpFile = App.HelpFile
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim Antwort As Variant
Dim Gespeichert As Boolean
Antwort = -1
If Einstellungen.SaveMsg And (RichTextBoxDaten.Tag = 1) Then
Antwort = MsgBox('Möchten Sie die Anderungen des Textfeldes speichern?', vbQuestion + vbYesNoCancel + vbDefaultButton1)
Select Case Antwort
Case vbYes
If (TextPfad = '') Then
On Error GoTo Abbrechen
CommonDialogSave.ShowSave
On Error GoTo Fehler1
RichTextBoxDaten.SaveFile CommonDialogSave.filename, rtfText
On Error GoTo 0
GoTo Ende1
Fehler1:
MsgBox 'Die Datei konnte nicht gespeichert werden.', vbCritical
Abbrechen:
Resume Fehler1Weiter
Fehler1Weiter:
CommonDialogSave.filename = ''
Cancel = -1
Ende1:
Else
On Error GoTo Fehler2
RichTextBoxDaten.SaveFile TextPfad, rtfText
GoTo Ende2
Fehler2:
MsgBox 'Die Datei konnte nicht gespeichert werden.', vbCritical
Cancel = -1
Ende2:
End If
Case vbNo
Case vbCancel
Cancel = -1
End Select
End If
If (Cancel = 0) Then EinstellungenInit False
End Sub
Private Sub MenuDateiSenden_Click()
Dim AltStatus As String * 2
If (Status = '18') Or (Status = '28') Or (Status = 'A8') Or (Status = 'B8') Then
FormMain.Enabled = False
AltStatus = Status
Select Case Status
Case '18', '28': Status = 'MT'
Case 'A8', 'B8': Status = 'ST'
End Select
SetAnzeigen
If (RichTextBoxDaten.SelText <> '') Then
SendePuffer = RichTextBoxDaten.SelText
Else
SendePuffer = RichTextBoxDaten.Text
End If
If Len(SendePuffer) > 0 Then
PufferPos = 1
On Error GoTo PortFehler
MSCommI2C.Output = Mid(SendePuffer, PufferPos, 1)
On Error GoTo 0
TimerI2C.Enabled = True
Else
Status = AltStatus
SetAnzeigen
FormMain.Enabled = True
End If
End If
Exit Sub
PortFehler:
Resume FehlerWeiter
FehlerWeiter:
MsgBox 'Beim Zugriff auf die serielle Schnittstelle des PCs ist ein Fehler aufgetreten.'
On Error Resume Next
MSCommI2C.PortOpen = False
On Error GoTo 0
Status = 'XX'
SetAnzeigen
FormMain.Enabled = True
End Sub
Private Sub MenuDateiNeu_Click()
Dim Antwort As Variant
Dim Gespeichert As Boolean
Antwort = -1
If Einstellungen.SaveMsg And (RichTextBoxDaten.Tag = 1) Then
Antwort = MsgBox('Möchten Sie die Anderungen des Textfeldes speichern?', vbQuestion + vbYesNoCancel + vbDefaultButton1)
Select Case Antwort
Case vbYes
If (TextPfad = '') Then
On Error GoTo Abbrechen
CommonDialogSave.ShowSave
On Error GoTo Fehler1
RichTextBoxDaten.SaveFile CommonDialogSave.filename, rtfText
On Error GoTo 0
NeuEinrichten
GoTo Ende1
Fehler1:
MsgBox 'Die Datei konnte nicht gespeichert werden.', vbCritical
Abbrechen:
Resume Fehler1Weiter
Fehler1Weiter:
CommonDialogSave.filename = ''
Ende1:
Else
On Error GoTo Fehler2
RichTextBoxDaten.SaveFile TextPfad, rtfText
NeuEinrichten
GoTo Ende2
Fehler2:
MsgBox 'Die Datei konnte nicht gespeichert werden.', vbCritical
Ende2:
End If
Case vbNo
NeuEinrichten
Case vbCancel
End Select
Else
NeuEinrichten
End If
End Sub
Private Sub NeuEinrichten()
RichTextBoxDaten.TextRTF = ''
MenuDateiSpeichern.Enabled = False
TextPfad = ''
RichTextBoxDaten.Tag = 0
End Sub
Private Sub MenuDateiOffnen_Click()
On Error GoTo Abbrechen
CommonDialogOpen.ShowOpen
On Error GoTo Fehler
RichTextBoxDaten.LoadFile CommonDialogOpen.filename, rtfText
On Error GoTo 0
TextPfad = CommonDialogOpen.filename
MenuDateiSpeichern.Enabled = True
RichTextBoxDaten.Tag = 0
Exit Sub
Fehler:
MsgBox 'Die Datei konnte nicht geöffnet werden.', vbCritical
Abbrechen:
CommonDialogOpen.filename = ''
End Sub
Private Sub MenuDateiSpeichern_Click()
On Error GoTo Fehler
RichTextBoxDaten.SaveFile TextPfad, rtfText
On Error GoTo 0
RichTextBoxDaten.Tag = 0
GoTo Ende
Fehler:
MsgBox 'Die Datei konnte nicht geöffnet werden.', vbCritical
CommonDialogOpen.filename = ''
Ende:
End Sub
Private Sub MenuDateiSpeichernunter_Click()
On Error GoTo Abbrechen
CommonDialogSave.ShowSave
On Error GoTo Fehler
RichTextBoxDaten.SaveFile CommonDialogSave.filename, rtfText
On Error GoTo 0
TextPfad = CommonDialogSave.filename
MenuDateiSpeichern.Enabled = True
RichTextBoxDaten.Tag = 0
GoTo Ende
Fehler:
MsgBox 'Die Datei konnte nicht gespeichert werden.', vbCritical
Abbrechen:
CommonDialogSave.filename = ''
Ende:
End Sub
Private Sub MenuDateiBeenden_Click()
Unload FormMain
End Sub
Private Sub MenuVerbindungUperstellen_Click()
On Error GoTo NoPort
MSCommI2C.PortOpen = True
On Error GoTo 0
FormMain.Enabled = False
Status = 'LC'
SetAnzeigen
On Error GoTo PortFehler
MSCommI2C.Output = Chr$(Anmelden) 'Status anfordern
On Error GoTo 0
TimerI2C.Enabled = True
Exit Sub
NoPort:
MsgBox 'Die gewählte serielle Schnittstelle ist nicht ansprechbar.', vbCritical
Exit Sub
PortFehler:
Resume FehlerWeiter
FehlerWeiter:
MsgBox 'Beim Zugriff auf die serielle Schnittstelle des PCs ist ein Fehler aufgetreten.'
On Error Resume Next
MSCommI2C.PortOpen = False
On Error GoTo 0
Status = 'XX'
SetAnzeigen
FormMain.Enabled = True
End Sub
Private Sub MenuVerbindungUptrennen_Click()
Dim Trenne As Variant
Trenne = vbNo
If (Status <> 'F8') Then
Trenne = MsgBox('Es besteht noch eine Busverbindung. Wird nun die Verbindung zum Microcontroller getrennt, kann der Microcontroller nicht vom Bus getrennt werden. Möchten Sie nun dennoch die Verbindung zum Microcontroller trennen?', (vbYesNo + vbExclamation + vbDefaultButton2))
Else
Trenne = vbYes
End If
If (Trenne = vbYes) Then
On Error Resume Next
If (Status <> 'F8') Then MSCommI2C.Output = Chr$(Abmelden)
MSCommI2C.PortOpen = False
On Error GoTo 0
Status = 'XX'
SetAnzeigen
End If
End Sub
Private Sub MenuVerbindungi2cErstellen_Click()
FormMain.Enabled = False
Status = 'LB'
SetAnzeigen
On Error GoTo PortFehler
MSCommI2C.Output = Chr$(SendSTA)
On Error GoTo 0
TimerI2C.Enabled = True
Exit Sub
PortFehler:
Resume FehlerWeiter
FehlerWeiter:
MsgBox 'Beim Zugriff auf die serielle Schnittstelle des PCs ist ein Fehler aufgetreten.'
On Error Resume Next
MSCommI2C.PortOpen = False
On Error GoTo 0
Status = 'XX'
SetAnzeigen
FormMain.Enabled = True
End Sub
Private Sub MenuVerbindungi2cErstellenxxx_Click()
Dim Verbinde As Boolean
FormVerbinden.Show 1
Verbinde = (Einstellungen.SofortConnect) And (FormVerbinden.Tag = 1)
Unload FormVerbinden
If Verbinde Then MenuVerbindungi2cErstellen_Click
End Sub
Private Sub MenuVerbindungI2ctrennen_Click()
If (Status = '18') Or (Status = '28') Or (Status = '40') Or (Status = '50') Then
Select Case Status
Case '18', '28'
Status = 'F8'
SetAnzeigen
On Error GoTo PortFehler
MSCommI2C.Output = Chr$(SendSTO)
On Error GoTo 0
Case '40', '50'
Status = 'RS'
SetAnzeigen
On Error GoTo PortFehler
MSCommI2C.Output = Chr$(ClrAA)
On Error GoTo 0
End Select
End If
Exit Sub
PortFehler:
Resume FehlerWeiter
FehlerWeiter:
MsgBox 'Beim Zugriff auf die serielle Schnittstelle des PCs ist ein Fehler aufgetreten.'
On Error Resume Next
MSCommI2C.PortOpen = False
On Error GoTo 0
Status = 'XX'
SetAnzeigen
FormMain.Enabled = True
End Sub
Private Sub MenuEinstellungenKonfig_Click()
FormKonfig.Show 1
If FormKonfig.Tag = 1 Then
On Error GoTo PortFehler
If (Status = 'XX') Then MSCommI2C.CommPort = Einstellungen.SerialPort
On Error GoTo 0
TimerI2C.Interval = Einstellungen.StartWarten
End If
Unload FormKonfig
Exit Sub
PortFehler:
Resume FehlerWeiter
FehlerWeiter:
MsgBox 'Beim Zugriff auf die serielle Schnittstelle des PCs ist ein Fehler aufgetreten.'
On Error Resume Next
MSCommI2C.PortOpen = False
On Error GoTo 0
Status = 'XX'
SetAnzeigen
FormMain.Enabled = True
End Sub
Private Sub MenuHilfeHilfethemen_Click()
'WinHelp Me.hwnd, App.HelpFile, &HB, 0
CommonDialogHelp.ShowHelp
End Sub
Private Sub MenuHilfeInfo_Click()
FormInfo.Show 1
End Sub
Private Sub MSCommI2C_OnComm()
Dim PortInput As String
TimerI2C.Enabled = False
Select Case MSCommI2C.CommEvent
Case comEvReceive
On Error GoTo PortFehler
PortInput = AscB(MSCommI2C.Input)
On Error GoTo 0
Select Case Status
Case 'XX'
Case 'LC'
If (PortInput = 248) Then 'F8
Status = 'F8'
SetAnzeigen
On Error GoTo PortFehler
MSCommI2C.Output = Chr$(AdresseToZahl(Einstellungen.OwnAddress, Einstellungen.GetGC))
On Error GoTo 0
FormMain.Enabled = True
Else
On Error Resume Next
MSCommI2C.PortOpen = False
On Error GoTo 0
MsgBox 'Der Microcontroller steht in einem vom Anfangsstatus ''F8'' abweichenden Status. Er muß auf diesen Anfangsstatus gestellt werden, bevor er angesprochen werden kann.', vbExclamation
Status = 'XX'
SetAnzeigen
FormMain.Enabled = True
End If
Case '00' 'Bus-Fehler
Case 'F8'
Select Case PortInput
Case 96 '60h SR
Status = '60'
SetAnzeigen
Case 168 'A8h ST
Status = 'A8'
SetAnzeigen
End Select
Case 'LB'
On Error GoTo PortFehler
If (PortInput = 8) Or (PortInput = 10) Then '8h
Select Case Einstellungen.SelectSlave
Case True
On Error GoTo PortFehler
MSCommI2C.Output = Chr$(AdresseToZahl(Einstellungen.SlaveAddress, Einstellungen.SlaveTyp))
On Error GoTo 0
Case False
On Error GoTo PortFehler
MSCommI2C.Output = Chr$(AdresseToZahl(GCAddress, False))
On Error GoTo 0
End Select
Select Case PortInput
Case 8: Status = '08'
Case 10: Status = '10'
End Select
SetAnzeigen
TimerI2C.Enabled = True
Else
MsgBox 'Die Startaufforderung an den Bus ist fehlgeschlagen. Es wurde eine ungültige Antwort vom Microcontroller empfangen.', vbCritical
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
End If
Case '08' 'MT, MR Start gesendet
Select Case PortInput
Case 24 '18h MT ACK
Status = '18'
SetAnzeigen
FormMain.Enabled = True
Case 32 '20h MT NACK
Status = '20'
SetAnzeigen
MsgBox 'Der adressierte Slave antwortet nicht.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case 64 '40h MR ACK
Status = '40'
SetAnzeigen
FormMain.Enabled = True
Case 72 '48h MR NACK
Status = '48'
SetAnzeigen
MsgBox 'Der adressierte Slave antwortet nicht.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case Else
MsgBox 'Der adressierte Slave antwortet nicht. Es wurde ein ungültiger Wert empfangen.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
End Select
Case '10' 'MT, MR Repeated-Start gesendet
Select Case PortInput
Case 24 '18h ACK
Status = '18'
SetAnzeigen
FormMain.Enabled = True
Case 32 '20h NACK
Status = '20'
SetAnzeigen
MsgBox 'Der adressierte Slave antwortet nicht.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case 64 '40h MR ACK
Status = '40'
SetAnzeigen
FormMain.Enabled = True
Case 72 '48h MR NACK
Status = '48'
SetAnzeigen
MsgBox 'Der adressierte Slave antwortet nicht.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case Else
MsgBox 'Der adressierte Slave antwortet nicht. Es wurde ein ungültiger Wert empfangen.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
End Select
Case '18' 'no 'MT Adresse+W gesendet, ACK empfangen
Case '20' 'MT Adresse+W gesendet, NACK empfangen
Case '28' 'no 'MT Daten gesendet, ACK empfangen STANDARD
Case 'MT'
Select Case PortInput
Case 40 '28 ACK
If Len(SendePuffer) > PufferPos Then
PufferPos = PufferPos + 1
On Error GoTo PortFehler
MSCommI2C.Output = Mid(SendePuffer, PufferPos, 1)
On Error GoTo 0
TimerI2C.Enabled = True
Else
Status = '28'
SetAnzeigen
FormMain.Enabled = True
End If
Case 48 '30 NACK
Status = '30'
SetAnzeigen
MsgBox 'Der Slave antwortet nicht. Es wurde NACK empfangen.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case Else
MsgBox 'Es wurde eine ungültige Antwort empfangen.', vbExclamation
On Error GoTo PortFehler
MSCommI2C.Output = Chr$(SendSTO)
On Error GoTo 0
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
End Select
Case '30' 'MT Daten gesendet, NACK empfangen
Case '38' 'MT, MR Arbitration verloren beim Senden von Adresse oder Daten (Transmitter)
Case '40' 'MR Adresse+R gesendet, ACK empfangen'
Select Case PortInput
Case 80 '50h
FormMain.Enabled = False
Status = 'MR'
SetAnzeigen
TimerI2C.Enabled = True
Case Else
MsgBox 'Die Verbindung wurde aufgrund eines Fehlers beendet. Es wurde ein ungültiger Wert empfangen.', vbExclamation
Status = 'F8'
SetAnzeigen
End Select
Case '48' 'MR Adresse+R gesendet, NACK empfangen
Case '50' 'MR Daten empfangen, ACK gesendet STANDARD
Select Case PortInput
Case 80 '50h
FormMain.Enabled = False
Status = 'MR'
SetAnzeigen
TimerI2C.Enabled = True
Case Else
MsgBox 'Die Verbindung wurde aufgrund eines Fehlers beendet. Es wurde ein ungültiger Wert empfangen.', vbExclamation
Status = 'F8'
SetAnzeigen
End Select
Case 'MR' 'MR
RichTextBoxDaten.Text = RichTextBoxDaten.Text + Chr$(PortInput)
Status = '50'
SetAnzeigen
FormMain.Enabled = True
Case 'RS'
Select Case PortInput
Case 88 '58h
Status = 'F8'
SetAnzeigen
Case Else
MsgBox 'Die Verbindung wurde aufgrund eines Fehlers beendet. Es wurde ein ungültiger Wert empfangen.', vbExclamation
Status = 'F8'
SetAnzeigen
End Select
Case '58' 'MR Daten empfangen, NACK gesendet
Case '60' 'SR Adresse+W empfangen, ACK gesendet
Select Case PortInput
Case 128 '80h
FormMain.Enabled = False
Status = 'SR'
SetAnzeigen
TimerI2C.Enabled = True
Case 160 'A0
Status = 'A0'
SetAnzeigen
MsgBox 'Die Bus-Verbindung wurde vom Master beendet.', vbInformation
Status = 'F8'
SetAnzeigen
Case Else
MsgBox 'Die Verbindung wurde aufgrund eines Fehlers beendet. Es wurde ein ungültiger Wert empfangen.', vbExclamation
Status = 'F8'
SetAnzeigen
End Select
Case '68' 'SR Arbitration verloren als adressierter Master,'
Case '70' 'SR General-Call empfangen, ACK gesendet'
Select Case PortInput
Case 144 '90h
FormMain.Enabled = False
Status = 'GR'
SetAnzeigen
TimerI2C.Enabled = True
Case 160 'A0
Status = 'A0'
SetAnzeigen
MsgBox 'Die Bus-Verbindung wurde vom Master beendet.', vbInformation
Status = 'F8'
SetAnzeigen
Case Else
MsgBox 'Die Verbindung wurde aufgrund eines Fehlers beendet. Es wurde ein ungültiger Wert empfangen.', vbExclamation
Status = 'F8'
SetAnzeigen
End Select
Case '78' 'SR Arbitration verloren als adressierter Master,'
Case '80' 'SR Daten empfangen, ACK gesendet (adressiert) STANDARD'
Select Case PortInput
Case 128 '80h
FormMain.Enabled = False
Status = 'SR'
SetAnzeigen
TimerI2C.Enabled = True
Case 160 'A0
Status = 'A0'
SetAnzeigen
MsgBox 'Die Bus-Verbindung wurde vom Master beendet.', vbInformation
Status = 'F8'
SetAnzeigen
Case Else
MsgBox 'Die Verbindung wurde aufgrund eines Fehlers beendet. Es wurde ein ungültiger Wert empfangen.', vbExclamation
Status = 'F8'
SetAnzeigen
End Select
Case 'SR':
RichTextBoxDaten.Text = RichTextBoxDaten.Text + Chr$(PortInput)
Status = '80'
SetAnzeigen
FormMain.Enabled = True
Case '88' 'SR Daten empfangen, NACK gesendet (adressiert)'
Case '90' 'SR Daten empfangen, ACK gesendet (General Call)'
Select Case PortInput
Case 144 '90h
FormMain.Enabled = False
Status = 'GR'
SetAnzeigen
TimerI2C.Enabled = True
Case 160 'A0
Status = 'A0'
SetAnzeigen
MsgBox 'Die Bus-Verbindung wurde vom Master beendet.', vbInformation
Status = 'F8'
SetAnzeigen
Case Else
MsgBox 'Die Verbindung wurde aufgrund eines Fehlers beendet. Es wurde ein ungültiger Wert empfangen.', vbExclamation
Status = 'F8'
SetAnzeigen
End Select
Case 'GR'
RichTextBoxDaten.Text = RichTextBoxDaten.Text + Chr$(PortInput)
Status = '90'
SetAnzeigen
FormMain.Enabled = True
Case '98' 'SR Daten empfangen, NACK gesendet (General Call)'
Case 'A0' 'no SR Stop oder Repeated-Start empfangen'
Case 'A8' 'ST Adresse+R empfangen, ACK gesendet'
Case 'B0' 'ST Arbitration verloren als adressierter Master,'
Case 'B8' 'ST Daten gesendet, ACK empfangen STANDARD'
Case 'ST'
Select Case PortInput
Case 184 'B8 ACK
If Len(SendePuffer) > PufferPos Then
PufferPos = PufferPos + 1
On Error GoTo PortFehler
MSCommI2C.Output = Mid(SendePuffer, PufferPos, 1)
On Error GoTo 0
TimerI2C.Enabled = True
Else
Status = 'B8'
SetAnzeigen
FormMain.Enabled = True
End If
Case 192 'C0 NACK
Status = 'C0'
SetAnzeigen
MsgBox 'Es wurde NACK empfangen. Die Verbindung ist beendet.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case Else
MsgBox 'Es wurde eine ungültige Antwort empfangen.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
End Select
Case 'C0' 'ST Daten gesendet, NACK empfangen'
Case 'C8' 'ST AA=0, letzte Daten gesendet, ACK empfangen'
End Select
End Select
Exit Sub
PortFehler:
Resume FehlerWeiter
FehlerWeiter:
MsgBox 'Beim Zugriff auf die serielle Schnittstelle des PCs ist ein Fehler aufgetreten.'
On Error Resume Next
MSCommI2C.PortOpen = False
On Error GoTo 0
Status = 'XX'
SetAnzeigen
FormMain.Enabled = True
End Sub
Private Sub TimerI2C_Timer()
TimerI2C.Enabled = False
Select Case Status
Case 'XX' 'no
Case 'LC'
On Error Resume Next
MSCommI2C.PortOpen = False
On Error GoTo 0
MsgBox 'Der Microcontroller antwortet nicht.', vbCritical
Status = 'XX'
SetAnzeigen
FormMain.Enabled = True
Case '00' 'Bus-Fehler
Case 'F8'
Case 'LB'
MsgBox 'Die Startaufforderung an den Bus ist fehlgeschlagen. Es konnte keine Antwort empfangen werden.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case '08' 'MT, MR Start gesendet
MsgBox 'Der adressierte Slave antwortet nicht.', vbExclamation
On Error GoTo PortFehler
MSCommI2C.Output = Chr$(SendSTO)
On Error GoTo 0
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case '10' 'MT, MR Repeated-Start gesendet
MsgBox 'Der adressierte Slave antwortet nicht.', vbExclamation
On Error GoTo PortFehler
MSCommI2C.Output = Chr$(SendSTO)
On Error GoTo 0
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case '18' 'MT Adresse+W gesendet, ACK empfangen
Case '20' 'MT Adresse+W gesendet, NACK empfangen
Case '28' 'MT Daten gesendet, ACK empfangen STANDARD
Case 'MT'
MsgBox 'Der Slave antwortet nicht. Es konnte keine Antwort empfangen werden.', vbExclamation
On Error GoTo PortFehler
MSCommI2C.Output = Chr$(SendSTO)
On Error GoTo 0
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case '30' 'MT Daten gesendet, NACK empfangen
Case '38' 'MT, MR Arbitration verloren beim Senden von Adresse oder Daten (Transmitter)
Case '40' 'MR Adresse+R gesendet, ACK empfangen'
Case '48' 'MR Adresse+R gesendet, NACK empfangen
Case '50' 'MR Daten empfangen, ACK gesendet STANDARD
Case 'MR' 'MR
MsgBox 'Die Verbindung wurde aufgrund eines Fehlers beendet. Es konnten keine Daten empfangen werden.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case 'RS'
Case '58' 'MR Daten empfangen, NACK gesendet
Case '60' 'no SR Adresse+W empfangen, ACK gesendet
Case '68' 'SR Arbitration verloren als adressierter Master,'
Case '70' 'no SR General-Call empfangen, ACK gesendet'
Case '78' 'SR Arbitration verloren als adressierter Master,'
Case '80' 'no SR Daten empfangen, ACK gesendet (adressiert) STANDARD'
Case 'SR':
MsgBox 'Die Verbindung wurde aufgrund eines Fehlers beendet. Es konnten keine Daten empfangen werden.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case '88' 'SR Daten empfangen, NACK gesendet (adressiert)'
Case '90' 'no SR Daten empfangen, ACK gesendet (General Call)'
Case 'GR'
MsgBox 'Die Verbindung wurde aufgrund eines Fehlers beendet. Es konnten keine Daten empfangen werden.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case '98' 'SR Daten empfangen, NACK gesendet (General Call)'
Case 'A0' 'no SR Stop oder Repeated-Start empfangen'
Case 'A8' 'ST Adresse+R empfangen, ACK gesendet'
Case 'B0' 'ST Arbitration verloren als adressierter Master,'
Case 'B8' 'ST Daten gesendet, ACK empfangen STANDARD'
Case 'ST'
MsgBox 'Der Master antwortet nicht. Es konnte keine Antwort empfangen werden.', vbExclamation
Status = 'F8'
SetAnzeigen
FormMain.Enabled = True
Case 'C0' 'ST Daten gesendet, NACK empfangen'
Case 'C8' 'ST AA=0, letzte Daten gesendet, ACK empfangen'
End Select
Exit Sub
PortFehler:
Resume FehlerWeiter
FehlerWeiter:
MsgBox 'Beim Zugriff auf die serielle Schnittstelle des PCs ist ein Fehler aufgetreten.'
On Error Resume Next
MSCommI2C.PortOpen = False
On Error GoTo 0
Status = 'XX'
SetAnzeigen
FormMain.Enabled = True
End Sub
Public Sub SetAnzeigen() 'Menueleiste und Statusleiste aktualisieren
SetMenu
SetStatusBar
End Sub
Public Sub SetMenu() 'Menueleiste aktualisieren
Select Case Status
Case 'XX': SetMenuEinrichten False, False, False, False, True, False
Case 'LC': SetMenuEinrichten False, False, False, False, False, False
Case '00' 'Bus-Fehler
Case 'F8': SetMenuEinrichten False, True, True, False, False, True
Case 'LB': SetMenuEinrichten False, False, False, False, False, False
Case '08': SetMenuEinrichten False, False, False, False, False, False 'MT, MR Start gesendet
Case '10': SetMenuEinrichten False, False, False, False, False, False 'MT, MR Repeated-Start gesendet
Case '18': SetMenuEinrichten True, True, True, True, False, True 'MT Adresse+W gesendet, ACK empfangen
Case '20': SetMenuEinrichten False, False, False, False, False, False 'MT Adresse+W gesendet, NACK empfangen
Case '28': SetMenuEinrichten True, True, True, True, False, True 'MT Daten gesendet, ACK empfangen STANDARD
Case 'MT': SetMenuEinrichten False, False, False, False, False, False
Case '30': SetMenuEinrichten False, False, False, False, False, False 'MT Daten gesendet, NACK empfangen
Case '38' 'MT, MR Arbitration verloren beim Senden von Adresse oder Daten (Transmitter)
Case '40': SetMenuEinrichten False, False, False, True, False, True 'MR Adresse+R gesendet, ACK empfangen'
Case '48': SetMenuEinrichten False, False, False, False, False, False 'MR Adresse+R gesendet, NACK empfangen
Case '50': SetMenuEinrichten False, False, False, True, False, True 'MR Daten empfangen, ACK gesendet STANDARD
Case 'MR': SetMenuEinrichten False, False, False, False, False, True 'MR
Case 'RS': SetMenuEinrichten False, False, False, False, False, False
Case '58': SetMenuEinrichten False, False, False, False, False, False 'MR Daten empfangen, NACK gesendet
Case '60': SetMenuEinrichten False, False, False, False, False, True 'SR Adresse+W empfangen, ACK gesendet
Case '68' 'SR Arbitration verloren als adressierter Master,'
Case '70': SetMenuEinrichten False, False, False, False, False, True 'SR General-Call empfangen, ACK gesendet'
Case '78' 'SR Arbitration verloren als adressierter Master,'
Case '80': SetMenuEinrichten False, False, False, False, False, True 'SR Daten empfangen, ACK gesendet (adressiert) STANDARD'
Case 'SR': SetMenuEinrichten False, False, False, False, False, True
Case '88': SetMenuEinrichten False, False, False, False, False, False 'SR Daten empfangen, NACK gesendet (adressiert)'
Case '90': SetMenuEinrichten False, False, False, False, False, True 'SR Daten empfangen, ACK gesendet (General Call)'
Case 'GR': SetMenuEinrichten False, False, False, False, False, True
Case '98': SetMenuEinrichten False, False, False, False, False, False 'SR Daten empfangen, NACK gesendet (General Call)'
Case 'A0': SetMenuEinrichten False, False, False, False, False, False 'SR Stop oder Repeated-Start empfangen'
Case 'A8': SetMenuEinrichten True, False, False, False, False, True 'ST Adresse+R empfangen, ACK gesendet'
Case 'B0' 'ST Arbitration verloren als adressierter Master,'
Case 'B8': SetMenuEinrichten True, False, False, False, False, True 'ST Daten gesendet, ACK empfangen STANDARD'
Case 'ST': SetMenuEinrichten False, False, False, False, False, False
Case 'C0': SetMenuEinrichten False, False, False, False, False, False 'ST Daten gesendet, NACK empfangen'
Case 'C8': SetMenuEinrichten False, False, False, False, False, False 'ST AA=0, letzte Daten gesendet, ACK empfangen'
End Select
End Sub
Public Sub SetMenuEinrichten(Senden, I2cerstellen, I2cerstellenxxx, I2ctrennen, Uperstellen, Uptrennen As Boolean)
MenuDateiSenden.Enabled = Senden
MenuVerbindungI2cerstellen.Enabled = I2cerstellen
MenuVerbindungI2cerstellenxxx.Enabled = I2cerstellenxxx
MenuVerbindungI2ctrennen.Enabled = I2ctrennen
MenuVerbindungUperstellen.Enabled = Uperstellen
MenuVerbindungUptrennen.Enabled = Uptrennen
End Sub
Public Sub SetStatusBar() 'Statusleiste aktualisieren
Select Case Status
Case 'XX'
StatusBarMain.Panels(1).Text = 'XX'
StatusBarMain.Panels(2).Text = 'Keine Verbindung'
StatusBarMain.Panels(3).Text = ''
Case 'LC'
StatusBarMain.Panels(1).Text = 'LC'
StatusBarMain.Panels(2).Text = 'Microcontroller wird gesucht'
StatusBarMain.Panels(3).Text = ''
Case '00' 'Bus-Fehler
Case 'F8'
StatusBarMain.Panels(1).Text = 'F8'
StatusBarMain.Panels(2).Text = 'Microcontroller verbunden'
StatusBarMain.Panels(3).Text = ''
Case 'LB'
StatusBarMain.Panels(1).Text = 'LB'
StatusBarMain.Panels(2).Text = 'Startaufforderung wird gesendet'
Select Case Einstellungen.SlaveTyp
Case True: StatusBarMain.Panels(3).Text = 'Master Receiver'
Case False: StatusBarMain.Panels(3).Text = 'Master Transmitter'
End Select
Case '08' 'MT, MR Start gesendet
StatusBarMain.Panels(1).Text = '08'
StatusBarMain.Panels(2).Text = 'Addresse wird gesendet'
Select Case Einstellungen.SlaveTyp
Case True: StatusBarMain.Panels(3).Text = 'Master Receiver'
Case False: StatusBarMain.Panels(3).Text = 'Master Transmitter'
End Select
Case '10' 'MT, MR Repeated-Start gesendet
StatusBarMain.Panels(1).Text = '10'
StatusBarMain.Panels(2).Text = 'Addresse wird gesendet'
Select Case Einstellungen.SlaveTyp
Case True: StatusBarMain.Panels(3).Text = 'Master Receiver'
Case False: StatusBarMain.Panels(3).Text = 'Master Transmitter'
End Select
Case '18' 'MT Adresse+W gesendet, ACK empfangen
StatusBarMain.Panels(1).Text = '18'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Master Transmitter'
Case '20' 'MT Adresse+W gesendet, NACK empfangen
StatusBarMain.Panels(1).Text = '20'
StatusBarMain.Panels(2).Text = 'Verbindung fehlgeschlagen'
StatusBarMain.Panels(3).Text = 'Master Transmitter'
Case '28' 'MT Daten gesendet, ACK empfangen STANDARD
StatusBarMain.Panels(1).Text = '28'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Master Transmitter'
Case 'MT'
StatusBarMain.Panels(1).Text = 'MT'
StatusBarMain.Panels(2).Text = 'Daten werden gesendet'
StatusBarMain.Panels(3).Text = 'Master Transmitter'
Case '30' 'MT Daten gesendet, NACK empfangen
StatusBarMain.Panels(1).Text = '30'
StatusBarMain.Panels(2).Text = 'Busverbindung beendet'
StatusBarMain.Panels(3).Text = 'Master Transmitter'
Case '38' 'MT, MR Arbitration verloren beim Senden von Adresse oder Daten (Transmitter)
Case '40' 'MR Adresse+R gesendet, ACK empfangen'
StatusBarMain.Panels(1).Text = '40'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Master Receiver'
Case '48' 'MR Adresse+R gesendet, NACK empfangen
StatusBarMain.Panels(1).Text = '48'
StatusBarMain.Panels(2).Text = 'Verbindung fehlgeschlagen'
StatusBarMain.Panels(3).Text = 'Master Receiver'
Case '50' 'MR Daten empfangen, ACK gesendet STANDARD
StatusBarMain.Panels(1).Text = '50'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Master Receiver'
Case 'MR' 'MR
StatusBarMain.Panels(1).Text = 'MR'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Master Receiver'
Case 'RS'
StatusBarMain.Panels(1).Text = 'RS'
StatusBarMain.Panels(2).Text = 'Busverbindung wird beendet'
StatusBarMain.Panels(3).Text = 'Master Receiver'
Case '58' 'MR Daten empfangen, NACK gesendet
StatusBarMain.Panels(1).Text = '58'
StatusBarMain.Panels(2).Text = 'Busverbindung wird beendet'
StatusBarMain.Panels(3).Text = 'Master Receiver'
Case '60' 'SR Adresse+W empfangen, ACK gesendet
StatusBarMain.Panels(1).Text = '60'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Slave Receiver'
Case '68' 'SR Arbitration verloren als adressierter Master,'
Case '70' 'SR General-Call empfangen, ACK gesendet'
StatusBarMain.Panels(1).Text = '70'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Slave Receiver'
Case '78' 'SR Arbitration verloren als adressierter Master,'
Case '80' 'SR Daten empfangen, ACK gesendet (adressiert) STANDARD'
StatusBarMain.Panels(1).Text = '80'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Slave Receiver'
Case 'SR'
StatusBarMain.Panels(1).Text = 'SR'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Slave Receiver'
Case '88' 'SR Daten empfangen, NACK gesendet (adressiert)'
StatusBarMain.Panels(1).Text = '88'
StatusBarMain.Panels(2).Text = 'Busverbindung wird beendet'
StatusBarMain.Panels(3).Text = 'Slave Receiver'
Case '90' 'SR Daten empfangen, ACK gesendet (General Call)'
StatusBarMain.Panels(1).Text = '90'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Slave Receiver'
Case 'GR'
StatusBarMain.Panels(1).Text = 'GR'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Slave Receiver'
Case '98' 'SR Daten empfangen, NACK gesendet (General Call)'
StatusBarMain.Panels(1).Text = '98'
StatusBarMain.Panels(2).Text = 'Busverbindung wird beendet'
StatusBarMain.Panels(3).Text = 'Slave Receiver'
Case 'A0' 'SR Stop oder Repeated-Start empfangen'
StatusBarMain.Panels(1).Text = 'A0'
StatusBarMain.Panels(2).Text = 'Busverbindung beendet'
StatusBarMain.Panels(3).Text = 'Slave Receiver'
Case 'A8' 'ST Adresse+R empfangen, ACK gesendet'
StatusBarMain.Panels(1).Text = 'A8'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Slave Transmitter'
Case 'B0' 'ST Arbitration verloren als adressierter Master,'
Case 'B8' 'ST Daten gesendet, ACK empfangen STANDARD'
StatusBarMain.Panels(1).Text = 'B8'
StatusBarMain.Panels(2).Text = 'Busverbindung besteht'
StatusBarMain.Panels(3).Text = 'Slave Transmitter'
Case 'ST'
StatusBarMain.Panels(1).Text = 'ST'
StatusBarMain.Panels(2).Text = 'Daten werden gesendet'
StatusBarMain.Panels(3).Text = 'Slave Transmitter'
Case 'C0' 'ST Daten gesendet, NACK empfangen'
StatusBarMain.Panels(1).Text = 'C0'
StatusBarMain.Panels(2).Text = 'Busverbindung beendet'
StatusBarMain.Panels(3).Text = 'Slave Transmitter'
Case 'C8' 'ST AA=0, letzte Daten gesendet, ACK empfangen'
End Select
End Sub
Private Sub Melde(StatusText As String, MessageText As String, MsgSymbol As Variant)
MsgBox MessageText & Chr(13) & Chr(10) & 'Status: ' & StatusText, MsgSymbol
End Sub
Private Sub RichTextBoxDaten_Change() 'Aenderung der Textfeldes fuer Erinnerung an Speichern feststellen
RichTextBoxDaten.Tag = 1
End Sub
Private Sub Form_Resize() 'Anpassen des Textfeldes auf die Fenstergroesse
RichTextBoxDaten.Width = Abs(FormMain.ScaleWidth + 2)
RichTextBoxDaten.Height = Abs(FormMain.ScaleHeight - 20)
End Sub
Option Explicit
Private Sub Form_Load()
Select Case Status
Case 'XX': Anzeigen True, True, True, True, True
Case Else: Anzeigen False, False, True, False, True
End Select
FormKonfig.Tag = 0
CheckGeneralCall.Value = BooleanToCheckbox(Einstellungen.GetGC)
TextAddress.Text = Einstellungen.OwnAddress
CheckSaveDaten.Value = BooleanToCheckbox(Einstellungen.SaveMsg)
ComboPort.ListIndex = Einstellungen.SerialPort - 1
TextStaWarte.Text = Einstellungen.StartWarten
End Sub
Private Sub CommandOK_Click()
Einstellungen.GetGC = CheckboxToBoolean(CheckGeneralCall.Value)
Einstellungen.OwnAddress = TextAddress.Text
Einstellungen.SaveMsg = CheckboxToBoolean(CheckSaveDaten.Value)
Einstellungen.SerialPort = ComboPort.ListIndex + 1
Einstellungen.StartWarten = TextStaWarte.Text
FormKonfig.Tag = 1
FormKonfig.Hide
End Sub
Private Sub CommandCancel_Click()
Unload FormKonfig
End Sub
Private Sub Anzeigen(ShGetGC, ShOwnAddress, ShSaveMsg, ShSerialPort, ShStartWarten As Boolean)
CheckGeneralCall.Enabled = ShGetGC
TextAddress.Enabled = ShOwnAddress
CheckSaveDaten.Enabled = ShSaveMsg
ComboPort.Enabled = ShSerialPort
TextStaWarte.Enabled = ShStartWarten
UpDownStaWarte.Enabled = ShStartWarten
End Sub
Private Sub TextAddress_LostFocus()
If Not CheckTextAddress(TextAddress.Text) Then TextAddress.SetFocus
End Sub
Option Explicit
Private Sub Form_Load()
FormVerbinden.Tag = 0
OptionEiner.Value = Einstellungen.SelectSlave
OptionGeneral.Value = Not Einstellungen.SelectSlave
OptionReceiver.Value = Not Einstellungen.SlaveTyp
OptionTransmitter.Value = Einstellungen.SlaveTyp
TextSlaveAddress.Text = Einstellungen.SlaveAddress
CheckVerbinden.Value = BooleanToCheckbox(Einstellungen.SofortConnect)
End Sub
Private Sub CommandOK_Click()
Einstellungen.SelectSlave = OptionEiner.Value
Einstellungen.SlaveTyp = OptionTransmitter.Value
Einstellungen.SlaveAddress = TextSlaveAddress.Text
Einstellungen.SofortConnect = CheckboxToBoolean(CheckVerbinden.Value)
FormVerbinden.Tag = 1
FormVerbinden.Hide
End Sub
Private Sub CommandCancel_Click()
Unload FormVerbinden
End Sub
Private Sub OptionEiner_Click()
Frame1.Enabled = OptionEiner.Value
OptionReceiver.Enabled = OptionEiner.Value
OptionTransmitter.Enabled = OptionEiner.Value
Label1.Enabled = OptionEiner.Value
TextSlaveAddress.Enabled = OptionEiner.Value
End Sub
Private Sub OptionGeneral_Click()
Frame1.Enabled = OptionEiner.Value
OptionReceiver.Enabled = OptionEiner.Value
OptionTransmitter.Enabled = OptionEiner.Value
Label1.Enabled = OptionEiner.Value
TextSlaveAddress.Enabled = OptionEiner.Value
End Sub
Private Sub TextSlaveAddress_LostFocus()
If Not CheckTextAddress(TextSlaveAddress.Text) Then TextSlaveAddress.SetFocus
End Sub
Option Explicit
Private Sub Command1_Click()
Unload FormInfo
End Sub
; I2C-Bus
; Entwickelt für µC-Kit von Kern
; Anzusteuern mit PC
; Michael Popp; April 1998
Vereinbarungen
;charin code 2730h ;Unterprogramm Zeicheneingabe
;charout code 273Ch ;Unterprogramm Zeichenausgabe
byteout code 2745h ;Byteausgabe
anfang code 8000h ;Start-Adresse
inter code 802Bh ;Adresse für I2C-Interrupt
haupt code 8200h ;Adresse Hauptprogramm
s1adr data 0dbh ;Eigene Bus-Adresse
s1dat data 0dah ;Bus-Daten
s1con data 0d8h ;Bus-Kontrollen
s1sta data 0d9h ;Bus-Status
s0buf data 99h
P1_6 bit 96h ;SCL-Pin
P1_7 bit 97h ;SDA-Pin
P_4 data 0c0h
aa bit 0dah ;Ackknowledge Flag
si bit 0dbh ;Interrupt Flag
sto bit 0dch ;Stoppbit
sta bit 0ddh ;Startbit
ens1 bit 0deh ;I2C-Bus aktivieren
es1 bit 0adh ;I2C-Bus-Interrupt aktivieren
;R0 Hauptprogramm empfangenes Zeichen
Hauptprogramm
org anfang
mov dptr,#haupt ;
clr a ;
jmp @a+dptr ;
org haupt
call init ;Bus initialisieren
loop: call bytein
mov r0,a
mov a,r0 ;80h Anmelden
subb a,#80h
jz loop80
mov a,r0 ;81h Abmelden
subb a,#81h
jz loop81
mov a,r0 ;82h Startaufforderung
subb a,#82h
jz loop82
mov a,r0 ;83h Stoppaufforderung
subb a,#83h
jz loop83
mov a,r0 ;84h Clr AA
subb a,#84h
jz loop84
mov a,r0 ;85h Set AA
subb a,#85h
jz loop85
jmp loop
loop80: mov a,s1sta
mov r0,a
call byteout
mov a,r0
subb a,#0F8h
jnz loop
;Status=F8, Empfangen der Einstellungen
call bytein ;Eigene Adresse + General Call
mov s1adr,a
setb es1
setb ens1
jmp loop
loop81: clr ens1
clr es1
jmp loop
loop82: call start
jmp loop
loop83: setb sto
jmp loop
loop84: clr AA
jmp loop
loop85: setb AA
jmp loop
Initialisierung
; -> /
; <- /
; cha ea, es1, P1_6, P1_7, s1adr, s1con
; subr /
init: setb ea ;Interrupts aktivieren
clr es1 ;I2C-Bus-Interrupts aktivieren
setb P1_6 ;
setb P1_7 ;
mov s1adr,#10000000b ;Eigene Busadresse, General Call aktiviert
mov s1con,#10000101b ;Controllregister
;S1CON: 1 1 0 0 0 1 0 1
CR2 ENS1 STA STO SI AA CR1 CR0
ret
Starten
; -> /
; <- /
; cha aa, sta, si
; subr /
start: setb aa
setb sta ;Startbit setzen
clr si
ret
Bytein
; -> s0buf
; <- a
; cha ri,a
; subr /
bytein: jnb ri,bytein
mov a,s0buf
clr ri
ret
Interruptroutinen
; -> /
; <- /
; cha s1dat, s1con, a
; subr bytein, byteout
; 00h alle Bus-Fehler
sta00: mov a,s1sta
call byteout
reti
; 08h MT, MR Start gesendet
sta08: mov a,s1sta
call byteout
call bytein
mov S1DAT,a ;
clr sta ;
clr sto ;
setb aa ;
clr SI ;
reti
; 10h MT, MR Repeated-Start gesendet
sta10: mov a,s1sta
call byteout
call bytein
mov S1DAT,a ;
clr sta ;
clr sto ;
setb aa ;
clr SI ;
reti
; 18h MT Adresse+W gesendet, ACK empfangen
sta18: mov a,s1sta
call byteout
call bytein ;Tastatureingabe
cjne a,#83h,lab18a ;82h Stoppbedingung
setb sto ;Stopbit setzen
jmp lab18b ;Verarbeitung der Daten ueberspringen
lab18a: mov s1dat,a ;
lab18b: clr si ;Daten senden oder Verbindung beenden
reti
; 20h MT Adresse+W gesendet, NACK empfangen
sta20: mov a,s1sta
call byteout
setb STO ;Stop senden
clr SI
reti
; 28h MT Daten gesendet, ACK empfangen STANDARD
sta28: mov a,s1sta
call byteout
call bytein ;Tastatureingabe
cjne a,#83h,lab28a ;82h Stoppbedingung
setb sto ;Stopbit setzen
jmp lab28b ;Verarbeitung der Daten ueberspringen
lab28a: mov s1dat,a ;
lab28b: clr si ;Daten senden oder Verbindung beenden
reti
; 30h MT Daten gesendet, NACK empfangen
sta30: mov a,s1sta
call byteout
setb sto
clr si
reti
; 38h MT, MR Arbitration verloren beim Senden von Adresse oder Daten (Transmitter)
beim NACK (Receiver)
sta38: mov a,s1sta
call byteout
setb sto
clr si
reti
; 40h MR Adresse+R gesendet, ACK empfangen
sta40: mov a,s1sta
call byteout
clr si ;auf Daten vom Slave warten
reti
; 48h MR Adresse+R gesendet, NACK empfangen
sta48: mov a,s1sta
call byteout
setb sto
clr si
reti
; 50h MR Daten empfangen, ACK gesendet STANDARD
sta50: mov a,s1sta
call byteout
mov a,s1dat ;Daten vom Slave in Akku
call byteout ;Datenausgabe
clr si
reti
; 58h MR Daten empfangen, NACK gesendet
sta58: mov a,s1sta
call byteout
setb aa
setb sto
clr si
reti
; 60h SR Adresse+W empfangen, ACK gesendet
sta60: mov a,s1sta
call byteout
clr si
reti
; 68h SR Arbitration verloren als adressierter Master,
; Adresse+W empfangen, ACK gesendet
sta68: mov a,s1sta
call byteout
setb sto
clr si
reti
; 70h SR General-Call empfangen, ACK gesendet
sta70: mov a,s1sta
call byteout
clr si
reti
; 78h SR Arbitration verloren als adressierter Master,
; General-Call empfangen, ACK gesendet
sta78: mov a,s1sta
call byteout
setb sto
clr si
reti
; 80h SR Daten empfangen, ACK gesendet (adressiert) STANDARD
sta80: mov a,s1sta
call byteout
mov A,S1DAT ;Daten vom Master in Akku
call byteout ;Zeichen ausgeben
clr si
reti
; 88h SR Daten empfangen, NACK gesendet (adressiert)
sta88: mov a,s1sta
call byteout
clr si
reti
; 90h SR Daten empfangen, ACK gesendet (General Call)
sta90: mov a,s1sta
call byteout
mov A,S1DAT ;Daten vom Master in Akku
call byteout ;Zeichen ausgeben
clr si
reti
; 98h SR Daten empfangen, NACK gesendet (General Call)
sta98: mov a,s1sta
call byteout
clr si
reti
; A0h SR Stop oder Repeated-Start empfangen
staA0: mov a,s1sta
call byteout
clr si
reti
; A8h ST Adresse+R empfangen, ACK gesendet
staA8: mov a,s1sta
call byteout
call bytein ;Zeicheneingabe
mov S1DAT,A ;
clr si ;Uebertragung
reti
; B0h ST Arbitration verloren als adressierter Master,
; Adresse+R empfangen, ACK gesendet
staB0: mov a,s1sta
call byteout
setb sto
clr si
reti
; B8h ST Daten gesendet, ACK empfangen STANDARD
staB8: mov a,s1sta
call byteout
call bytein ;Zeicheneingabe
mov S1DAT,A ;
clr si ;Uebertragung
reti
; C0h ST Daten gesendet, NACK empfangen
staC0: mov a,s1sta
call byteout
clr si
reti
; C8h ST AA=0, letzte Daten gesendet, ACK empfangen
staC8: mov a,s1sta
call byteout
mov S1DAT,0FFh ;S1DAT=11111111b
clr si
reti
Interruptsprünge
org inter
jmp intera
org 8F00h
intera:
mov A,S1STA ;Je nach Statusinhalt
mov dptr,#9000h ;Sprung auf jeweilige
jmp @A+dptr ;SUB-Routine
org 9000h
jmp sta00
org 9008h
jmp sta08
org 9010h
jmp sta10
org 9018h
jmp sta18
org 9020h
jmp sta20
org 9028h
jmp sta28
org 9030h
jmp sta30
org 9038h
jmp sta38
org 9040h
jmp sta40
org 9048h
jmp sta48
org 9050h
jmp sta50
org 9058h
jmp sta58
org 9060h
jmp sta60
org 9068h
jmp sta68
org 9070h
jmp sta70
org 9078h
jmp sta78
org 9080h
jmp sta80
org 9088h
jmp sta88
org 9090h
jmp sta90
org 9098h
jmp sta98
org 90A0h
jmp staA0
org 90A8h
jmp staA8
org 90B0h
jmp staB0
org 90B8h
jmp staB8
org 90C0h
jmp staC0
org 90C8h
jmp staC8
end
Haupt | Fügen Sie Referat | Kontakt | Impressum | Nutzungsbedingungen