PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Controller Reset durch I2C-Übertragung



Che Guevara
13.01.2013, 01: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!

Che Guevara
13.01.2013, 17:40
Hi,

also es hat sich herausgestellt, dass es wohl doch ein Softwareproblem ist!
Wenn ich im Slave die Zeilen auskommentiere:


$lib "i2c_twi-slave.lbx"
Config Twislave = &H70 , Btr = 2 , Bitrate = 400000
Config Sda = Portc.4
Config Scl = Portc.5
I2cinit

dann funktioniert der Levelshifter! Aber warum? Kennt sich jemand damit aus?

Gruß
Chris

EDIT:
Ok, also die Pegel gehen nur auf 0V, wenn was gesendet wird... Könnte es evtl. sein, dass die Größenordnung der Pullups falsch ist (3k3)?

Kampi
13.01.2013, 22:24
Hey,

für 3,3V verwendet man glaube ich 1,8kOhm (zumindest beim Pi).
Aber ich glaube nicht das dies der Fehler ist. Sicher das die FETs funktionieren?

Che Guevara
13.01.2013, 23:02
Hi,

also die Pullups ansich funktionieren, weil der MPU6000 schon lange erfolgreich läuft ;)
Die Mosfets sind nagelneu eingelötet, ohne zu heiß zu werden. Und wenn nichts auf dem Bus los ist, funktioniert der Konverter ja....

Gruß
Chris