Hallo William,
ich habe mal kurz eines meiner Programme zurechtgestutzt:
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.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
Das Grundprogramm stammt übrigens aus dem RN-Wissen Artikelbereich.







Zitieren

Lesezeichen