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
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