mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Attiny2313 USI Schieberegister will nicht


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe es entlich geschafft meinen USI als TWI zu initialisieren,
aber ich bekomme keine Daten raus.

Was muss ich setzten, damit das Schieberegister seinen Inhalt ausgiebt?


mfg
Matthias

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das USITC-Bit in USICR 8x setzen.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja durch setzten des USITC bits erzeuge ich meinen Takt, aber aus SDA 
kommt nichts.

mfg
Matthias

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Schieberegister muss nochmal separat getaktet werden.
Funktioniert mit folgender Anweisung:


USICR |= (1<<USICLK);  // Shift USIDR to next Bit

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Das Schieberegister muss nochmal separat getaktet werden.

Nö, muss es nicht.

Matthias schrieb:
> aber aus SDA
> kommt nichts.

Ist SDA als Ausgang geschaltet? das betreffende Bit in DDRn muss gesetzt 
sein. Und Du musst natürlich vorher Daten ungleich 0`und ungleich 255 in 
USIDR eintragen, damit Du am Ausgang was siehst. Siehst Du die 
Clockpulse an SCL?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich setzt jetzt USICLK gleich mit dem Takt, müsste also ein 
durchgehender Datenstrom sein. Es kommt aber nichts, SDA ist trotz pull 
up immer Low?

Auszug:

 
    nop
    sbi USICR, 1  ;USICLK
    nop
    sbi USICR, 0  ;USITC für Takt
        


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mein derzeitiges versuchs asm, Takt kommt ohne Probleme.

Kommentare stimmen oft nicht!

include "tn2313def.inc"




.def temp1 = r16
.def temp2 = r17
.def temp3 = r18

.org 0x0000
    rjmp main

.org 0x000D
    rjmp timer0compare64

.org 0x000E
    rjmp timer0compare128




main:

    ldi temp1, LOW(RAMEND)
    out SPL, temp1

    ldi  temp1, 0b00100000
    out DDRD, temp1

    ldi temp1, 0b10100000
    out DDRB, temp1

    ldi temp1, 0b10000001
    out TCCR0B, temp1    ;Timer 0 Voreiler 1
    
    ldi temp1, 0b01000000
    out OCR0A, temp1    ;Timer 0 Compare 128
  
    ldi temp1, 0b10000000
    out OCR0B, temp1    ;Timer 0 Compare 128

    ldi temp1, 0b00000111
    out TIMSK, temp1    ;Timer 0 Interrupt enable


    ldi temp1, 0b00101010
    out USICR, temp1
    
  
  ;ldi temp1, 0b10101010
  ;  out USIDR, temp1
        ; Interrupts aktivieren


ldi r16, 0b10101010
out USIDR,r16

ldi r16,(0<<USISIF)|(1<<USIWM1)|(1<<USICS1)|(0<<USITC)|(1<<USICLK)
 out USICR,r16 
 
 sei


loop:
 

ldi r16, 0b10101010
out USIDR,r16

rjmp loop



timer0compare64:

    cbi PORTD, 5  
    nop
    sbi USICR, 1  ;USICLK
    nop
    sbi USICR, 0  ;USITC für Takt
        


  
    reti

timer0compare128:

    sbi PORTD,5 
    nop
    sbi USICR, 1
    nop
    sbi USICR, 0


    ldi temp1, 0b00000000
    out TCNT0, temp1
    reti



Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Nur mal so: Was stört dich eigentlich an dem Beispielcode aus dem 
Datenblatt?

MfG Spess

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich finde nur das für SPI und da tut sich nichts

SPITransfer:
out USIDR,r16
ldi r16,(1<<USIOIF)
out USISR,r16
ldi r16,(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)
SPITransfer_loop:
out USICR,r16
sbis USISR,USIOIF
rjmp SPITransfer_loop
in r16,USIDR
ret

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mich mit AVR Assembler noch nicht beschäftigt aber ich kann dir 
meine Funktionen in C als Beispiel geben, evtl kannst du sie ja in 
Assembler umschreiben. Habe damit schon ein mittleres Projekt realisiert 
und hat einwandfrei geklappt.
Die erste Funktion ist zur Initialierung.
Die zweite Funktion schickt 8 Bits auf die SDA Leitung.
Start und Stop Bedingung hab ich in einer anderen Funktion realisiert.
Das USIDR befülle ich vor dem Aufruf der zweiten Funktion mit Daten.
void TWI_Init()
{

 USICR = (0<<USISIE) | (0<<USIOIE) | (1<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0);  // Enable Two Wire Mode

 DDRB |= (1<<SDA) | (1<<SCL);      //  Enable Output Driver


 PORTB |= (1<<SDA) | (1<<SCL);      //******************************** 
 USISR |= (1<<7);            // Set SDA and SCL to High
 USIDR = 0xff;              //********************************

 

}


unsigned char USI_TWI_Master_Transfer(int NumOfBits)
{

  

  USISR = 0x80;     // Init USISR 



  for(int i=0; i<NumOfBits; i++)
  {

    if(USISR & 0x80)    
    { USISR |= (1<<7);}

    PORTB |= (1<<SCL);    //**************************************
    while(!(PINB & 0x80))  // Release and wait for SCL to go high
    { ;}          //**************************************
    

    _delay_us(10);      // Wait a TWI high period
  

    PORTB &= ~(1<<SCL);    //**************************************
    while((PINB & 0x80))  // SCL to Low and wait until done
    { ;}          //**************************************

  
    USICR |= (1<<USICLK);  // Shift USIDR to next Bit
  
    
    _delay_us(10);      // Wait a TWI low period


    


  }

  // All Data shifted???
    


return 0x00;
}


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens, musst du PORTB.5(SDA) und PORTB.7(SCL) auch auf High schalten 
sonst werden die Busleitungen dauerhaft auf Low gezogen.
SCL wird zusätzlich auch immer auf Low gezogen wenn eine Startbedingung 
vorkommt.
Woher weißt du, dass SDA immer auf Low ist? Hast du LEDs dran oder ein 
Oszi?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oszi!

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann sein das dass Schieberegister erst Daten ausgiebt, wenn die 
Startbedingung korrekt abgewickelt ist?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Der Ausgang ist PB6! Und der Pin ist in deinem Programm Eingang .

MfG Spess

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, bin mir sicher.
Die Startbedingung ist nur für deine Slaves von Bedeutung.
Hast es schon versucht mit PORTs auf High setzen?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einzeln mit sbi/cbi kann ich alles setzten.
Was ist mit PB6? ist bei TWI nicht Verwendet.

Kann das c prog leider nicht zu 100% umsetzten, da ich es nicht kann

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe schon zick varianten mit USITC USICLK versucht, aber es kommt 
nichts aus dem Schieberegister.

Hat nich jemand eine Idee? (hab den Attiny auch schon getauscht)

mfg
Matthias

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI

>Hat nich jemand eine Idee? (hab den Attiny auch schon getauscht)

Beitrag "Re: Attiny2313 USI Schieberegister will nicht"

MfG Spess

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Spess also ich seh nicht wo er PB6 verwendet hat.

@Matthias Am Controller selbst liegt es nicht. Aber es stimmt schon, den 
TWI beim AVR zu implementiern ist ein bisschen umständlich aber machbar.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>@Spess also ich seh nicht wo er PB6 verwendet hat.

USI und Schieberegister haben bei mir SPI assoziiert.

Was in DDRB steht ist bei TWI egal. Die Einstellung wird vom TWI 
überschrieben. Allerdings geht bei TWI ohne Pull-Up-Widerstände nichts. 
SCL und SDA können die Leitungen nur auf L ziehen, aber kein H ausgeben.

MfG Spess

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.