AN312 USI Verständnissfrage

Gast #308966
Lesenswert?

Hallo, ich versuche gerade das IAR Beispiel in ASM umzuschreiben im
grunde ist das kein Thema..

nur verstehe ich nicht, das das zum teil soll
1
#pragma vector=USI_START_VECTOR
2
__interrupt void USI_Start_Condition_ISR(void)
3
{
4
     unsigned char tmpUSISR;                                         //
5
Temporary variable to store volatile
6
     tmpUSISR = USISR;                                               //
7
Not necessary, but prevents warnings
8
-- Ist klar
9

10
 // Set default starting conditions for new TWI package
11
     USI_TWI_Overflow_State = USI_SLAVE_CHECK_ADDRESS;
12
-- Wird hier schon die angesprochene Adresse eingelesen??
13

14

15
     DDR_USI  &= ~(1<<PORT_USI_SDA);                                 //
16
Set SDA as input
17
-- Wieso nocheinmal als Input??
18

19
     while ( (PIN_USI & (1<<PORT_USI_SCL)) & !(tmpUSISR & (1<<USIPF))
20
);   // Wait for SCL to go low to ensure the "Start Condition" has
21
completed.
22
-- !(tmpUSISR & (1<<USIPF)) was soll sich daran aendern??? 
23

24
-- Ist klar
25
                                                                   // If
26
a Stop condition arises then leave the interrupt to prevent waiting
27
forever.
28
     USICR   =   (1<<USISIE)|(1<<USIOIE)|                            //
29
Enable Overflow and Start Condition Interrupt. (Keep StartCondInt to
30
detect RESTART)
31
                 (1<<USIWM1)|(1<<USIWM0)|                            //
32
Set USI in Two-wire mode.
33
                 (1<<USICS1)|(0<<USICS0)|(0<<USICLK)|                //
34
Shift Register Clock Source = External, positive edge
35
                 (0<<USITC);
36
-- Clear FLAGS heisst Bit setzen??
37
      USISR  =   
38
(1<<USI_START_COND_INT)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|      //
39
Clear flags
40
                 (0x0<<USICNT0);                                     //
41
Set USI to sample 8 bits i.e. count 16 external pin toggles.
42
}

Danke schonmal für euere Antworten
Gast #308967
Lesenswert?

ist schon eine Weile her, dass ich mit der USI eines Tiny26 gekämpft
habe. Du scheinst einen Slave basteln zu wollen.

zu deinen Fragen:

>Wird hier schon die angesprochene Adresse eingelesen??
Nicht direkt, sobalt der Überlaufinterrupt des USI aufgetreten ist,
hast du Slaveadresse im Empfangsregister.

>Wieso nocheinmal als Input??
Die SDA-Leitung wird entweder low oder hochohmig geschalten (d.h.
Umschalten der Richtung Ein- oder Ausgang)

Zu den anderen Fragen kann ich dir aus dem Stand nichts sagen, ist eine
Weile her.

Gruß
Gast #308970
Lesenswert?

Inhaltsfragen zu I2C und USI kannst du also gerne stellen, aber bei der
ASM-Umsetzung kann ich dir nicht weiterhelfen.
 btw. Der Start Condition-Interrupt zieht die SDA-Leitung auf Low-Pegel
(d.h. Ausgang). Du musst sie in deinem Programm von Hand wieder
freigeben/hochohmig schalten, also auf Eingang setzen.

gruß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren