Pc bus registrer
            
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Inhalt
1.	Einleitung	2
2.	Die verwendeten I²C-Bus-Register	2
3.	Programmversion ohne Bedienoberfläche	3
4.	Programmversion mit Bedienoberfläche	11
4.1.
	Grundlegende Funktion von mC- und PC-Programm	11
4.2.	Inbetriebnahme mit dem Microcontroller-Board	11
4.3.	Hilfesystem	11
4.4.
	Anhang	12
4.4.1.	Initialisierung	12
4.4.2.
	Kommunikationszeichen	12
4.4.3.	Gespeicherte Einstellungen	12
4.4.4.
	Statuszustände in mC und PC	13
4.4.5.	Die Formulare und Module des PC-Programms	14
4.4.5.
1.	FormMain	14
4.4.5.2.	FormKonfig	32
4.
4.5.3.	FormVerbinden	34
4.4.5.
4.	FormInfo	36
4.4.6.	Das mC-Programm	37
 
 
 
Einleitung
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 verwendeten I²C-Bus-Register
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.
 
 
 
Programmversion ohne Bedienoberfläche
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
 
 
 
Programmversion mit Bedienoberfläche
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.
 
 
Grundlegende Funktion von mC- und PC-Programm
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.
 
 
Inbetriebnahme mit dem Microcontroller-Board
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.
 
 
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.
 
Anhang
Initialisierung
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
 
Kommunikationszeichen
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
 
Gespeicherte Einstellungen
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
 
Statuszustände in mC und PC
Kennung
Modus
Beschreibung
XX
-
PC ohne Verbindung
LC
-
Link Controller; Verbindungsversuch zu mC
00
Alle
Bus-Fehler
F8
-
PC mit mC verbunden, kein Bus-Betrieb
LB
MT, MR
Link Bus; Verbindungsversuch mit Bus
08
MT, MR
Start gesendet
10
MT, MR
Repeated-Start gesendet
18
MT
Adresse+W gesendet, ACK empfangen
20
MT
Adresse+W gesendet, NACK empfangen
28
MT
Daten gesendet, ACK empfangen; STANDARD
MT
MT
Master transmitting; Master sendet derzeit
30
MT
Daten gesendet, NACK empfangen
38
MT, MR
Arbitration verloren
beim Senden von Adresse oder Daten (Transmitter), beim NACK (Receiver)
40
MR
Adresse+R gesendet, ACK empfangen
48
MR
Adresse+R gesendet, NACK empfangen
50
MR
Daten empfangen, ACK gesendet; STANDARD
MR
MR
Master empfängt derzeit
RS
MR
Receiver stopped
58
MR
Daten empfangen, NACK gesendet
60
SR
Adresse+W empfangen, ACK gesendet
68
SR
Arbitration verloren als adressierter Master
Adresse+W empfangen, ACK gesendet
70
SR
General-Call empfangen, ACK gesendet
78
SR
Arbitration verloren als adressierter Master
General-Call empfangen, ACK gesendet
80
SR
Daten empfangen, ACK gesendet (adressiert); STANDARD
SR
SR
Slave empfängt derzeit (adressiert)
88
SR
Daten empfangen, NACK gesendet (adressiert)
90
SR
Daten empfangen, ACK gesendet (General Call)
GR
SR
Slave empfängt derzeit (General Call)
98
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.
 
 
Die Formulare und Module des PC-Programms
Beschreibungen zu einzelnen Einstellungsdetails der Fenster sind dem Hilfesystem zu entnehmen.
 
FormMain
 
 
 
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 Änderungen 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 Änderungen 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.Pane
| Anmerkungen: |               
 | impressum | datenschutz
© Copyright Artikelpedia.com