Hallo William,
ich habe mal kurz eines meiner Programme zurechtgestutzt:
Code:
$regfile = "m8def.dat"
$crystal = 8000000
$lib "i2c_twi.lbx"
$hwstack = 256
$swstack = 256
$framesize = 64
'Subs deklarieren
Declare Sub Twi_init_slave
Enable Interrupts
'Ports setzen
Ddrb = &B0000111
Portb = &B11111000
Ddrd = &B11101111
Portd = &B00010000
'SDA und SCL definieren
Config Sda = Portc.4
Config Scl = Portc.5
I2cinit
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
'PWM1a auf Pinb.1; PWM1b auf Pinb.2
Config Timer2 = Pwm , Compare Pwm = Clear Up
'PWM2 auf Pinb.3
Waitms 100
Call Twi_init_slave ' TWI aktivieren
Dim I As Byte
Dim J As Byte
Const Maxanzahlbyte = 2 ' Wenn mehr Zeichen kommen werden diese verworfen !
Dim Messagebuf(maxanzahlbyte) As Byte
Dim Anzahlbuf As Byte ' Anzahl Zeichen die gesendet wurden
Dim Neuemsg As Byte ' zeigt an wenn eine neue Message gültig ist
Dim Twi_control As Byte ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte
Const Slaveid = &H82 'Adresse für I2C
Twi_data = 0
Anzahlbuf = 0
Neuemsg = 0
Do
' schauen ob TWINT gesetzt ist
Twi_control = Twcr And &H80 ' Bit7 von Controlregister auslesen
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status ->Bit3 bis Bit7
Select Case Twi_status
' Slave Adress received, wir sind gemeint !
Case &H60 :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
Anzahlbuf = 0
Neuemsg = 0 ' Flag für Message ungültig
' Byte mit ACK
Case &H80 :
If Anzahlbuf < Maxanzahlbyte Then
Incr Anzahlbuf ' zähler +1
Messagebuf(anzahlbuf) = Twdr
End If
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
' Stop oder restart empfangen
Case &HA0 :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
' es müssen 2 Byte sein, damit das Paket OK ist
If Anzahlbuf = Maxanzahlbyte Then
Neuemsg = 1 ' Flag für Message gültig
Else
Neuemsg = 0 ' Flag für Message ungültig
End If
' was anderes empfangen
Case Else :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
End Select
End If
' ein gültiges Paket angekommen
If Neuemsg = 1 Then
Neuemsg = 0 ' Flag wieder löschen
Select Case Messagebuf(1)
'Erster Wert
Case 1:
Pwm1a = Messagebuf(2)
Case 2:
Pwm1b = Messagebuf(2)
Case 3:
Compare2 = Messagebuf(2)
Case Else:
End Select
'Waitms 250
End If
Loop
End
' TWI als slave aktivieren
Sub Twi_init_slave
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = Slaveid ' Slaveadresse setzen
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten
End Sub
Ich habe es nicht getestet, aber wenn man 2 Bytes nacheinander schickt (erstes 1, 2 oder 3) sollte der zweite Wert auf den entsprechenen PWM-Kanal ausgegeben werden.
Das Grundprogramm stammt übrigens aus dem RN-Wissen Artikelbereich.
Lesezeichen