pbRAM - mehr RAM f

Atmel, PIC, VEX, Fischertechnik

Moderator: Moderatoren

Benutzeravatar
Sebi
Administrator
Administrator
Beiträge: 1946
Registriert: 11. Jan 2008 14:28
Wohnort: Aub
Kontaktdaten:

Beitragvon Sebi » 12. Mai 2010 21:20

Hat dafür jemand einen kleinen NXC Code? Schreiben klappt, aber lesen klappt nicht...

Benutzeravatar
Bertolego
Moderator
Moderator
Beiträge: 773
Registriert: 16. Mai 2006 18:27
Wohnort: NRW

Beitragvon Bertolego » 13. Mai 2010 17:06

Den allerersten I2C-NXC Code in der Welt hast du wohl erschaffen!
Ansonsten würden hier ja Beispielcodes ohne Ende gezeigt.... :D

Mit I2C und NXC habe ich mich noch nicht beschäftigt.

Zeig mal deinen Schreib-Code, dann ist die Einstiegshürde für NXC nicht so gross!
(Portbelegung, I2C Adresse, Command-Byte u.ä...)
Dann sollte das Lesen auch kein Problem mehr sein! :)

Benutzeravatar
Sebi
Administrator
Administrator
Beiträge: 1946
Registriert: 11. Jan 2008 14:28
Wohnort: Aub
Kontaktdaten:

Beitragvon Sebi » 13. Mai 2010 18:57

Ich habe das ganze mit einem ATmega8 bzw. ATmega16 probiert, bei denen der Treiber ein EEPROM simuliert.
Lesen: (Versionsnummer lesen): (Funktioniert nur alle 20 Versuche, und dann auch nur ein einziges Byte)

Code: Alles auswählen

byte I2CMsg[];
byte nByteReady;
byte count;
string version="00.00.00";
string strbuf;
byte buf[7]={0,0,0,0,0,0,0};
task main()
{
 SetSensorLowspeed(S1);  /*
 ArrayBuild(I2CMsg,0xD0,0x01,0x02);
 while (I2CStatus(S1, nByteReady) == STAT_COMM_PENDING);
 I2CWrite(S1,3,I2CMsg);
 while (I2CStatus(S1, nByteReady) == STAT_COMM_PENDING);
 ArrayBuild(I2CMsg,0xD0,0x03,0x04);
 while (I2CStatus(S1, nByteReady) == STAT_COMM_PENDING);
 I2CWrite(S1,3,I2CMsg);
 while (I2CStatus(S1, nByteReady) == STAT_COMM_PENDING);      */
 //buf[0]=13;
 while(true)
 {
 byte cnt = 0x02;
    byte I2CMsg[];
    byte inbuf[];
    byte Address = 0xD0;
    byte nByteReady = 0;
    int  result = -1;
    int loop;

    ArrayBuild(I2CMsg, Address);

    Wait(8);

    while (loop == STAT_COMM_PENDING) {

          loop = I2CStatus(S1, nByteReady);

    }

    if (I2CBytes(S1, I2CMsg, cnt, inbuf)) {

        result = inbuf[1];

    }
    if(result==-1){

     //TextOut(0, LCD_LINE7, "Error: Check the");
     //TextOut(0, LCD_LINE8, "   connection!");
     //Wait(500);
     //ClearScreen();
    }
    else
    {
     NumOut(0,0,result,false);
    }
    //Wait(100);
 /*
 //ArrayBuild(I2CMsg, 0xD0, 0x01);
 //NumOut(0,0,I2CMsg[0],false);
 while (I2CStatus(S1, nByteReady) !=  NO_ERR);
 buf=I2CRead(S1,1,I2CMsg);
 Wait(10);
 NumOut(0,0,I2CMsg[0],false);
 //int i=I2CMsg[0];
 //NumOut(0,0,i,false);
 //NumOut(18,0,I2CMsg[1],false);
 //NumOut(36,0,I2CMsg[2],false);
 
 NumOut(0,8,buf[0],false);
 NumOut(18,8,buf[1],false);
 NumOut(36,8,buf[2],false);
    /*
 Wait(100);
  count = 7;
  while (I2CStatus(S1, nByteReady) !=  NO_ERR);

  //while(!(I2CBytes(S1,I2CMsg, count, buf)));
  if(I2CBytes(S1,I2CMsg, count, buf)){
    strbuf=NumToStr(buf[0]);
      version = StrReplace(version,2-StrLen(strbuf),strbuf);
    NumOut(0,LCD_LINE1,buf[0],false);
    }

   ArrayBuild(I2CMsg, 0xD0,0x02);
  while (I2CStatus(S1, nByteReady) ==  STAT_COMM_PENDING);
  count = 1;
  if(I2CBytes(S1,I2CMsg, count, buf)) {
    strbuf=NumToStr(buf[0]);
      version = StrReplace(version,5-StrLen(strbuf),strbuf);
      NumOut(0,LCD_LINE2,buf[0],false);
  }
 
   ArrayBuild(I2CMsg, 0xD0,0x03);
  while (I2CStatus(S1, nByteReady) ==  STAT_COMM_PENDING);
  count = 1;
  if(I2CBytes(S1,I2CMsg, count, buf)) {
    strbuf=NumToStr(buf[0]);
      version = StrReplace(version,8-StrLen(strbuf),strbuf);
      NumOut(0,LCD_LINE3,buf[0],false);
  }
  TextOut(0,0,version,false);
  //while(true);  */
  } /*
  while(I2CRead(S1,7,buf))
  {
  }
  NumOut(0,0,buf[0],false);
  NumOut(0,8,buf[1],false);
  NumOut(0,16,buf[2],false);
  NumOut(0,24,buf[3],false);
  NumOut(0,32,buf[4],false);
  NumOut(0,40,buf[5],false);
  while(true);          */
 
}

Schreiben:(16*2 LCD + Atmega 8): (Klappt fast, blos das 2. Byte wird nicht richtig übertragen...)
EDIT: Der Fehler lag irgendwo anders. Das funktioniert jetzt.

Code: Alles auswählen

#define lcdadd 0x00
#define lcdport S1
byte I2CMsg[];
byte nByteReady;
int i;
void WriteI2C(byte address, byte regist, byte command)
{
 ArrayBuild(I2CMsg,address,regist,command);
 while (I2CStatus(lcdport, nByteReady) == STAT_COMM_PENDING);
 I2CWrite(lcdport,3,I2CMsg);
 while (I2CStatus(S1, nByteReady) == STAT_COMM_PENDING);
 NumOut(0,64-(i*8),I2CMsg[1],false);
 NumOut(18,64-(i*8),regist,false);
 
 NumOut(38,64-(i*8),I2CMsg[2],false);
 NumOut(65,64-(i*8),command,false);
 
 i++;
}
/*
            case 0x01: lcd_init(); break; //LCD starten
            case 0x02: lcd_clear(); break; //LCD Inhalt löschen
            case 0x03: lcd_home(); break;  //Cursor zu (0,1)
            case 0x04: set_cursor(i2cdata[0x05],i2cdata[0x06]); break;//Cursor setzen
            case 0x07:                   //Register 0x1X auf LCD schreiben
               while((i2cdata[0x10+i]<<7>15)  //Solang wiederholen bis
               {
                  lcd_data(aitoc(i2cdata[0x10+i]));//register(i) auf LCD schreiben
                  i++;
                  i2cdata[0x0F+i]=0x00;//löschen
               }
               break;
*/
void lcd_init()
{
 WriteI2C(lcdadd,0x10,0x01);
 
 //WriteI2C(lcdadd,0x01,0x00);
}
void lcd_clear()
{
 WriteI2C(lcdadd,0x10,0x02);

 //WriteI2C(lcdadd,0x01,0x00);
}
void lcd_home()
{
 WriteI2C(lcdadd,0x10,0x03);

 //WriteI2C(lcdadd,0x01,0x00);
}
void set_cursor(char x, char y)
{
 WriteI2C(lcdadd,0x10,0x04);
 WriteI2C(lcdadd,0x05,x);
 WriteI2C(lcdadd,0x06,y);
}
void lcd_string(string writestring)
{
 int i=0;
 while(i<StrLen(writestring))
 {
  WriteI2C(lcdadd,0x00+i,(StrIndex(writestring,i))+128);
  i++;
 }
 WriteI2C(lcdadd,0x10,0x07);
}
task main()
{
 SetSensorLowspeed(S1);
 ClearScreen();
 lcd_init();
 Wait(1000);
 
 lcd_string("hello wordl!");
 while(true);
}

µC Treiber ist der hier: http://www.rn-wissen.de/index.php/TWI_Slave_mit_avr-gcc (Slave)
Zuletzt geändert von Sebi am 18. Mai 2010 17:24, insgesamt 1-mal geändert.

panzertape1994
Weniger als 15 Beiträge
Weniger als 15 Beiträge
Beiträge: 16
Registriert: 17. Jun 2009 16:58
Wohnort: Weidenhahn
Kontaktdaten:

Beitragvon panzertape1994 » 14. Mai 2010 16:35

Hallo,
ich habe das jetzt hier alles mal gelesen. Währe es nicht naheligend da die NXT Firmware ja open source ist eine extra Firmware zu schreiben. Da könnte man ja im menü noch einen extra Menüpunkt hinzufügen aus dem man die Programme im eeprom Starten kann. So könnten denn auch die leute die NXT-G und NXC verwenden Programme im eeprom speichern.

MFG
Panzertape1994
Alle Geräte funktionieren mit Rauch. Klingt komsich ist aber so, denn wenn Rauch rauskommt, funktionieren sie nicht mehr.

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5257
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Beitragvon HaWe » 23. Mai 2010 19:18

jo, super Idee, mach mal eben schnell!
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E


Zurück zu „allgemeine / Nicht-Lego-Robotik und Elektronik“

Wer ist online?

Mitglieder in diesem Forum: Yahoo [Bot] und 16 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss