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/I2...alLevelShifter ). 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:
Der Slave:Code:$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
Wenn jemand davon Ahnung hat, bitte meldenCode:$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
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!







Zitieren

Lesezeichen