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.
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
Was nicht passt sind diese Zeilen:
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
warum ist denn das mit dem Mega32 nicht kompatibel?Was hat der Mega8 was der Mega32 nicht hat?
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:
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
In welche Sub soll ich den Code im Slaveprogramm reinschreiben?
You need to insert code in these subroutines
Lesezeichen