burnde
10.06.2010, 10:52
Hallo,
ich habe ein Problem mit dem Drehwinkel-Sensor AS5046 von austriamicrosystems. Kurz zur Vorerklärung, ich habe gerade angefangen meine Bachelorarbeit zu schreiben und dafür muss ich eine Firmware für einen AT90CAN128 schreiben.
Zum Aufbau: im Moment habe ich einen Microcontroller und an dessen I²C Bus einen Sensor. Später sollen mehrere Parallel hinzukommen.
Mein Problem besteht jetzt darin das alle Sensoren wegen eines vorherigen Projekts schon fertig auf Platinen aufgelötet sind, ich also nichts mehr an der Hardware ändern kann. Abgesehen von Sensor runter löten, Leitungen weg kratzen und Workaround legen.
Hier die Belegung des Sensors auf der Platine:
Pin 1 (MAGRNGN) > GND
Pin 2 (Mode) > NC
Pin 3 (CSN) > GND
Pin 4 (SCL) > SCL µC
Pin 5 (NC0) > NC
Pin 6 (SDA) > SDA µC
Pin 7 (VSS) > GND
Pin 8 (PROG) > GND
Pin 9 (DACREF) > GND
Pin 10 (DACOUT) > NC
Pin 11 (FB) > 1/2 VOUT mittels Spannungsteiler
Pin 12 (VOUT) > über 2x30kOhm gegen GND
Pin 13 (NC2) > NC
Pin 14 (NC1) > NC
Pin 15 (VDD3V3) > über C 1µ gegen GND
Pin 16 (VDD5V) > +5V
Mein Problem ist jetzt das ich den Sensoren wegen I²C eine Adresse zuweisen muss. Mein Betreuer meinte das die noch nichts an den Adressen geändert haben weil sie es nicht brauchten. Wie kann ich den Sensoren eine eigene Adresse zuweisen? Geht das wirklich nur über die OTP Programmierung? Oder hab ich im Datenblatt etwas übersehen? OTP wird nämlich schwierig da der PROG Pin und der CSN Pin auf GND liegen.
Dann habe ich jetzt erst einmal versucht nur einen Sensor am Bus zu betreiben, um das Datenauslesen zu Programmieren. Ich benutze die ungeänderte I²C lib von Peter Fleury. Da hab ich jetzt aber das Problem das mir der Sensor auf keine Adresse ein ACK gibt. die Standard Adresse müsste doch die 50h sein wenn ich das im Datenblatt richtig verstanden habe oder? Hab dann aus Verzweiflung mal alle 127 Adressen ausprobiert aber nichts passiert. Das TWSR gibt mir immer nur NACK als Status zurück.
Hier ist mein Programm:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "uart.h"
#include "i2cmaster.h"
void init_all();
int main()
{
init_all();
while(1)
{
for(ad = 0x00; ad <= 0xFE; ad = ad + 2)
{
if( i2c_start((unsigned char) ad));
uart_putc((unsigned char) ad);
i2c_stop();
_delay_ms(1000);
}
}
return 0;
}
void init_all()
{
unsigned int ubrr = 8;
uart_init(ubrr);
DDRD |= (1<<PD1) | (1<<PD0);
PORTD |= (1<<PD1) | (1<<PD0);
i2c_init();
}
um das TWSR auszugeben habe ich diese Zeile noch in die twimaster.c in die Funktion i2c_start(...) eingefügt:
uart_putc((unsigned char) twst);
mache ich irgendetwas falsch?
Danke an alle Helfenden
ich habe ein Problem mit dem Drehwinkel-Sensor AS5046 von austriamicrosystems. Kurz zur Vorerklärung, ich habe gerade angefangen meine Bachelorarbeit zu schreiben und dafür muss ich eine Firmware für einen AT90CAN128 schreiben.
Zum Aufbau: im Moment habe ich einen Microcontroller und an dessen I²C Bus einen Sensor. Später sollen mehrere Parallel hinzukommen.
Mein Problem besteht jetzt darin das alle Sensoren wegen eines vorherigen Projekts schon fertig auf Platinen aufgelötet sind, ich also nichts mehr an der Hardware ändern kann. Abgesehen von Sensor runter löten, Leitungen weg kratzen und Workaround legen.
Hier die Belegung des Sensors auf der Platine:
Pin 1 (MAGRNGN) > GND
Pin 2 (Mode) > NC
Pin 3 (CSN) > GND
Pin 4 (SCL) > SCL µC
Pin 5 (NC0) > NC
Pin 6 (SDA) > SDA µC
Pin 7 (VSS) > GND
Pin 8 (PROG) > GND
Pin 9 (DACREF) > GND
Pin 10 (DACOUT) > NC
Pin 11 (FB) > 1/2 VOUT mittels Spannungsteiler
Pin 12 (VOUT) > über 2x30kOhm gegen GND
Pin 13 (NC2) > NC
Pin 14 (NC1) > NC
Pin 15 (VDD3V3) > über C 1µ gegen GND
Pin 16 (VDD5V) > +5V
Mein Problem ist jetzt das ich den Sensoren wegen I²C eine Adresse zuweisen muss. Mein Betreuer meinte das die noch nichts an den Adressen geändert haben weil sie es nicht brauchten. Wie kann ich den Sensoren eine eigene Adresse zuweisen? Geht das wirklich nur über die OTP Programmierung? Oder hab ich im Datenblatt etwas übersehen? OTP wird nämlich schwierig da der PROG Pin und der CSN Pin auf GND liegen.
Dann habe ich jetzt erst einmal versucht nur einen Sensor am Bus zu betreiben, um das Datenauslesen zu Programmieren. Ich benutze die ungeänderte I²C lib von Peter Fleury. Da hab ich jetzt aber das Problem das mir der Sensor auf keine Adresse ein ACK gibt. die Standard Adresse müsste doch die 50h sein wenn ich das im Datenblatt richtig verstanden habe oder? Hab dann aus Verzweiflung mal alle 127 Adressen ausprobiert aber nichts passiert. Das TWSR gibt mir immer nur NACK als Status zurück.
Hier ist mein Programm:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "uart.h"
#include "i2cmaster.h"
void init_all();
int main()
{
init_all();
while(1)
{
for(ad = 0x00; ad <= 0xFE; ad = ad + 2)
{
if( i2c_start((unsigned char) ad));
uart_putc((unsigned char) ad);
i2c_stop();
_delay_ms(1000);
}
}
return 0;
}
void init_all()
{
unsigned int ubrr = 8;
uart_init(ubrr);
DDRD |= (1<<PD1) | (1<<PD0);
PORTD |= (1<<PD1) | (1<<PD0);
i2c_init();
}
um das TWSR auszugeben habe ich diese Zeile noch in die twimaster.c in die Funktion i2c_start(...) eingefügt:
uart_putc((unsigned char) twst);
mache ich irgendetwas falsch?
Danke an alle Helfenden