- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 50

Thema: Atmega8 als I2C Slave

  1. #21
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Anzeige

    Praxistest und DIY Projekte
    Du scheinst die Dateien im Ordner C:/Dokumente und Einstellungen/... liegen zu haben, richtig? Pfade mit Leerzeichen darin sind oft problematisch... Der Compiler sieht bei dir nur das "C:/Dokumente", abwe nicht den weiteren Pfad zu der Datei, die er kompilieren soll. Speicher den Kram mal woanders ab.

  2. #22
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Beiträge
    56
    Vielen Dank für den Tipp mit dem Pfad. Jetzt funktionieren die Makefiles.

    Mittlerweile bin ich in der Lage ein byte zu empfangen, anschließend hängt sich mein Master auf.

    Code:
    if (!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?
          {
    
             i2c_write(0x00); //Buffer Startadresse zum Auslesen
             i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen
    
                byte0= i2c_readAck();
    			if (byte0==25){
    PORT_REL1 |= (1 << PAD_REL1);
             wait_10ms(100);
    PORT_REL1 &= ~(1 << PAD_REL1);
    			}
                	
    
    //PORT_LED &= ~(1 << PAD_LED);
    
             i2c_stop();
          }
    Anschließend sollte eigentlich wieder eine LED blinken, was sie aber nicht tut.

  3. #23
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    An welcher Stelle genau klemmt es?

  4. #24
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Beiträge
    56
    Ich habe den Fehler gefunden. Das Problem war der Master. Man muss immernoch was schreiben, bevor man stoppen oder erneut was empfangen kann:
    Code:
    i2c_write(0x00); //Buffer Startadresse zum Auslesen
    
    i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen
    
    byte0= i2c_readAck();
    
    i2c_write(0xb0);
    
    byte1= i2c_readAck();
                	
    i2c_write(0xc5);
    
    i2c_stop();
    Anscheinend habe ich mittlerweile TWI verstanden

    Vielen Dank nochmal uwegw für deine Hilfe!
    Gruß, Werner

  5. #25
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    mmmh... komische Sache. Bei mir klappt alles einwandfrei, wenn ich erst den Schreibzugriff starte, die Startposition 0x00 schreibe, per repeated Start auf lesen schalte und dann Wert für Wert auslesen.

    Hast du in deinem Post von 16:29 den ersten Start beim kopieren weggelassen, oder fehlt der auch im Programm?

  6. #26
    Benutzer Stammmitglied
    Registriert seit
    13.06.2006
    Beiträge
    56
    i2c_start(SLAVE_ADRESSE+I2C_WRITE))

    Das habe ich nur im Forum weggelassen.

  7. #27
    Hallo,
    ich finde es super das hier der Quelltext für den i2c-slave steht.
    Natürlich habe ich den i2c-slave ausprobiert und er funktioniert eigentlich auch. Nur leider habe ich das Problem das nach einer Stopcondition der slave die sda-Leitung auf low zieht und nicht mehr frei gibt. Dadurch kann ich leider nur einmal Daten abrufen und dann nie wieder

    Wär schön wenn mir jemand mit dem Problem helfen könnte.

    mfg
    Heady

  8. #28
    Ach ja hat sich erledigt.
    Ich hab vergessen meinen master ein NOACK senden zu lassen -.-

  9. #29
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Sehr merkwürdig... Wenn nen Stop reinkommt (case TW_SR_STOP, wird die Übertragung beendet, der Bus freigegeben, und der Slave wartet darauf, dass er wieder adressiert wird.

    Ist es wirklich der Slave, oder klemmt es doch im Master? Wie sieht dein Master-Code aus?

    EDIT: schön, dass es jetzt klappt. Aber gib mir doch bitte mal deinen fehlerhaften Code, damit ich den Fehler im Slave eventuell abfangen kann...

  10. #30
    hmm ... hab den original Code momentan nicht hier. Aber er war ca. so:
    Code:
    int read_data(addr, subaddr, uint8 *data, uint8 cnt){
      uint8 i;
      ic2_start(addr+write);
      delay();
      i2c_write(sub_addr);
      if(!i2c_read_ack()){
        i2c_stop();
        return;
      }
      delay();
      i2c_start(addr+read);
      delay();
      for(i=0;i<cnt;i++){
        *(data++) = i2c_read();
        if(i<cnt-1) 
          i2c_write_ack(); //schreibt ein ACK
        delay();
      }
      i2c_stop();
      return i;
    }
    meine korrigierte Version ist:
    Code:
    int read_data(addr, subaddr, uint8 *data, uint8 cnt){
      uint8 i;
      ic2_start(addr+write);
      delay();
      i2c_write(sub_addr);
      if(!i2c_read_ack()){
        i2c_stop();
        return;
      }
      delay();
      i2c_start(addr+read);
      delay();
      for(i=0;i<cnt;i++){
        *(data++) = i2c_read();
          i2c_write_ack(i<cnt-1); //schreibt ein ACK wenn der Parameter 0 ist und NOACK wenn der Parameter 1 ist
        delay();
      }
      i2c_stop();
      return i;
    }
    Also ich hab es nach gemessen und es ist eindeutig der Slave der die Leitung runter zieht.
    Aber stimmt schon, eigentlich müsste der Slave einfach reseten und auf empfang gehen wenn eine stop-condition kommt. Und so wie ich das sehe sollte er das nach dem Quelltext auch tun. Wer weiß vielleicht ein bug im TWI

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests