- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 36

Thema: Frage zu RP6 I2C Library: Funktionen der Lib von Peter Fleury?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Hi,
    wenn es ganz oben in task_I2CTWI steht, ist auch wieder alles wie vorher, also ohne Repeated Start...
    Was könnte denn noch geändert werden müssen? Wenn Du keine Zeit hast, ist das auch erstmal nicht so schlimm... Wir werden dann wohl noch etwas experimentieren müssen... Aber wenn Dir noch etwas einfällt; nur her damit!

    Vielen, vielen Dank für Deine Hilfe bis jetzt und
    Viele Grüße
    teamohnename

    Hier übrigens nochmal ein Bild vom Scope, wie es war, als das Nack kam:
    Klicke auf die Grafik für eine größere Ansicht

Name:	MLX90614_RP6_0x00_2_Error.jpg
Hits:	3
Größe:	52,9 KB
ID:	21622

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi,

    SlyD hatte gesagt, dass das no_rep = 1 nicht ganz oben in der task_I2CTWI, sondern nach if(TWI_operation) eingefügt werden soll:
    Code:
    void task_I2CTWI(void)
    {
     if (!I2CTWI_isBusy()) {
      if (TWI_statusReg.lastTransOK) {
       if(TWI_operation) {
        no_rep = 1;
    ...
    Probier das doch mal!
    Gruß
    Dirk

  3. #3
    Hi Dirk,
    danke für Deine Antwort.
    Zuletzt hat SlyD doch gesagt, dass das nach ganz oben muss?!
    Wenn ich das unter die Abfragen mache, kommt die Fehlermeldung und das, was ich zuletzt als Bild gepostet habe am Oszilloskop.
    Viele Grüße
    teamohnename

    EDIT:
    Anscheinend haben wir den Fehler gefunden, nachdem wir uns nochmal das Datenblatt angeschaut haben. Vorher war das so in der ISR:
    Code:
    TWCR = (1<<TWEN)|                                 // TWI Interface enabled
    (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
    (0<<TWEA)|(0<<TWSTA)|(no_rep_start<<TWSTO)|           // Initiate a STOP condition.
    (0<<TWWC);                                //
    Dabei würde aber ein Stop durchgeführt werden, wenn no_rep_start 1 ist. Wenn das 0 ist, passiert irgendwas anderes, auf jeden Fall kein Repeated Start, da ein Repeated Start nur durchgeführt wird, wenn das so aussieht:
    Code:
    TWCR = (1<<TWEN)|                                 // TWI Interface enabled
    (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
    (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|           // Initiate a REPEATED START condition.
    (0<<TWWC);                                //
    Jetzt haben wir das so in eine if-Abfrage gepackt:
    Code:
    if(no_rep_start == 1){
      TWCR = (1<<TWEN)|                                 // TWI Interface enabled
      (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
      (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|           // Initiate a STOP condition.
      (0<<TWWC);                                //
    }
    else{
      TWCR = (1<<TWEN)|                                 // TWI Interface enabled
      (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
      (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|           // Initiate a REPEATED START condition.
      (0<<TWWC);                                //
    }
    Jetzt wird definitiv ein repeated Start gesendet, nachdem die Leseanfrage gesendet wird, bricht der Slave aber mit einem Nack ab (Fehlercode 0x48).
    Woran könnte das liegen? Wahrscheinlich ja an der Lesefunktion, wenn man die ausklammert, ist der Fehler da nicht mehr. Was muss man da aber ändern?

    EDIT2:
    Das Nack liegt daran, dass no_rep_start nicht wieder auf 1 zurückgesetzt wird, nachdem es in der Transmit Funktion auf 0 gesetzt wurde.
    Woran liegt das? Vermutlich ja an task_i2c... Aber wo muss das jetzt genau hin?

    EDIT3:
    So haben wir den test durchgeführt:
    Code:
    void getIR(void)
    {
    	I2CTWI_transmitByte_RepeatedStart(0x55<<1,0x07);
    	while(no_rep_start == 0){} //hier bleibt der Code hängen
    	I2CTWI_readRegisters(0x55<<1, 0x07, sensorBuf, 3);
    	
    // This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte.
        //mlx90614_l = (((sensorBuf[1] & 0x007F) << 8) + sensorBuf[0]);
    }
    Wenn wir jetzt aber neben no_rep_start = 1 eine LED anschalten, geht diese an...
    Komisch.
    Geändert von teamohnename (25.02.2012 um 20:43 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi,

    müßte beim Rep-Start nicht auch TWIE auf 1 gesetzt werden?
    Gruß
    Dirk

  5. #5
    Hallo Dirk,
    anscheinend nicht, das steht so im Datenblatt:
    Code:
    A REPEATED START condition is generated by writing the following value to TWCR:
    TWCR      TWINT    TWEA    TWSTA    TWSTO    TWWC    TWEN       –        TWIE
    Value           1            X             1              0             X            1           0          X
    Grüße
    teamohnename

    EDIT:
    Ist wohl kein WYSIWYG Editor hier... Nichtmal in der Code Ansicht. Egal, steht im ATmega32 Datenblatt auf S. 184 fast ganz unten.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Stimmt, aber SlyD hat weiter unten das so gemacht:
    Code:
        TWCR = (1<<TWEN)|                                 // TWI Interface enabled
         (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag
         (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|           // Initiate a (RE)START condition.
         (0<<TWWC);                                 //
    Gruß
    Dirk

  7. #7
    Stimmt... Dann wird ein TWI Interrupt aktiviert. Wenn ich das aber so mache, schmiert das Programm auf dem RP6 ab. Wenn das Interrupt deaktiviert ist, bekomme ich die Fehlermeldung da.

    SlyD hat irgendwann hier im Thread gesagt, dass man ggf. bei einer Receive Funktion irgendwas im task_i2c ergänzen muss. Wahrscheinlich war das gemeint.
    Danke und
    Grüße
    teamohnename

    EDIT:
    Ich fasse nochmal das aktuelle Problem zusammen:
    Es wird jetzt ordnungsgemäß ein Repeated Start duchgeführt. Danach kommt aber eine Fehlermeldung, und zwar, dass der Slave mit einem Nack abgebrochen hat (Error 0x48). Diese Fehlermeldung kommt bei allen Read Funktionen, wobei es auch egal ist, welche Slave Adresse dort eingetragen wird. Wenn ich die Read Funktion weg lasse, kommt die Fehlermeldung nicht mehr, es wird immer noch ein Repeated Start gesendet (Repeated Start ist ja auch richtig, damit dürfte das mit dem Senden geklärt sein).
    Problem ist also die Lesefunktion. Was genau da nicht stimmt, weiß ich nicht. SlyD hat einmal gesagt, dass man evtl. noch eine Abfrage in task_i2c ergänzen muss...
    @SlyD: Vielleicht könntest Du kurz erläutern, was das Problem ist und wie man das dann entsprechend in task_i2c lösen kann?
    Geändert von teamohnename (26.02.2012 um 10:14 Uhr)

Ähnliche Themen

  1. LCD library von Peter Fleury ÄÖÜ fehlt
    Von Woftschik im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 18.04.2009, 14:31
  2. LCD an Mega8 mit Lib von Peter Fleury
    Von Mr Bean im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 04.10.2007, 08:01
  3. 4x20 LCD und Peter Fleury
    Von hansbausn im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 27.01.2006, 17:06
  4. Anfängerproblem mit i2c und Peter Fleury
    Von hansbausn im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 20.11.2005, 17:26
  5. Peter Fleury LCD Lib Problem mit LCD
    Von Cybrix im Forum C - Programmierung (GCC u.a.)
    Antworten: 13
    Letzter Beitrag: 30.09.2005, 10:05

Berechtigungen

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

LiFePO4 Speicher Test