-         

Ergebnis 1 bis 7 von 7

Thema: I2C / TWI Atmega32 und Atmega 644P vernetzen

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266

    I2C / TWI Atmega32 und Atmega 644P vernetzen

    Anzeige

    Hall zusammen
    ich versuche nun schon seit 2 Tagen die Kommunikation zwischen den beiden Controllern zum Laufen zu bringen und bin inzwischen dabei angelangt, dass ich direkt den Beispielcode aus dem Wiki (Twi Slave mit AVR-GCC) übernommen habe und um eine Ausgabe auf einem Display erweitert habe. Der funzt jedoch auch nicht.
    Pull Ups (4,7k) sind auch eingelötet.

    Hier noch der Code vom Master (Habe mal nur den Lesezugriff getestet)
    Code:
    uint8_t byte1 = 100;
    uint8_t byte2 = 43;
    uint8_t byte3 = 44;
    
    
    int main(void)
    {
    	
    
    	HintergrundBeleuchtungAn();
    	lcd_init(LCD_DISP_ON);
    
    	
    	i2c_init();         // init I2C interface
    
    
    		_delay_ms(1500);
    		lcd_gotoxy(12,1);
    		lcd_puts("Read");
    		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
    
     			byte1= i2c_readAck(); // Bytes lesen...
      			byte2= i2c_readAck();
      			byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK
      			i2c_stop();      
    			     // Zugriff beenden
    				 lcd_gotoxy(0,0);
    				 lcd_puts("SUCCES");
    
    				 				 char temp[4];
    				 lcd_gotoxy(0,1);
    				 lcd_puts(itoa(byte1, temp, 10));
    				 lcd_gotoxy(4,1);
    				 lcd_puts(itoa(byte2, temp ,10));
    				 lcd_gotoxy(7,1);
    				 lcd_puts(itoa(byte3, temp ,10));
    		} 
    		else
    		{
      				lcd_gotoxy(0,1);
    				lcd_puts("ERROR");	/* Hier könnte eine Fehlermeldung ausgegeben werden... */
    		}
    
    		if ((byte1 != 100)||(byte2 != 43)||(byte3 != 44))
    		{
    		  				lcd_gotoxy(0,1);
    				lcd_puts("ERROR_");
     			 /* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */ 
    		}
       			 for(;;);	
    		
    
    
    
    }
    Und der Code des Slaves

    Code:
    	init_twi_slave(SLAVE_ADRESSE);;
       		for(uint8_t i=0;i<i2c_buffer_size;i++)
    		{
    			i2cdata[i]=10+i * 3;
    		}
    
    	while(1)
    	{
    		for(uint8_t i=0;i<i2c_buffer_size;i++)
    		{
    			
    			SetPercentage(i2cdata[i]);
    			_delay_ms(500);
    		}
    
    	}
    SetPercentage ist eine Funktion die mir Werte zwischen 0 und 100 auf einer LED leiste ausgibt

    Weiß jemand was ich falsch mache ?

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    So hab nach gut 3 stunden Debugging und Ausprobieren das ganze etwas eingrenzen können.
    Das Schreiben funktioniert inzwischen, beim lesen hängt sich der Atmega 644
    auf nämlich dann wenn ich die Funktion:
    byte1= i2c_readAck();
    aufrufe.

    Irgendjemand ne Idee ?

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    Hm das klingt als hätte dein Master kein Timeout implementiert für Leseoperationen. Scheinbar antwortet der Slave nicht korrekt. Hast du den Slave-Code aus dem Wiki verändert?

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    Nein habe ich nicht,
    Aber ich hab das ganze jetzt anders gelöst. Hab einfach die TWI Library des RP6 verwendet

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    Hm ich hoffe ich werd nicht auch in diese Sackgasse rennen. Habe eigentlich vor, den Slave-Code aus dem Wiki in meiner Diplomarbeit zu benutzen. Naja aber das Problem sollte sich ja auch irgendwie lösen lassen. Hattest du dir das mal mit nem Oszilloskop angesehen?

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    hab ich, Beim Senden hat er das ganze ganz brav gemacht und beim Lesen, einmal kurz was gemacht und dann is das Signal auf 5V geblieben.

    Eventuell könntest du auch die RP6lib verwenden, laut der license ist zumindest der Teil "free software"

    * - LICENSE -
    * GNU GPL v2 (http://www.gnu.org/licenses/gpl.txt, a local copy can be found
    * on the RP6 CD in the RP6 sorce code folders!)
    * This program is free software. You can redistribute it and/or modify
    * it under the terms of the GNU General Public License version 2 as published
    * by the Free Software Foundation.

Berechtigungen

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