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
Lesezeichen