Hallo
Wie kann ich die M8 TWI-Slave so umschreiben, dass es auch auf einem Mega32 läuft?
Das Datenblatt vom Atmega32 hab ich mir auch schon etwas durchgelesen. Doch da blick ich noch nicht so durch. Mir wäre es mal lieber wenn ich mal einen Quellcode habe der auch funktioniert.
Was nicht passt sind diese Zeilen:Code:'------------------------------------------------------------------------------- ' (c) 2004 MCS Electronics ' This demo shows an example of the TWI in SLAVE mode ' Not all AVR chips have TWI (hardware I2C) ' This demo is a Mega8 I2C A/D converter slave chip ' NOTICE that this demo will only work with the TWI slave library which is avaialble as an add on '------------------------------------------------------------------------------- $regfile = "M32def.dat" ' the chip we use $crystal = 16000000 ' crystal oscillator value $baud = 9600 ' baud rate Print "MCS Electronics M8 TWI-slave demo" Print "Use with M8-TWI master demo" Config Adc = Single , Prescaler = Auto 'Now give power to the chip Start Adc Dim W As Word Config Portb = Output 'Dim Status As Byte 'Print Hex(status) Twsr = 0 ' status und Prescaler auf 0 Twdr = &HFF ' default Twcr = &B00000100 ' erstmal nur TWI aktivieren Twar = &H40 ' Slaveadresse setzen Twcr = &B01000100 ' dann ACK einschalten 'The variables Twi , Twi_btr and Twi_btw are created by the compiler. These are all bytes 'The TWI interrupt is enabled but you need to enabled the global interrupt Enable Interrupts 'this is just an empty loop but you could perform other tasks there Do 'Print Getadc(0) 'Waitms 500 nop Loop End 'The following labels are called from the library. You need to insert code in these subroutines 'A master can send or receive bytes. 'A master protocol can also send some bytes, then receive some bytes 'The master and slave must match. 'the following labels are called from the library when master send stop or start Twi_stop_rstart_received: Print "Master sent stop or repeated start" Return 'master sent our slave address and will not send data Twi_addressed_goread: Print "We were addressed and master will send data" Return Twi_addressed_gowrite: Print "We were addressed and master will read data" Return 'this label is called when the master sends data and the slave has received the byte 'the variable TWI holds the received value Twi_gotdata: Print "received : " ; Twi ; " byte no : " ; Select Case Twi_btw Case 1 : Portb = Twi ' first byte Case 2: 'you go figure End Select Return 'this label is called when the master receives data and needs a byte 'the variable twi_btr is a byte variable that holds the index of the needed byte 'so when sending multiple bytes from an array, twi_btr can be used for the index Twi_master_needs_byte: Print "Master needs byte : " ; Twi_btr Select Case Twi_btr Case 1: ' first byte W = Getadc(0) Twi = Low(w) Case 2 ' send second byte Twi = High(w) End Select Return 'when the mast has all bytes received this label will be called Twi_master_need_nomore_byte: Print "Master does not need anymore bytes" Return
warum ist denn das mit dem Mega32 nicht kompatibel?Was hat der Mega8 was der Mega32 nicht hat?Code:Twi_gotdata: Print "received : " ; Twi ; " byte no : " ; Select Case Twi_btw Case 1 : Portb = Twi ' first byte Case 2: 'you go figure End Select Return Twi_master_needs_byte: Print "Master needs byte : " ; Twi_btr Select Case Twi_btr Case 1: ' first byte W = Getadc(0) Twi = Low(w) Case 2 ' send second byte Twi = High(w) End Select Return
Edit: Ich habe es jetzt soweit umgeschrieben.
Dim Twi As Byte , Twi_btr As Byte , Twi_btw As Byte
Diese Zeile hab ich noch eingefügt.
Doch kann ich vom master immer noch nichts empfangen. Was muss ich da noch verändern?
Dies ist das Masterprogramm:
In welche Sub soll ich den Code im Slaveprogramm reinschreiben?Code:'------------------------------------------------------------------------------- ' (c) 2004 MCS Electronics ' This demo shows an example of the M8 TWI ' Not all AVR chips have TWI (hardware I2C) '------------------------------------------------------------------------------- 'The chip will work in TWI/I2C master mode 'Connected is another Mega8 in TWI-slave mode $regfile = "M32def.dat" ' the used chip $crystal = 16000000 ' frequency used $baud = 9600 ' baud rate $lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI Config Scl = Portc.0 ' we need to provide the SCL pin name Config Sda = Portc.1 ' we need to provide the SDA pin name 'On the Mega8, On the slave Mega8 'scl=PC5 , pin 28 scl=PC5 , pin 28 'sda=PC4 , pin 27 sda=PC4 , pin 27 'the M8 slave uses a simple protocol 'WRITE -> Start-address-B1-B2-STOP 'READ -> start-address-B1-B2-STOP 'start -> I2CSTART 'address-the slave address 'B1 and B2 are 2 bytes that when written, write to B1 ' when read , return A/D converter value Dim B1 As Byte , B2 As Byte Dim W As Word At B1 Overlay I2cinit ' we need to set the pins in the proper state Twbr = 12 'bit rate register Twsr = 0 'pre scaler bits Dim B As Byte , X As Byte Print "Mega32 TWI master demo" Do I2cstart I2cwbyte &H70 ' slave address write I2cwbyte &B10101010 ' write command I2cwbyte 2 I2cstop Print "Error : " ; Err ' show error status I2cstart I2cwbyte &H71 I2crbyte B1 , Ack I2crbyte B2 , Nack I2cstop Print "Error : " ; Err ' show error Print "received A/D : " ; W Waitms 500 'wait a bit Loop End
You need to insert code in these subroutines







Zitieren

Lesezeichen