Hallo Hannes,
auf ein Neues!!!
Ich habe deine Hinweise beachtet und die beiden Dateien eingebunden. Dann habe ich mein kleines Projekt geschrieben. Es wurde fehlerfrei compiliert. Allerdings liest der Nibo2 nicht die Werte des Gyros.
Ich dachte mir, vielleicht liegt es daran, dass die vorher vorhandenen i2c-Routinen für den eingebauten Abstandsmesser nds3 nicht mehr vorhanden sind. Habe also folglich die alten i2c-Dateien wieder eingebunden (wie es vorher war) und die neuen i2c-Dateien namenlich angepasst (i2c__master.h und die Routine i2c__init), damit nichts kollidiert.
Es wird fehlerfrei compiliert, aber in der Textausgabe zum Schluss kommt nichts an. Wenn ich den Zugriff auf den Sensor auskommentiere (siehe Code), dann wird die Textausgabe (stellvertretend mit x=5, y=6, z=7) geschrieben.
Nun bin ich mit meinem Latein wieder mal am Ende und bitte dich um Hilfe.
Code:
/* Nibo2-Programm Test_Gyro_I2C, erstellt von Klaus Beutel im Februar 2020 */
/********************** Bibliotheken einbinden ******************************************************/
#include <math.h>
#include <stdio.h> // Standardein- und -ausgabefunktionen
#include <avr/interrupt.h> // Interrupts ermöglichen
#include <stdlib.h> // notwendig u.a. für die abs-Funktion
#include <nibo/niboconfig.h> // Konfiguration der Nibo-Bibliothek
#include <nibo/display.h> // Ansprechen eines Displays
#include <nibo/gfx.h> // Ansteuerung eines LC-Grafik-Displays
#include <nibo/spi.h> // Kommunikation über SPI.
#include <nibo/copro.h> // Ansprechen des Coprozessors
#include <nibo/delay.h> // Warteschleifen
#include <nibo/iodefs.h> // Zuordnung der physikalischen Pins zu symbolischen Namen
#include <nibo/bot.h> // allgemeine Funktionen des Roboters
#include "i2c__master.h" // Kommunikation ueber den I2C Bus
#include <nibo/pwm.h> // Erzeugung der PWM-Signale und der Systemzeit.
#include <nibo/leds.h> // Ansteuerung der LEDs
#include <nibo/i2cmaster.h> // Kommunikation ueber den I2C Bus
#include <nibo/nds3.h> // Kommunikation mit dem NDS3 Modul
/************************* Konstante definieren *****************************************************/
#define gyroaddr 0x0D // i2c-Adresse für HMC5883
/************************* Globale Variable definieren **********************************************/
char text[22] = " "; // Text-Ausgabe-Buffer
uint16_t x,y,z; // triple axis data
/************************* Hauptprogramm ************************************************************/
int main()
{
/********************** Initialisierung *************************************************************/
sei(); // Interrupts global erlauben
bot_init(); // Controller reseten
leds_init(); // LEDs initialisieren
pwm_init(); // PWM-Kanäle initialisieren
display_init(2); // Display initialisieren
spi_init(); // SPI initialisieren
gfx_init(); // Graphikdisplay initialisieren
i2c_init(); // i2c-Bus initialisieren
nds3_init();
i2c__init();
/********************* Lokale Variable definieren ***************************************************/
/****************************************************************************************************/
nds3_move(82); // nds3 auf Null-Position
leds_set_displaylight(1024); // Display-Hintergrundsbeleuchtung einschalten
gfx_set_proportional(0); // Schrift auf normal setzen
gfx_move(0, 50);
gfx_print_text("S3: Start");
while (PIND&(1<<4)) // warten auf Betätigung von S3 zum Starten
{
delay(250); // alle grünen LEDs blinken
PORTC=0xFF;
delay(250);
PORTC=0x00;
}
gfx_fill(0x00); // Display leeren
gfx_move(0, 0);
gfx_print_text(" x y z");
/* i2c_start(gyroaddr+I2C_WRITE); // set device address and write mode
i2c_write(0x09); // write address = 9
i2c_write(0x1D); // Define OSR = 512, Full Scale Range = 8 Gauss, ODR = 200Hz, set continuous measurement mode)
i2c_write(0x0A); // write address = 10
i2c_write(0x40); // The I2C data pointer will automatically roll, 6.Bit = 1 setzen
i2c_write(0x0B); // write address = 11
i2c_write(0x01); // Define Set/Reset period
i2c_stop(); // set stop conditon = release bus
*/
while (1) // Hauptschleife
{
/* i2c_start_wait(gyroaddr+I2C_WRITE); // set device address and write mode
i2c_write(0x00); // write address = 0
i2c_rep_start(gyroaddr+I2C_READ); // set device address and read mode
x = i2c_readAck()<<8; // read one byte from address 0 MSB x
x |= i2c_readAck(); // " " " " " 1 LSB x
y = i2c_readAck()<<8; // " " " " " 2 MSB y
y |= i2c_readAck(); // " " " " " 3 LSB y
z = i2c_readAck()<<8; // " " " " " 4 MSB z
z |= i2c_readNak(); // " " " " " 5 LSB z
i2c_stop(); // set stop condition = release bus
*/ x=5;
y=6;
z=7;
gfx_move(0, 10);
sprintf(text,"-> %04d %04d %04d", x, y, z);
gfx_print_text(text);
}
return 0;
}
Gruß
Klaus
P.S.: Die Adressen habe ich aus dem Datenblatt des IC entnommen. Vielleicht liegt ja da der Fehler?!?
Lesezeichen