Forum: Mikrocontroller und Digitale Elektronik Arduino Code übersetzen


von Pete K. (pete77)


Lesenswert?

Ich brauche mal eure Hilfe. Und zwar versuche ich den Arduino Code in
nicht-Arduino Code zu übersetzen.

Gegeben:
1
void RDA5807_ReadW(int i_cnt)
2
{
3
   Wire.beginTransmission(RDA5807_adrr);            // Device 0x11 for random access
4
   Wire.write(0x0C);                                // Start at Register 0x0C
5
   Wire.endTransmission(0);                         // restart condition
6
   Wire.requestFrom(RDA5807_adrr,2*i_cnt, 1);       // Retransmit device address with READ, followed by 8 bytes
7
   for (int i=0; i<i_cnt; i++)                      // Loop for Read data    
8
   {aui_RDS[i]=256*Wire.read()+Wire.read();}        // Read Data into Array of Unsigned Ints
9
   Wire.endTransmission();                  
10
}

Und hier meine Übersetzung mit Fleury Lib i2cmaster.h:
1
void RDA5807_ReadW(int i_cnt)
2
{  int readL, readH;
3
   char buffer[50];
4
5
   i2c_start(RDA5807_adrr);                    // Device 0x11 for random access
6
   i2c_write(0x0C);                                // Start at Register 0x0C
7
   i2c_rep_start(RDA5807_adrr+I2C_READ);                         // restart condition
8
   for (int i=0; i<i_cnt; i++)                      // Loop for Read data    
9
   {  readH=i2c_readNak();
10
      readL=i2c_readNak();
11
      aui_RDS[i]=256*readH+readL;
12
    sprintf(buffer,"Read: aui_RDS[%i]=%x\n",i,aui_RDS[i]);
13
    uart_puts(buffer);
14
15
    }        // Read Data into Array of Unsigned Ints
16
   i2c_stop();                  
17
}

Ich bekomme komische Werte heraus, daher ist meine Abfrage wohl falsch.
Read: aui_RDS[0]=18ff
Read: aui_RDS[1]=ffff
Read: aui_RDS[2]=ffff
Read: aui_RDS[3]=ffff

Da die Fleury_Lib mit 8-bit i2c-Adressen arbeitet, ist
RDA5807_adrr=0x11<<1;

von Pete K. (pete77)


Lesenswert?

Keiner?

von Thomas K. (thomas_k39)


Lesenswert?

Pete K. schrieb:
> {  readH=i2c_readNak();
>       readL=i2c_readNak();

Hier müsste es doch i2c_readAck heissen!

In der Dokumentation der Library steht, dass nach i2c_readNak eine 
Stop-Condition folgt, du willst aber noch mehr Daten abholen.

von Joachim B. (jar)


Lesenswert?

Thomas K. schrieb:
> Hier müsste es doch i2c_readAck heissen!

ganz genau

nur das letzte abzuholende Byte bekommt readNak();

hier mal 2 Byte aus der RTC für Temperatur:
1
  i2c_start_wait(DS3231+I2C_WRITE);  // set device address and write mode
2
  i2c_write(MSB_TEMP);
3
  i2c_rep_start(DS3231+I2C_READ);     // set device address and read mode
4
  __temp=i2c_readAck();
5
  __temp<<=8;
6
  __temp|=i2c_readNak();
7
  i2c_stop();
8
  __temp>>=6;

von jjflash (Gast)


Lesenswert?

am Mittwoch bin ich wieder zu Hause... wenn du magst, kann ich dir ein 
Demoprogramm für den Atmega168 und dem Rda5807 aus einem Radio von mir 
extrahieren.... ist für den AVR-GCC geschrieben...

von Pete K. (pete77)


Lesenswert?

jjflash schrieb:
> am Mittwoch bin ich wieder zu Hause... wenn du magst, kann ich dir ein
> Demoprogramm für den Atmega168 und dem Rda5807 aus einem Radio von mir
> extrahieren.... ist für den AVR-GCC geschrieben...

Hallo jjflash,
wie kann ich zu dem Angebot nein sagen. :-)

Vielen Dank auch den anderen für dem Hinweis mit dem Nak/Ack.

Vielen Dank,
Pete77

von Pete K. (pete77)


Lesenswert?

Hallo jjflash,

bin immer noch an dem Code interessiert :-)

VG Pete77

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.