Che Guevara
13.01.2013, 02:51
Hi,
ich bin gerade dabei, einen ATMega328p als I2C-Slave zu benutzen. Als Master fungiert ein ATXMega32A4. Als Levelshifter verwende ich zwei BSS138 (Mosfet) mit den passenden Wiederständen ( http://playground.arduino.cc/Main/I2CBi-directionalLevelShifter ). Jedesmal wenn ich vom Master (ATXMega32A4) etwas sende, springt der ATMega328P an den Anfang, zumindest wird immer wieder "Start" geprintet... Aber ich habe keine Ahnung warum.
Der Master:
$regfile = "xm32a4def.dat"
$crystal = 32000000
$framesize = 150 '100
$swstack = 150 '100
$hwstack = 150 '100
$lib "xmega.lib"
$external _xmegafix_clear
$external _xmegafix_rol_r1014
Config Osc = Disabled , 32mhzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
'--UART Settings--
Config Com2 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM2:" For Binary As #1
'--TWI Settings--
Dim Twi_start As Byte
Open "twie" For Binary As #2
Config Twie = 400000
I2cinit #2
Const Height_write = &H70
Const Height_read = &H71
Dim Adc_val As Word
Dim Adc_ovl(2) As Byte At Adc_val Overlay
Do
I2cstart #2
I2cwbyte Height_write , #2
I2cwbyte 137 , #2
I2cstop #2
Waitms 100
Loop
End
Der Slave:
$regfile = "m328pdef.dat"
$crystal = 8000000
$framesize = 150
$hwstack = 150
$swstack = 150
$baud = 19200
$lib "i2c_twi-slave.lbx"
Config Twislave = &H70 , Btr = 2 , Bitrate = 400000
Config Sda = Portc.4
Config Scl = Portc.5
I2cinit
Config Adc = Single , Prescaler = Auto , Reference = Aref
Start Adc
Config Portb.1 = Output
Config Portb.2 = Output
Config Pinc.0 = Input
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear_up , Compare B Pwm = Clear_up , Prescale = 1
Pwm1a = 183
Pwm1b = 183
Portc.0 = 0
Dim Adcval As Word
Dim I2c_ovl(2) As Byte At Adcval Overlay
Print "Start"
Enable Interrupts
Do
Adcval = Getadc(0)
Loop
End
Twi_read_addressed:
Twi = 0 'Twi = I2c_ovl(twi_btr)
Return
Twi_master_needs_more_byte:
Twi = 0 'Twi = I2c_ovl(twi_btr)
Return
Twi_slave_error:
Return
Twi_write_addressed:
Return
Twi_gotdata:
Print "TWI = " ; Twi
Return
Twi_stop_rstart_received:
Return
Twi_master_need_nomore_byte:
Return
Wenn jemand davon Ahnung hat, bitte melden :D
Vielen Dank & Gruß
Chris
EDIT:
Mir ist gerade aufgefallen, dass ich wohl leider einen Fehler in der Hardware habe... Wenn die beiden µCs verbunden sind, werden die SCL & SDA Leitungen dauerhaft auf Low gezogen... Das ist jetzt wohl eher ein Thread für die Elektronik Abteilung, Sorry!
ich bin gerade dabei, einen ATMega328p als I2C-Slave zu benutzen. Als Master fungiert ein ATXMega32A4. Als Levelshifter verwende ich zwei BSS138 (Mosfet) mit den passenden Wiederständen ( http://playground.arduino.cc/Main/I2CBi-directionalLevelShifter ). Jedesmal wenn ich vom Master (ATXMega32A4) etwas sende, springt der ATMega328P an den Anfang, zumindest wird immer wieder "Start" geprintet... Aber ich habe keine Ahnung warum.
Der Master:
$regfile = "xm32a4def.dat"
$crystal = 32000000
$framesize = 150 '100
$swstack = 150 '100
$hwstack = 150 '100
$lib "xmega.lib"
$external _xmegafix_clear
$external _xmegafix_rol_r1014
Config Osc = Disabled , 32mhzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
'--UART Settings--
Config Com2 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM2:" For Binary As #1
'--TWI Settings--
Dim Twi_start As Byte
Open "twie" For Binary As #2
Config Twie = 400000
I2cinit #2
Const Height_write = &H70
Const Height_read = &H71
Dim Adc_val As Word
Dim Adc_ovl(2) As Byte At Adc_val Overlay
Do
I2cstart #2
I2cwbyte Height_write , #2
I2cwbyte 137 , #2
I2cstop #2
Waitms 100
Loop
End
Der Slave:
$regfile = "m328pdef.dat"
$crystal = 8000000
$framesize = 150
$hwstack = 150
$swstack = 150
$baud = 19200
$lib "i2c_twi-slave.lbx"
Config Twislave = &H70 , Btr = 2 , Bitrate = 400000
Config Sda = Portc.4
Config Scl = Portc.5
I2cinit
Config Adc = Single , Prescaler = Auto , Reference = Aref
Start Adc
Config Portb.1 = Output
Config Portb.2 = Output
Config Pinc.0 = Input
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear_up , Compare B Pwm = Clear_up , Prescale = 1
Pwm1a = 183
Pwm1b = 183
Portc.0 = 0
Dim Adcval As Word
Dim I2c_ovl(2) As Byte At Adcval Overlay
Print "Start"
Enable Interrupts
Do
Adcval = Getadc(0)
Loop
End
Twi_read_addressed:
Twi = 0 'Twi = I2c_ovl(twi_btr)
Return
Twi_master_needs_more_byte:
Twi = 0 'Twi = I2c_ovl(twi_btr)
Return
Twi_slave_error:
Return
Twi_write_addressed:
Return
Twi_gotdata:
Print "TWI = " ; Twi
Return
Twi_stop_rstart_received:
Return
Twi_master_need_nomore_byte:
Return
Wenn jemand davon Ahnung hat, bitte melden :D
Vielen Dank & Gruß
Chris
EDIT:
Mir ist gerade aufgefallen, dass ich wohl leider einen Fehler in der Hardware habe... Wenn die beiden µCs verbunden sind, werden die SCL & SDA Leitungen dauerhaft auf Low gezogen... Das ist jetzt wohl eher ein Thread für die Elektronik Abteilung, Sorry!