Hi,
ich habe hier einen ATMega8, 16MHz Resonator, programmiert mit bewährtem
Script für AVR-Dude.
LED, serielle Verbindung über Max202 an PC, alles funzt.
Nun will ich mit einem Gyro per I2C sprechen und mein erster Gehversuch
mit I2C geht voll daneben.
Der Gyro ist ein Modul MinIMU-9 (L3G4200D and LSM303DLH Carrier) von
Pololu.
Im Programm ist sonst kein Timer oder Interrupt aktiv.
Es geht alles bis in die Gosub write_byte, "i2c start" wird noch
gesendet und dann ist schluss. Die LED bleibt an und "slaveadr" kommt
nicht.
Klemme ich den Gyro ab (also SCL und SDA offen am Mega8) läuft es durch.
Was zum Teufel kann man da so dermassen falsch machen?
Ich mein, von mir aus stimmt was mit der Adresse nicht aber daß der
Mega8 dann dort hängenbleibt?
1
$regfile = "M8DEF.DAT"
2
3
$hwstack = 200
4
$swstack = 32
5
$framesize = 64
6
7
$lib "i2c.lib"
8
9
$crystal = 16000000
10
11
Config Scl = Portb.4 'AtMega8 PDip Pin27
12
Config Sda = Portb.5 'AtMega8 PDip Pin28
13
I2cinit
14
15
$baud = 19200 'RX Pin2, TX Pin3
16
17
Ddrb.0 = 1
18
Led Alias Portb.0
19
20
Const Ctrl_reg1 = &H20
21
Const Ctrl_reg4 = &H23
22
Const Gyroadress = &HD2 'Gyro slave adress for write
23
24
Dim Slaveadress As Byte 'Adress of the slave to read or write
25
Dim Subadress As Byte 'the register to read or write
26
Dim Databyte As Byte 'Byte to read or write
27
28
'###############################################
29
Print "Gyro-test"
30
Led = 1
31
Wait 1
32
Led = 0
33
34
Waitms 100
35
Gosub Init_gyro
36
37
End
38
39
Init_gyro:
40
Print "init-G-start"
41
Slaveadress = Gyroadress
42
Subadress = Ctrl_reg1
43
Databyte = &B10001111 'Enable all, ODR 400kHz, LPF1 cut off 78Hz
Hi,
also was ich oben schrieb:
"Klemme ich den Gyro ab (also SCL und SDA offen am Mega8) läuft es
durch."
kann ich jetzt nicht mehr reproduzieren.
Doch ein Hardwareproblem?
Gruß,
Norbert
Norbert S. schrieb:> Config Scl = Portb.4 'AtMega8 PDip Pin27> Config Sda = Portb.5 'AtMega8 PDip Pin28
Da kollidiert die Beschreibung mit der Realität. An Pin 27/28 liegt
PC4/5 und die HW-I2C Schnittstelle. PB4/5 geht für SW-I2C, auch die
eingebundene Lib deutet darauf hin. Über Config I2CDelay sollte dann die
Geschwindigkeit der Soft-I2C eingestellt werden. Es müssen externe
Pullup-Widerstände dran, Soft-I2C geht nicht mit den internen Pullups
des µCs.
Hi,
yeah, das wars! Danke!
Daß der Mega8 sich dann aufhängt finde ich zwar immer noch komisch aber
nun rennt es.
Naja, fast.
Die Daten sind Müll aber da habe ich sicher noch irgendwas mit den
Adressen falsch.
Gruß,
Norbert
Hey, ich bin so eben auf den Beitrag hier gestoßen, und ich hätte ein
paar Fragen: man muss vor dem code noch sdl und sca definieren oder?
Kann man 2 verschiedene sensoren auslesen?
Hi,
das hatte ich in dem kopierten Code vergessen.
$lib "i2c_twi.lbx"
Config Twi = 400000
Config Scl = Portc.0
Config Sda = Portc.1
I2cinit
Das sind die Hardware I2C Pins eines ATMega324, nicht wie oben noch ein
Mega8.
Das oben sind drei verschiedene Sensoren, wobei zwei davon im gleichen
Gehäuse sind.
Gruß,
Norbert