PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PC_I2C [robotikhardware.de] Slave antwortet nicht



FoCus
18.03.2005, 20:18
Hi,
habe mal wieder ein Problem mit enweder meinem Code oder der PC Software.

Habe den slave wie folgt initialisiert:


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:


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

Pascal
18.03.2005, 21:38
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

FoCus
19.03.2005, 11:42
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

Pascal
19.03.2005, 12:46
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

FoCus
19.03.2005, 14:11
Irgendwie funktioniert das immernochnicht...
Das TWIE wird allerdings auch nicht gesetzt... zumindest sagt das das AVRStudio


App_Init(); //io initialize
sei(); //enable interrupts

TWCR |= _BV(TWINT);


in AppInit


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

FoCus
19.03.2005, 17:27
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...

FoCus
19.03.2005, 18:14
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