Hi,
habe mal wieder ein Problem mit enweder meinem Code oder der PC Software.
Habe den slave wie folgt initialisiert:
was meines Erachtens dem Datenblatt des ATMega16 entspricht.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);
Danach stehe ich in einer for-Schleife..
In der Interruptroutine steht:
Was auch nach bestem Wissen und Gewissen aus der Doku entnommen wurde.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 }
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







Zitieren

Lesezeichen