PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TWI (I2C) am AVR Atmega128 macht Probleme



tuxer
12.03.2007, 22:45
Hallo,

ich versuche mit dem RnFunk128-Board das Kompassmodul CMPS03 über I2C anzusteuern. Mit der mitgelieferten BASCOM-Demo funktioniert es ohne Probleme. Da ich aber lieber in C programmiere (und BASCOM unter Linux nicht funktioniert :wink: ) , habe ich ein Programm geschrieben, welches die twimaster.c von P. Fleury verwendet und zum Test erstmal die Firmwareversion des Moduls ausliest und per UART an den PC schickt. Übertrage ich das Programm auf den Controller, wird das Programm automatisch gestartet, nachdem die Programmierung abgeschlossen ist. Dann funktioniert das Programm auch. Schalte ich aber das Board aus, entferne das Programmierkabel und schalte es anschließend wieder ein, kann der Microcontroller die Version nicht auslesen, er wartet scheinbar ewig auf die Daten.
Hier der Quellcode des Programms:



#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>

#include "radio.h"
#include "usart.h"
#include "adc.h"
#include "i2cmaster.h"
#include "cmps03.h"

int read_compass()
{
int data;

i2c_start(0xc0);
i2c_write(0);
i2c_stop();

i2c_start(0xc1);
data = i2c_readNak();
i2c_stop();

return data;
}

int main(void)
{
char ret;
int direction;
char msg[5];
ret = usart_init(B9600);
i2c_init();

memset(msg, 0, 5);
usart_send("uc code test\n\r", 14);
direction = read_compass();
itoa(direction, msg, 10);
msg[3] = '\n';
msg[4] = '\r';
usart_send(msg, 5);
usart_send("uc code afte\n\r", 14);

return 0;
}


Hoffe jemand kann mir helfen.

triplebit
13.03.2007, 00:34
Hallo tuxer,

ohne deine Hardware und die Bibliothek(mein asm ist ein bischen eigerostet) zu kennen, probier ichs mal.

Wenn ich dich richtig verstanden habe bleibt dein Progi hängen, nachdem

usart_send("uc code test\n\r", 14);

gesendet wurde. Wie gesagt ich kenne die Bibi net, aber es könnte sein das der Slave sein PowerUp noch nicht beendet hat und dein MC schon versucht ihn zu adressieren. Wenn dann kein TimeOut eingebaut ist könnte das hängenbleiben daran liegen.

versuche einfach mal die Schaltung unter Spannung zu setzten und dann erst den slave zu reseten und dann den master.

Du kannst auch mal den Bus messen! Wenn der Bus auf low ist stimmt was nicht(irgendeiner nuckelt dran). Du kannst auch in deinem Progi ein PowerUp-Wait einbauen um das zu vermeiden(Falls nach dem reseten von slave und master der bus immer noch low ist).

wenn das nicht fruchtet, dann versuch mal rauszubekommen wo dein progi hängen bleibt.

hoffe das hilft,


cu martin

tuxer
13.03.2007, 07:18
triplebit,

vielen vielen Dank. Genau das war das Problem. Wenn ich ihn anschalte und nach einer Weile resette, dann funktioniert es.
Nochmal herzlichen Dank.

tuxer