Forum: Mikrocontroller und Digitale Elektronik AN312 USI Verständnissfrage


von Jens D. (Gast)


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

von ich (Gast)


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ß

von Jens D. (Gast)


Lesenswert?

Ja, genau das habe ich vor und deine Aussagen sind, wie ich sie vermutet
hatte..

etwas mager Dokumentiert, als AN nunja

hast du es als Slave hinbekommen??

von ich (Gast)


Lesenswert?

nur die benötigten Teile (Slave sendet nach Start Condition seinen
Puffer) von IAR nach CodeVision übertragen ( waren keine großen
Änderungen), also kein Assembler.

Gruß

von ich (Gast)


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ß

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.