Forum: Compiler & IDEs USI Problem mit ATtiny24


von Dimon11/09 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute, hilft mir.

Seit 8 Stunden kämpfe ich mich durch die Datenbläter und diesen Forum, 
um die USI 2-Wire Master daten übertragung zu realesieren.

Ich verstehe einfach nicht wie ich die Daten aus USIDR in die Welt 
schicke. Bis jetzt sehe ich nur ein 1MHz Takt am PA4 = SCL

Im angehängten Code ist die minimal-Version des Programms.

von Dimon11/09 (Gast)


Lesenswert?

Ok Problem fast gelöst,
Wie auch immer der Fall ist: der Fehler sitz vor dem PC.

Habe am Falschem Pin den Ausgang erwartet, bzw. da ich eine TWO-WiRE 
Mode realesieren möchte habe ich schon an richtiger Stelle gemessen (SDA 
= PA6) funktioniert bis jetz nur 3_WiRE.

Und mit diesem Code leuft ENDLICH 2-WIRE !
1
void USI_TWI_Master_Initialise( void )
2
{
3
  PORT_USI |= (1<<PIN_USI_SDA);           // Enable pullup on SDA, to set high as released state.
4
  PORT_USI |= (1<<PIN_USI_SCL);           // Enable pullup on SCL, to set high as released state.
5
  
6
  DDR_USI  |= (1<<PIN_USI_SCL);           // Enable SCL as output.
7
  DDR_USI  |= (1<<PIN_USI_SDA);           // Enable SDA as output.
8
  
9
  USIDR    =  0xFF;                       // Preload dataregister with "released level" data.
10
  USICR    =  (0<<USISIE)|(0<<USIOIE)|                            // Disable Interrupts.
11
              (1<<USIWM1)|(0<<USIWM0)|                            // Set USI in Two-wire mode.
12
              (1<<USICS1)|(0<<USICS0)|(1<<USICLK)|                // Software stobe as counter clock source
13
              (0<<USITC);
14
15
  USISR   =   (1<<USISIF)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|      // Clear flags,
16
              (0x0<<USICNT0);                                     // and reset counter.
17
}

und
1
unsigned char USI_TWI_Master_Transfer( unsigned char temp )
2
{
3
  USIDR = temp;
4
5
  USISR = (1<<USISIF)|(1<<USIOIF)|
6
        (1<<USIPF)|(1<<USIDC)|
7
      (0x0<<USICNT0);                         // Set USISR according to
8
      //  Clear flags, and set USI to shift 8 bits i.e. count 16 clock edges..
9
10
                                                    // Prepare clocking.
11
  temp  =  (0<<USISIE)|(0<<USIOIE)|                 // Interrupts disabled
12
           (1<<USIWM1)|(0<<USIWM0)|                 // Set USI in Two-wire mode.
13
           (1<<USICS1)|(0<<USICS0)|(1<<USICLK)|     // Software clock strobe as source.
14
           (1<<USITC);                              // Toggle Clock Port.
15
  do
16
  {
17
    _delay_loop_1( 2 );              
18
    USICR = temp;                          // Generate positve SCL edge.
19
    while( !(PIN_USI & (1<<PIN_USI_SCL)) );// Wait for SCL to go high.
20
    _delay_loop_1( 4 );              
21
    USICR = temp;                          // Generate negative SCL edge.
22
  }while( !(USISR & (1<<USIOIF)) );        // Check for transfer complete.
23
  
24
  _delay_loop_1( 2 );                
25
  temp  = USIDR;                           // Read out data.
26
  USIDR = 0xFF;                            // Release SDA.
27
28
  return temp;                             // Return the data from the USIDR
29
}

von Dimon11/09 (Gast)


Lesenswert?

Aber auch nur mit:
1
#define PORT_USI    PORTA
2
#define PIN_USI_SDA    PINA6
3
#define PIN_USI_SCL    PINA4
4
#define DDR_USI         DDRA
5
#define PIN_USI         PINA

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hmm, ich blicke jetzt nicht ganz durch, hast du noch ein Problem
offen oder nicht?

Ich habe die USI auf einem ATtiny84 jedenfalls schon für einen
SPI-Master benutzt.  Das Ergebnis findest du u. a. im µracoli-
Projekt wieder.

von Dimon11/09 (Gast)


Lesenswert?

Hallo Jorg,

/*Hmm, ich blicke jetzt nicht ganz durch, hast du noch ein Problem
offen oder nicht?*/

Nun nicht ganz zu ;) sag ich mal so. Senden kann ich ändlich was (also 
TWI läuft). Hab als Slave einen LM3944 i2c LED-kontroller, der will 
nicht meine Nachrichten umsetzen.

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.