www.mikrocontroller.net

Forum: Compiler & IDEs USI Problem mit ATtiny24


Autor: Dimon11/09 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Dimon11/09 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !
void USI_TWI_Master_Initialise( void )
{
  PORT_USI |= (1<<PIN_USI_SDA);           // Enable pullup on SDA, to set high as released state.
  PORT_USI |= (1<<PIN_USI_SCL);           // Enable pullup on SCL, to set high as released state.
  
  DDR_USI  |= (1<<PIN_USI_SCL);           // Enable SCL as output.
  DDR_USI  |= (1<<PIN_USI_SDA);           // Enable SDA as output.
  
  USIDR    =  0xFF;                       // Preload dataregister with "released level" data.
  USICR    =  (0<<USISIE)|(0<<USIOIE)|                            // Disable Interrupts.
              (1<<USIWM1)|(0<<USIWM0)|                            // Set USI in Two-wire mode.
              (1<<USICS1)|(0<<USICS0)|(1<<USICLK)|                // Software stobe as counter clock source
              (0<<USITC);

  USISR   =   (1<<USISIF)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|      // Clear flags,
              (0x0<<USICNT0);                                     // and reset counter.
}



und
unsigned char USI_TWI_Master_Transfer( unsigned char temp )
{
  USIDR = temp;

  USISR = (1<<USISIF)|(1<<USIOIF)|
        (1<<USIPF)|(1<<USIDC)|
      (0x0<<USICNT0);                         // Set USISR according to
      //  Clear flags, and set USI to shift 8 bits i.e. count 16 clock edges..

                                                    // Prepare clocking.
  temp  =  (0<<USISIE)|(0<<USIOIE)|                 // Interrupts disabled
           (1<<USIWM1)|(0<<USIWM0)|                 // Set USI in Two-wire mode.
           (1<<USICS1)|(0<<USICS0)|(1<<USICLK)|     // Software clock strobe as source.
           (1<<USITC);                              // Toggle Clock Port.
  do
  {
    _delay_loop_1( 2 );              
    USICR = temp;                          // Generate positve SCL edge.
    while( !(PIN_USI & (1<<PIN_USI_SCL)) );// Wait for SCL to go high.
    _delay_loop_1( 4 );              
    USICR = temp;                          // Generate negative SCL edge.
  }while( !(USISR & (1<<USIOIF)) );        // Check for transfer complete.
  
  _delay_loop_1( 2 );                
  temp  = USIDR;                           // Read out data.
  USIDR = 0xFF;                            // Release SDA.

  return temp;                             // Return the data from the USIDR
}


Autor: Dimon11/09 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber auch nur mit:
#define PORT_USI    PORTA
#define PIN_USI_SDA    PINA6
#define PIN_USI_SCL    PINA4
#define DDR_USI         DDRA
#define PIN_USI         PINA

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dimon11/09 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.