RoboterCC - Robotic Code Compiler
Forum Robot Kits NIBO 2 NIBO2 - ARDUINO

Welcome

Nachrichten

Sie sind nicht eingeloggt.

Werbung

Letzte Themen

  • Keine Beiträge vorhanden

Site-Statistic

  • 7432 private projects
  • 378 public projects
  • 16179195 lines compiled
  • 58194 builds
NIBO @ facebook YouTube Twitter
Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:

THEMA: NIBO2 - ARDUINO

NIBO2 - ARDUINO 10 Jahre 6 Monate her #2769

  • workwind
  • workwinds Avatar
  • OFFLINE
  • Administrator
  • Beiträge: 573
Hallo Egon,

da brauchst Du Dir keine Sorgen machen, das Urschleim-C begleitet mich schon seit 25 Jahren.... Die Lib wird es natürlich weiterhin für "pures" C geben! Durch die Zusammenfassung zu einem Projekt ist sogar sichergestellt dass die Updates pünktlich für alle Architekturen erscheinen.
Der Arduino Wrapper ist im weiteren Sinn nur eine C++ Kapselung die der Arduino Philosophie angepasst wurde.
Die Arduino Philosophie besteht dabei aus der Methode "void begin()" zur Initialisierung eines Objekts, fertigen Klassen-Instanzen die automatisch konstruiert wurden (NIBO2, Engine etc...), und bei Textausgaben eine Ableitung der Klasse "Print"

@mifritscher:
die fehlende p Variante trage ich im avrdude-Repository nach - wird wohl noch ein bisschen dauern bis das bei Arduino ankommt ;-) ...
Dann ist die Anwendung von Gewalt bis dahin alternativlos :-(

Der Wrapper für I²C wäre natürlich schön, denn dort kann man ja gerade verschiedene Sachen anschliessen. Der Code kann integriert werden, in dem man folgendes Konstrukt verwendet:
#ifdef ARDUINO
  // ARDUINO Code-Version
#else
  // Standard Code-Version
#endif

-workwind-
Der Administrator hat öffentliche Schreibrechte deaktiviert.

NIBO2 - ARDUINO 10 Jahre 6 Monate her #2770

  • Georg
  • Georgs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 290
Hallo Workwind,

ich habe die C++ - Beispiele der NIBO2 - Lib im Programmer's Notpad kompiliert.
Beim stringtest.cpp erhält man folgende Fehlermeldung:

> "make.exe" all
makefile:68: stringtest.d: No such file or directory
set -e; avr-gcc -MM stringtest.cpp \
| sed 's#\(stringtest\)\.o[ :]*#\1.o stringtest.d : #g' > stringtest.d ; \
[ -s stringtest.d ] || rm -f stringtest.d
avr-g++ -Os -ffunction-sections -DAVR -I../../../include -mmcu=atmega128 -DF_CPU=16000000 -DVERSION="\"\"" -D_NIBO_2_ -c stringtest.cpp -o stringtest.o
In file included from stringtest.cpp:8:
../../../include/nibocc/graphicdisplay.hpp:155: error: 'bitmap_t' has not been declared
../../../include/nibocc/graphicdisplay.hpp: In static member function 'static void nibocc::Graphicdisplay::draw_bitmap(int*)':
../../../include/nibocc/graphicdisplay.hpp:155: error: '::gfx_draw_bitmap' has not been declared
make.exe: *** [stringtest.o] Error 1

> Prozess beendet. Code:2
> Dauer:00:01

LG
Georg
Der Administrator hat öffentliche Schreibrechte deaktiviert.

NIBO2 - ARDUINO 10 Jahre 5 Monate her #2785

  • Georg
  • Georgs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 290
Hallo Workwind,

ich möchte die "Wire Lib" beim NIBO2-Arduino, als I2C-Master,einbinden,
um mit einem Atmega328P als I2C-Slave zu kommunizieren.
Ist dies in naher Zukunft möglich?

LG
Georg
Der Administrator hat öffentliche Schreibrechte deaktiviert.

NIBO2 - ARDUINO 10 Jahre 5 Monate her #2786

  • workwind
  • workwinds Avatar
  • OFFLINE
  • Administrator
  • Beiträge: 573
Hallo Georg,

prinzipiell sollte es kein Problem sein die Wire Lib zu verwenden - hast Du das denn schon mal ausprobiert?

Zu deinem vorigem Beitrag: Die C++ Beispiele aus der nibocc Version haben nichts mit der Arduino-Version zu tun...

-workwind-
Der Administrator hat öffentliche Schreibrechte deaktiviert.

NIBO2 - ARDUINO 10 Jahre 5 Monate her #2787

  • Georg
  • Georgs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 290
Hallo Workwind,

ich habe es gerade ausprobiert und es funktioniert: :clap: :clap: :clap:

Änderung:
In der Datei ../arduino-1.0.5/libraries/Nibo2/utility/i2cmaster.c
muss die ISR-Funktion (Zeile 167 - 228) kommentiert werden,
damit die Wire - Library funktioniert!


NIBO2:
#include <Wire.h>
#include <NIBO2.h>
#include <NIBO_GFX.h>
unsigned int x = 0;
unsigned int z = 0;
byte zl[2] = {0};
byte xl[2] = {0};
void setup() {
  NIBO2.begin();
  Wire.begin();
}
 
void loop() {
  NIBO2.setLed(0, LED_RED);
  delay(500);
  NIBO2.setLed(0, LED_GREEN);
  delay(500);
  Wire.beginTransmission(2); // transmit to device #2
  xl[0]= (byte)(x >> 8);    // x = 0 .. 100
  xl[1]= (byte)(x & 0xff);
  Wire.write(xl,2);         // sends two bytes 
  Wire.endTransmission();  // stop transmitting
  delay(10);
  x++;
  x %=101;
}

Atmega328P:
#include <Wire.h> // I2C Library

unsigned int x = 0;  // Vom I2C Master empfangener Wert (Bereich 0 .. 100) 
unsigned int z = 0;  // Hier berechnete Quadrate(x) werden zum Master zurück gesendet
byte zl[2] = {0};
byte xl = 0;
byte xh = 0;
 
void setup()
{
  Wire.begin(2);                // join i2c bus with address #2
 
   Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);  
}
 
 
void loop()
{
//delay(100);
}
 
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
 
void receiveEvent(int howMany)
{
  while(Wire.available()) // loop through all but the last
  {
          xh = Wire.read();    // receive byte as an integer
          xl = Wire.read();
          x = (int)(xh<<8)+ xl;
          Serial.print("Hbyte = ");
          Serial.print((byte)xh);
          Serial.print("  Lbyte = ");
          Serial.print((byte)xl);
          Serial.print("  Int = ");
          Serial.println((unsigned int)x);
          z = x * x;          
  }   
  delay(20);
}

LG
Georg
Letzte Änderung: 10 Jahre 5 Monate her von Georg.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

NIBO2 - ARDUINO 10 Jahre 5 Monate her #2788

  • Georg
  • Georgs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 290
Hallo,

die I2C-Kommunikation zwischen NIBO2 und Atmega328P funktioniert jetzt in beiden Richtungen:
NIBO2 sendet 0 .. 100 zum Slave. Dieser berechnet die Quadrate und sendet diese zum NIBO2 zurück.
Dort wird das Ergebnis auf dem LCD angezeigt:

In der Datei ../arduino-1.0.5/libraries/Nibo2/utility/i2cmaster.c
muss die ISR-Funktion (Zeile 167 - 228) kommentiert werden,
damit die Wire - Library funktioniert!


NIBO2-Code:
#include <Wire.h>
#include <NIBO2.h>
#include <NIBO_GFX.h>
unsigned int x = 0;
unsigned int x1 = 0;
unsigned int z = 0;
byte zl[4] = {0};
byte xl[2] = {0};
char text[22] = "                     ";
void setup() {
  NIBO2.begin();
  GFX.begin();
  Wire.begin();
  NIBO2.setDisplayIntensity(1024);
}
 
void loop() {
  NIBO2.setLed(0, LED_RED);
  delay(500);
  NIBO2.setLed(0, LED_GREEN);
  delay(500);
// Sende 0 bis 100 zum Slave  
  Wire.beginTransmission(2); // transmit to device #2
  xl[0]= (byte)(x >> 8);    // x = 0 .. 100
  xl[1]= (byte)(x & 0xff);
  Wire.write(xl,2);         // sends two bytes 
  Wire.endTransmission();  // stop transmitting
  delay(10);
  x++;
  x %=101;
 
 //Der Slave berechnet aus den empfangenen Zahlen das Quadrat
 // und sendet es zum Master zurück
  Wire.requestFrom(2, 4);    // request 2 bytes from slave device #2  
 
  if (Wire.available()) 
  {
    zl[0] = (byte)Wire.read();
    zl[1] = (byte)Wire.read();
    zl[2] = (byte)Wire.read();
    zl[3] = (byte)Wire.read();
  }
  z = (((int)(zl[0]<<8)) | ((int) zl[1]));
  x1 = (((int)(zl[2]<<8)) | ((int) zl[3]));
 
 //Ausgabe auf dem LCD
 GFX.term.clear();
 GFX.move(0,0);
 sprintf(text,"%3i * %3i = %5i",x1,x1,z);
 GFX.print_text(text);   
}

Atmega328P-Code:
#include <Wire.h> // I2C Library

unsigned int x = 0;  // Vom I2C Master empfangener Wert (Bereich 0 .. 100) 
unsigned int z = 0;  // Hier berechnete Quadrate(x) werden zum Master zurück gesendet
byte zl[4] = {0};
byte xl[2] = {0};
char text[20] ="                   ";
void setup()
{
  Wire.begin(2);                // join i2c bus with address #2
 
  Wire.onRequest(requestEvent); // register event
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);  
}
 
 
void loop()
{
//delay(100);
}
 
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent()
{  
   zl[0]= (byte)(z >> 8);
   zl[1]= (byte)(z & 0xff);
   zl[2]= (byte) xl[0];
   zl[3]= (byte) xl[1];
   Wire.write(zl,4); // respond with message of 6 bytes
   sprintf (text,"%3i * %3i = %5i",x,x,z);
   Serial.println(z);
   delay(20);
} 
void receiveEvent(int howMany)
{
  byte i = 0;
  while(Wire.available()) // loop through all but the last
  {
          xl[i++] = Wire.read();    // receive byte as an integer
  }
  x = (int)(xl[0]<<8)+ xl[1];
  z = x * x;  
  delay(20);
}
 

LG
Georg
Der Administrator hat öffentliche Schreibrechte deaktiviert.
Ladezeit der Seite: 0.201 Sekunden

Werbung