-         

Ergebnis 1 bis 7 von 7

Thema: PC_I2C [robotikhardware.de] Slave antwortet nicht

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.01.2004
    Ort
    Erlangen, Bayern
    Alter
    35
    Beiträge
    253

    PC_I2C [robotikhardware.de] Slave antwortet nicht

    Anzeige

    Hi,
    habe mal wieder ein Problem mit enweder meinem Code oder der PC Software.

    Habe den slave wie folgt initialisiert:
    Code:
    DDRA = 0x00;								//set as input for address
    TWSR = 0x00;
    TWCR = 0x00;
    
    //A6 A5 A4 A3 A2 A1 A0 | GC
    TWAR = (TWI_ADDRESS<<1)|(1);				
    TWCR = _BV(TWEN)|_BV(TWEA);
    was meines Erachtens dem Datenblatt des ATMega16 entspricht.
    Danach stehe ich in einer for-Schleife..

    In der Interruptroutine steht:
    Code:
    SIGNAL(SIG_2WIRE_SERIAL){
    	uint8_t* pData=&task.ucCommand;
    	pData=&pData[DataCnt];
    	
       switch(TWSR){ 
    	    case(TW_SR_GCALL_ACK):			//==>
    	    case(TW_SR_SLA_ACK):			DataCnt=0;TWCR |= _BV(TWEA);break;//got my address
    
    		case(TW_SR_GCALL_DATA_ACK):	//==>
    		case(TW_SR_DATA_ACK):{
    			*pData=TWDR;
    			DataCnt++;
    			TWCR |= _BV(TWEA);			//ack
    		}break;
    		case(TW_SR_STOP):{
    		   if(DataCnt==sizeof(TCMD)){
    			   if(task.ucMAGIC_COOKIE==MAGIC_COOKIE)  	//minimum security must be
    				   ucProcess=true;
    			}
    			DataCnt=0;
    		}break;
    		
    		case(TW_SR_DATA_NACK):			//==>	
    		case(TW_SR_ARB_LOST_SLA_ACK):	//nack next byte, and reset my counter and wait for new start
    		case(TW_SR_ARB_LOST_GCALL_ACK)://==>
    		default:			DataCnt=0;TWCR &= ~_BV(TWEA);break;
    	}
       
       TWCR |=  _BV(TWINT);	//reset interrupt
    }
    Was auch nach bestem Wissen und Gewissen aus der Doku entnommen wurde.

    Slave Adresse ist 1

    Wenn ich nun im Basic-PC Tool send ID=1, d1=1, d2=2 eingebe wird meine Interruptroutine nicht angesprungen. Hat jemand bitte mal kurz Zeit sich das anzusehen?

    Gruss
    Michael

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    30
    Beiträge
    674
    bei der Inititalisierung des TWI musst du in TWCR auch das TWIE-Bit setzen, ansonsten wird garantiert kein Interrupt(die Routine dazu würde ich übrigens kürzer machen) ausgelöst

    weiterhin musst du beim Initialisieren auch das TWINT in TWCR auf 1 setzen und mittels "sei();" Interrupts global aktivieren, allerdings das erste nach dem "sei();", sonst geht es nicht

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.01.2004
    Ort
    Erlangen, Bayern
    Alter
    35
    Beiträge
    253
    Wie soll ich die Routine denn kürzer machen? Mehr als Empfangen und Speichern ist das ja schon garnicht...!?

    Das mit dem TWINT hab ich schon ausprobiert, allerdings vor dem sei()..hatte mich schon gewundert warum das Bit nicht gesetzt wird...

    Danke dir..
    Gruss Michael

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    30
    Beiträge
    674
    funkioniert es jetzt?
    ich hab mir die Interruptroutine nur ganz kurz angeschaut...die sah so lang aus, also hab ich das dazugeschrieben...wenns funktioniert, kannst du es natürlich so lassen

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.01.2004
    Ort
    Erlangen, Bayern
    Alter
    35
    Beiträge
    253
    Irgendwie funktioniert das immernochnicht...
    Das TWIE wird allerdings auch nicht gesetzt... zumindest sagt das das AVRStudio
    Code:
    	App_Init();							//io initialize
    	sei();								//enable interrupts
    
    	TWCR |= _BV(TWINT);
    in AppInit
    Code:
    	DDRA = 0x00;								//set as input for address
    	TWSR = 0x00;
    	TWCR = 0x00;
    	
    	TWAR = (TWI_ADDRESS<<1)|(1);				//A6 A5 A4 A3 A2 A1 A0 | GC
    	TWCR = _BV(TWEN)|_BV(TWEA)|_BV(TWIE);
    Gruss
    Michael

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.01.2004
    Ort
    Erlangen, Bayern
    Alter
    35
    Beiträge
    253
    AHHH..... das TWINT lässt sich patou nicht setzen... hab im Debugger einfach mal das Bit händisch gesetzt, aber sobald ich einen Step weiter mach mird es wieder gelöscht...

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.01.2004
    Ort
    Erlangen, Bayern
    Alter
    35
    Beiträge
    253
    Hab jetzt gerade mal ein anderes Projekt aus dem Netz kompiliert.
    Leider reagiert das auch nicht!
    Kann es was mit dem pc_i2c Dongle zutun haben?

    SCH*******
    Es war die Verkabelung!

    Noch eine Frage:
    Mit general Calls funktionierts jetzt hat jemand eine Ahnung warum nicht auch mit der normalen Adresse?

    -->Ah hat sich auch erledigt:
    im Adresseingabefenster muss das slave_w auf die Adresse draufgeodert werden.

    Danke

Berechtigungen

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