mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schieberegister am USI v. ATTiny2313


Autor: Ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich brauche 4 Schieberegister (HCT595) hintereinandergeschaltet an
einem ATTiny2313.

Um etwas mehr Geschwindigkeit herauszuholen hab ich die an den USI Port
angeschlossen, somit spare ich mir die Bit-Shifts und lass die vom USI
ausführen.

Das Atmel-Datenblatt (Seite 141) schlägt für eine möglichst schnelle
Übertragung eine ASM-Sequenz vor die mit:
out USIDR,r16
ldi r16,(1<<USIWM0)|(0<<USICS0)|(1<<USITC)
ldi r17,(1<<USIWM0)|(0<<USICS0)|(1<<USITC)|(1<<USICLK)
out USICR,r16 ; MSB
out USICR,r17
out USICR,r16
out USICR,r17
out USICR,r16
...

das Takt-Signal erzeugt und gleichzeitig den internen Counter richtig
mitlaufen lässt.

Den Counter brauche ich nicht, also habe ich das in c (avr-gcc) so
umgesetzt:
/* init:  USICR = _BV(USIWM0)|_BV(USICS1)|_BV(USICLK); */

void usi_send_byte(uint8_t d) {
    USIDR=d;
    USICR |= _BV(USITC);
    USICR |= _BV(USITC);
    USICR |= _BV(USITC);
    USICR |= _BV(USITC);
...(16 Mal)
}

was auch in brauchbaren ASM-Code übersetzt wird:
 out 47-0x20,r24
 sbi 45-0x20,0
 sbi 45-0x20,0
...


Nun die Frage: geht das evtl. noch schneller? Bei 8MHz Takt messe ich
gerade mal 200KHz auf der Datenleitung für
while(1) usi_send_byte(0x55)

Hab ich mich vielleicht bei der Initialisierung des USI vertan, kann
man den Takt evtl. direkt erzeugen lassen anstatt die Clock-Leitung per
Software zu togglen?

Oder passt das schon und mein billiges Multimeter hat sich bei der
Frequenz vermessen (Soll angeblich bis 5MHz messen können)?

Danke,
/Ernst

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trotzdem ist die Atmel-Variante schneller als deine, denn OUT braucht
einen Takt, SBI/CBI jedoch zwei. Aber 8/4=2MHz sollte dabei schon
rauskommen.

"USICR |= _BV(USITC);"

Dieser Befehl löscht so nebenbei USICLK, d.h. so schnell dein Takt auch
sein mag, es mögen die dazu passenden Daten fehlen. Und wenn Du das
änderst, dann wird das Register immer noch mit jeder Taktflanke
geschoben, sowohl 0=>1 also auch 1=>0.

M.a.W: Der Atmel-Code schiebt mit CLK/2, schneller geht's einfach
nicht.

Autor: Ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, hat die Op-Code Tabelle also auch für C-Programmierer einen Sinn
:)

Bin bislang von RISC => ein Befehl pro Takt ausgegangen, sind aber
durchaus einige "längere" Befehle dabei. Aber Faktor 2 mit der
kleinen Änderung zu erreichen ist schon super, besten Dank für den
Tipp.

Ob die Daten bislang komplett richtig angekommen sind, weis ich
nichtmal, hab das erstmal nur auf nem Steckbrett zusammengestöpselt und
nur ein paar LEDS hier und da zum Testen angesteckt.

Wenn ich meinen C Code in
<code>
void usi_send_byte(uint8_t d) {
 register uint8_t a=_BV(USIWM0)|_BV(USICS1)|_BV(USITC);
 register uint8_t b=_BV(USIWM0)|_BV(USICS1)|_BV(USICLK)|_BV(USITC);
 USIDR=d;
 USICR = a;
 USICR = b;
 USICR = a;
 ...
</code>
ändere, macht der avr-gcc jetzt 1:1 den Beispiel-Code daraus.

Wg. den 2MHz/200kHZ muss ich nochmal schauen, vielleicht hab ich die
CLKDIV8 Fuse vergessen (peinlich, peinlich), könnte aber mit ein paar
Timer-Interrupts dazwischen schon hinkommen. (Allerdings wundert mich
dann warum die Baudrate des USART stimmt)

/Ernst

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.