Forum: Mikrocontroller und Digitale Elektronik Interrupt bei TWI Slave (Atmega8)?


von ipirk (Gast)


Lesenswert?

Hallo!!
Ich bitte um Hilfe, da ich zur zeit "auf der Leitung stehe" :-)!!

Ich will einen ATmega8 im TWI (I2C) Slave Modus laufen lassen, es soll 
eine i2C Motor Steuerung werden.

Nun meine Frage:
Der Atmega8 besitzt einen TWI Interrupt Vector (18), der wird ausgelöst 
wenn das TWINT bit im TWCR Register gesetzt ist.
Wird dieses Bit auch gesetzt, wenn die Slave Adresse, die ich dem Atmega 
gegeben habe, auf den Bus gesendet wurde, oder wird das Bit nur gesetzt 
wenn das TWI Modul mit der Datenübertragung fertig ist??? Oder weder 
noch???

Wenn dadurch kein Interrupt ausgelöst wird, gibt es dann noch eine 
andere möglichkeit den Atmega8 in eine ISR springen zu lassen, wenn 
seine Adresse am Bus liegt oder zumindest wenn die Startbedingung auf 
den Bus gesendet wurde????

Bitte um dringende Hilfe!!!!!

MFG

von MeinerEiner (Gast)


Lesenswert?

Soweit ich mich erinner, wird der Interrupt immer gesetzt, wenn am TWI 
was passiert. Du musst dann in der ISR unterscheiden, was passiert.

z.B. eine der ISRs von mir:
1
ISR (SIG_2WIRE_SERIAL)
2
{
3
  ui8_t data = 0;
4
  switch (TW_STATUS)
5
  {
6
    case TW_SR_SLA_ACK: // 0x60, SID received
7
      TWCR_ACK();
8
      TWI_RxBuf_Cnt = 0x00;
9
      TWI_TxBuf_Cnt = 0x00;
10
      break;
11
    case TW_SR_DATA_ACK: // 0x80, Slave receiver, get data
12
      data = TWDR;  
13
      TWI_RxBuffer[TWI_RxBuf_Cnt++] = data;
14
      TWCR_ACK();
15
      break;
16
    case TW_ST_SLA_ACK:
17
    case TW_ST_DATA_ACK: // 0xB8, Slave transmitter, send data
18
      TWDR = TWI_TxBuffer[TWI_TxBuf_Cnt++];
19
      TWCR_ACK();
20
      break;
21
    case TW_ST_DATA_NACK: // 0xC0, no more data requested
22
    case TW_SR_DATA_NACK: // 0x88
23
    case TW_ST_LAST_DATA: // 0xC8, last data byte transmitted
24
    case TW_SR_STOP: // 0xA0, Stop
25
    default:
26
      TWI_NewMsg = 1;
27
      TWCR_RESET();
28
      break;
29
  }
30
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.