REFERAT-MenüDeutschGeographieGeschichteChemieBiographienElektronik
 EnglischEpochenFranzösischBiologieInformatikItalienisch
 KunstLateinLiteraturMathematikMusikPhilosophie
 PhysikPolitikPsychologieRechtSonstigeSpanisch
 SportTechnikWirtschaftWirtschaftskunde  



Pc bus registrer


I²C-Bus-Terminal 1.0
















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


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.



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 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



FormKonfig




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



FormVerbinden




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


FormInfo




Option Explicit


Private Sub Command1_Click()

Unload FormInfo

End Sub




Das mC-Programm



; 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