- LiTime Speicher und Akkus         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 36

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

  1. #21
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #22
    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 21:43 Uhr)

  3. #23
    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

  4. #24
    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.

  5. #25
    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

  6. #26
    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 11:14 Uhr)

  7. #27
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Zuletzt hat SlyD doch gesagt, dass das nach ganz oben muss?!
    Nein nicht nach ganz oben natürlich das was ich davor gesagt hatte galt natürlich immer noch also innerhalb der IF Bedingung nach oben.


    Zum Repeated Start:
    OK passt schon so.


    Problem ist also die Lesefunktion; Anscheinend macht die Probleme.
    Beim read Aufruf wird wieder ein Start gesendet.
    Check das auch mal auf dem Oszi - eigentlich müssten dann da zwei Starts hintereinander kommen.

    Deswegen meinte ich auch das da noch bisschen was anderes geändert werden müsste und das alles eben in EINE transaktion gehört (sprich: einen Funktionsaufruf in der Lib - der Rest wird dann in der Lib gemacht).

    Deswegen müsste man da eigentlich noch einen weiteren Zustand in task_I2CTWI einführen - eben für request mit Rep start und da dann kein 1<<TWSTA mehr setzen.

    Ggf. könnte mans auch von dem no_rep_start flag abhängig machen (und es dann nach dem TWCR aufruf da zurücksetzen) und die vorhandenen benutzen aber k.a. ob dann noch alle anderen Funktionen ordnungsgemäß laufen. Dann ginge es wie bisher mit zwei Aufrufen.
    (allerdings nicht mit readRegisters wie Du das oben gemacht hast)



    MfG,
    SlyD

  8. #28
    Das sieht auf dem Oszi jetzt mit dem Code:
    Code:
    void getIR(void)
    {
      I2CTWI_transmitByte_RepeatedStart(0x55<<1,0x07);
      uint8_t irmsb = I2CTWI_readByte(0x55<<1);
      //[...] Weitere Bearbeitung der Variablen, keine weiteren Abfragen
    }
    so aus:
    Klicke auf die Grafik für eine größere Ansicht

Name:	MLX90614_RP6_0x55<<1_2_Error.jpg
Hits:	4
Größe:	54,0 KB
ID:	21623
    Das sind aber keine zwei Starts, oder?
    Grüße
    teamohnename

    EDIT:
    Müsste man also bei task_i2c eine neue else if Abfrage und einen neuen TWI TRANSMISSION STATE hinzufügen, der dann in der neuen Frage abgefragt wird? Also z.B.
    Code:
    //in RP6I2CMasterTWI.h
    #define I2CTWI_REQUEST_BYTES_REP_START 4
    
    //in task_i2c
    else if (TWI_operation == I2CTWI_REQUEST_BYTES_REP_START) {
      no_rep_start = 1;
      I2CTWI_delay();
      TWI_msgSize = I2CTWI_request_size + 1;
      I2CTWI_request_adr = I2CTWI_request_adr | TWI_READ;
      I2CTWI_buf[0]  = I2CTWI_request_adr | TWI_READ; 
      TWI_statusReg.all = 0;
      TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO);	
      TWI_operation = I2CTWI_READ_BYTES_FROM_BUFFER;
    }
    Wo muss dann TWI_operation auf 4 gesetzt werden? In einer Read Funktion?

    EDIT2:
    Wir kommen gerade überhaupt nicht weiter... Wir glauben auch nicht wirklich, dass das irgendetwas mit einem zweiten Start zu tun haben könnte...
    Was muss jetzt genau wo ergänzt werden? Ist wenigstens unser Ansatz richtig?
    Sorry für die Nerverei... Aber anders kommen wir nicht weiter, die ganze RP6 Lib ist ohne diese Erklärungen viel zu komplex für uns...

    EDIT3:
    Unser task_i2c sieht bis jetzt so aus:
    Alles Fett gedruckte haben wir geändert.
    Code:
    void task_I2CTWI(void)
    {
    	if (!I2CTWI_isBusy()) {
    		if (TWI_statusReg.lastTransOK) {
    			if(TWI_operation) {
    				if(TWI_operation == I2CTWI_SEND_REGISTER) {
    					I2CTWI_delay();
    					TWI_msgSize = 2;
    					I2CTWI_buf[0] = I2CTWI_request_adr;
    					I2CTWI_buf[1] = I2CTWI_request_reg;
    					TWI_statusReg.all = 0;
    					TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO);
    					if(no_rep_start == 1)
    					{
    						TWI_operation = I2CTWI_REQUEST_BYTES;
    					}
    					else
    					{
    						TWI_operation = I2CTWI_REQUEST_BYTES_REP_START;
    					}
    				}
    				else if (TWI_operation == I2CTWI_REQUEST_BYTES_REP_START) {
      				I2CTWI_delay();
    				  TWI_msgSize = I2CTWI_request_size + 1;
    				  I2CTWI_request_adr = I2CTWI_request_adr | TWI_READ;
     				  I2CTWI_buf[0]  = I2CTWI_request_adr | TWI_READ; 
    				  TWI_statusReg.all = 0;
    				  no_rep_start = 1;
    					TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO);	
    				  TWI_operation = I2CTWI_READ_BYTES_FROM_BUFFER;
    				}
    				else if (TWI_operation == I2CTWI_REQUEST_BYTES) {
    					I2CTWI_delay();
    					TWI_msgSize = I2CTWI_request_size + 1;
    					I2CTWI_request_adr = I2CTWI_request_adr | TWI_READ;
    					I2CTWI_buf[0]  = I2CTWI_request_adr | TWI_READ; 
    					TWI_statusReg.all = 0;
    					TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO);	
    					TWI_operation = I2CTWI_READ_BYTES_FROM_BUFFER;
    				}
    				else if (TWI_operation == I2CTWI_READ_BYTES_FROM_BUFFER) { 
    					TWI_operation = I2CTWI_NO_OPERATION;
    					if(I2CTWI_requestID!=-1)
    						I2CTWI_requestedDataReadyHandler(I2CTWI_requestID);
    				}
    			}
    		}
    		else {
    			uint8_t errState = I2CTWI_getState();
    			if(errState != 0) {
    				TWI_operation = I2CTWI_NO_OPERATION;
    				TWI_statusReg.lastTransOK = 1;
    				I2CTWI_request_adr = 0;
    				I2CTWI_requestID = 0;
    				I2CTWI_request_size = 0;
    				I2CTWI_transmissionErrorHandler(errState);
    			}
    		}
    	}
    }
    Das ist unsere Transmit Funktion:

    Code:
    void I2CTWI_transmitByte_RepeatedStart(uint8_t targetAdr, uint8_t data)
    {
    	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
    	I2CTWI_delay();
    	TWI_msgSize = 2;
    	I2CTWI_buf[0] = targetAdr;
    	I2CTWI_buf[1] = data;
    	TWI_statusReg.all = 0;
    	no_rep_start = 0;
    	TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO);
    }
    Und das unsere Read Funktion:

    Code:
    uint8_t I2CTWI_readByte(uint8_t targetAdr)
    {
    	while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
    	I2CTWI_delay();
    	if(no_rep_start == 1)
    	{
    		TWI_operation = I2CTWI_REQUEST_BYTES;
    	}
    	else
    	{
    		TWI_operation = I2CTWI_REQUEST_BYTES_REP_START;
    	}
    	I2CTWI_request_adr = targetAdr;
    	I2CTWI_requestID = -1;
    	I2CTWI_request_size = 1;
    	while(TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
    	if (TWI_statusReg.lastTransOK)
    		return I2CTWI_recbuf[1];
    	else
    		return 0;
    }
    Die I2C ISR sieht so aus:

    Code:
    uint8_t no_rep_start;  //Wird ein Repeated start vom Slave benötigt?
    
    ISR (TWI_vect)
    {
    	static uint8_t TWI_bufPos = 0;
    	switch (TWSR)
    	{
    		case TWI_START:             // START has been transmitted  
    		case TWI_REP_START:         // Repeated START has been transmitted
    		  TWI_bufPos = 0;          // Set buffer pointer to the TWI Address location
    		case TWI_MTX_ADR_ACK:       // SLA+W has been transmitted and ACK received
    		case TWI_MTX_DATA_ACK:      // Data byte has been transmitted and ACK received
    		  if (TWI_bufPos < TWI_msgSize) {
    			TWDR = I2CTWI_buf[TWI_bufPos++];
    			TWCR = (1<<TWEN)|                                 // TWI Interface enabled
    				   (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to send byte
    				   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           //
    				   (0<<TWWC);                                 //  
    		  } else {                   // Send STOP after last byte
    				TWI_statusReg.lastTransOK = 1;                 // Set status bits to completed successfully. 
    				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);                                //
    		  	}
    			}
    		  break;
    		case TWI_MRX_DATA_ACK:      // Data byte has been received and ACK transmitted
    		  I2CTWI_recbuf[TWI_bufPos++] = TWDR;
    		case TWI_MRX_ADR_ACK:       // SLA+R has been transmitted and ACK received
    		  if (TWI_bufPos < (TWI_msgSize-1) ) {                 // Detect the last byte to NACK it.
    			TWCR = (1<<TWEN)|                                 // TWI Interface enabled
    				   (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to read next byte
    				   (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // Send ACK after reception
    				   (0<<TWWC);                                 //  
    		  } else {                   // Send NACK after next reception
    			TWCR = (1<<TWEN)|                                 // TWI Interface enabled
    				   (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to read next byte
    				   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // Send NACK after reception
    				   (0<<TWWC);                                 // 
    		  }    
    		  break; 
    		case TWI_MRX_DATA_NACK:     // Data byte has been received and NACK transmitted
    		  I2CTWI_recbuf[TWI_bufPos] = TWDR;
    		  TWI_statusReg.lastTransOK = 1;                 	// Set status bits to completed successfully. 		 
    		  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);                                 //
    		  break;      
    		case TWI_ARB_LOST:          // Arbitration lost
    		  TWI_TWSR_state = TWSR;  							// Store TWSR 	
    		  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);                               //
    		  break;
    		default:     
    		  TWI_TWSR_state = TWSR;                     		// Store TWSR 					
    		  TWCR = (1<<TWEN)|                                 // Enable TWI-interface and release TWI pins
    				 (0<<TWIE)|(1<<TWINT)|                      // Disable Interupt
    				 (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|           // No Signal requests
    				 (0<<TWWC);  
    		break;
    	}
    }
    Und so unsere Funktion zum Abfragen des Sensors:
    Code:
    void getIR(void)
    {
    	I2CTWI_transmitByte_RepeatedStart(0x55<<1,0x07);
    	uint8_t irmsb = I2CTWI_readByte(0x55<<1);
    }
    So sieht das auf dem Oszilloskop aber immer noch aus, wie bei dem Bild in diesem Post oben.
    Was muss noch geändert werden?
    Geändert von teamohnename (26.02.2012 um 15:43 Uhr)

  9. #29
    So, wir sind einen Schritt weiter - allerdings wissen wir ab jetzt wirklich nicht mehr weiter:
    Wenn man in unserer neuen else if Abfrage in task_i2c das hier:

    Code:
    TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO);
    zu dem:

    Code:
    TWCR = (1<<TWEN)|(1<<TWIE)|(0<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO);
    ändert, können wir damit:

    Code:
    I2CTWI_transmitByte_RepeatedStart(0x55<<1,0x07);
    uint8_t irmsb = I2CTWI_readByte(0x55<<1);
    und damit (bewirkt das gleiche):

    Code:
    I2CTWI_transmitByte_RepeatedStart(0x55<<1,0x07);
    I2CTWI_readBytes(0x55<<1, sensorBuf, 1);
    das MSB abfragen - Juhu!
    ALLERDINGS: Das Programm bzw. die I2C Kommunikation stürzt ab, sobald das MSB 255 ist und sobald man zwei Bytes abfragen möchte, also hiermit:

    Code:
    I2CTWI_transmitByte_RepeatedStart(0x55<<1,0x07);
    uint8_t irmsb = I2CTWI_readByte(0x55<<1);
    uint8_t irlsb = I2CTWI_readByte(0x55<<1);
    und hiermit:

    Code:
    I2CTWI_transmitByte_RepeatedStart(0x55<<1,0x07);
    I2CTWI_readBytes(0x55<<1, sensorBuf, 2);
    Anscheinend wird ja mit TWINT das I2C Interrupt deaktiviert - sollte man vielleicht doch dort nach dem Fehler suchen?

    Danke und
    Viele Grüße
    teamohnename


    EDIT:
    Gerade mal das Bild am Scope pausiert, kurz bevor die Kommunikation abschmiert: Zum Schluss wird nach dem MSB ein Stop durchgeführt. Wenn das MSB 255 erreicht, wird SDA auf low gezogen, wo es vorher high war - liegt das am Slave oder wird ein Repeated Start durchgeführt?

    Hier zwei Bilder davon - einmal, solange der Wert unter 255 ist, danach, wenn er 255 ist, ein Bruchteil einer Sekunde nach Bild 2 stürzt alles ab.

    Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_1769.jpg
Hits:	2
Größe:	56,8 KB
ID:	21637Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_1771.jpg
Hits:	2
Größe:	52,5 KB
ID:	21638
    Geändert von teamohnename (26.02.2012 um 20:40 Uhr)

  10. #30
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Also TWINT darfste nicht deaktivieren sonst ist klar das bei zwei Bytes nix mehr funktioniert - der Empfang läuft ja in der Interrupt Routine! Das wird nur einmal zu beginn in der task_I2CTWI angestoßen.

    Die ISR wird ausserdem sobald der Rep Start ausgeführt wurde wieder aufgerufen und landet im state TWI_REP_START, da dort kein break ist läufts dann in die nächsten Zustände rein (ja ist absichtlich so).

    Ggf. setz doch mal no_rep_start=1 da in dem Zustand oder alternativ in der neuen if bedingung in DATA_ACK.

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Ä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, 15: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, 09:01
  3. 4x20 LCD und Peter Fleury
    Von hansbausn im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 27.01.2006, 18: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, 18: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, 11:05

Berechtigungen

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

LiFePO4 Speicher Test