mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATTiny2313 und SPI


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Mathias B. (mathias_b103)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich will mit folgendem Pascal-Code eine SPI-Output realisieren, welcher 
ein Schieberegister 74HC595 ansteuert. Es ist nur ein einfacher Zähler.

Was habe ich bei den Registern übersehen, das ich nicht Hardwaremässig 
auf den USI schreiben kann ? Die Led an BP7 leuchtet voll.

Wen ich aber mit SPIWriteDataSoft schreibe, funktioniert alles 
wunderbar. Und LED an BP 7 leuchtet geschwächt, somit ist wie erwartet 
ein Clock vorhanden.

Ich denke, der Fehler liegt irgendwo bei USICR oder hier: while (USISR 
and (1 shl USIOIF)) = 0.

Kann mir jemand einen Tip geben ?

type
  TSPIGPIO = bitpacked record
    p0, p1, p2, p3, SlaveSelect, DataOut, DataIn, Clock: boolean;
  end;

var
  SPI_Port: TSPIGPIO absolute PORTB;
  SPI_DDR: TSPIGPIO absolute DDRB;

  procedure SPIWriteData(p: PByte; len: byte);
  var
    i: byte;
  begin
    SPI_Port.SlaveSelect := False;
    for i := len - 1 downto 0 do begin
      USIDR := p[i];
      while (USISR and (1 shl USIOIF)) = 0 do begin
      end;
    end;
    SPI_Port.SlaveSelect := True;
  end;

  // --- Nur für Test ---
  procedure SPIWriteDataSoft(p: PByte; len: byte);
  var
    i, j: byte;
  begin
    SPI_Port.SlaveSelect := False;
    for j := 0 to len - 1 do begin
      for i := 7 downto 0 do begin
        SPI_Port.DataOut := (p[j] and (1 shl i)) <> 0;

        SPI_Port.Clock := True;
        SPI_Port.Clock := False;
      end;
    end;
    SPI_Port.SlaveSelect := True;
  end;

var
  z: Int16 = 0;

begin

  SPI_DDR.DataOut := True;
  SPI_DDR.Clock := True;
  SPI_DDR.SlaveSelect := True;

  USICR := (1 shl USIWM) or (1 shl USICS) or (1 shl USICLK) or (1 shl USITC);

  repeat
    Inc(z);

    SPIWriteData(@z, 2);
    //    SPIWriteDataSoft(@z, 2);
  until 1 = 2;
end. 

Autor: Maxim B. (max182)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias B. schrieb:
> Die Led an BP7 leuchtet voll.

Und was siehst du auf dem Bildschirm von Oszi?

Du kannst AVR319 ankucken.

Autor: S. Landolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pascal auf AVR8 ist mir fremd, deshalb vorab die Bitte um 
Entschuldigung, falls ich falsch liege: ich sehe in SPIWriteDataSoft 
nicht, wo/wie getaktet wird per USICR.USICLK.

Autor: S. Landolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pardon, das sollte natürlich SPIWriteData heißen (..soft geht ja).

Autor: Mathias B. (mathias_b103)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe 2 Fehler gefunden, dies Ausgabe muss so aussehen. 
Initialisierung am Angang brauch es keine.
  procedure SPIWriteData(p: PByte; len: byte);
  var
    i: byte;
  begin
    SPI_Port.SlaveSelect := False;
    for i := len - 1 downto 0 do begin
      USIDR := p[i];
      USISR := 1 shl USIOIF;

      repeat
        USICR := (%01 shl USIWM) or (%10 shl USICS) or (1 shl USICLK) or (1 shl USITC);
      until (USISR and (1 shl USIOIF)) <> 0;

    end;
    SPI_Port.SlaveSelect := True;
  end;  
Und der zweite grösste Fehler, DI und DO vertauscht.
Ich habe mich durch die Bezeichnung MISO und MOSI auf dem ATiny2313 
verwirren lassen.
Anscheinend ist MISO und MOSI nur für den Programmer gültig.
Auf diesem Bild ist DI und DO nicht mal vorhanden: 
http://arduinolearning.com/wp-content/uploads/2016/08/attiny2310arduino.jpg

Hier habe ich DI und DO zufällig entdeckt.

Noch eine Frage hätte ich noch, wen ich das ganze für den Atmega328 
machen will, muss ich da die Leitungen MOSI und MISO auch kreuzen ?

Autor: Christian S. (roehrenvorheizer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Noch eine Frage hätte ich noch, wen ich das ganze für den Atmega328
> machen will, muss ich da die Leitungen MOSI und MISO auch kreuzen ?


SS sollte dort als Ausgang geschaltet sein.
Mosi heißt :master out, slave in
Miso heißt: master in, slave out

mfG

Autor: Karl K. (karl2go)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias B. schrieb:
> Anscheinend ist MISO und MOSI nur für den Programmer gültig.

Man muss halt aufpassen, wer Master und wer Slave ist.

Programmierung: Programmer ist Master, AVR ist Slave, MOSI / DI am AVR 
ist Input, MISO / DO ist Output.

Schieberegister: AVR ist Master, 595 ist Slave. Hier gelten MOSI / MISO 
nicht, DI ist Input, DO ist Output.

Man kann den AVR aber auch an einem anderen AVR als Slave betreiben. Ja, 
ich hab auch schonmal die Leiterbahnen zu einer SD-Karte weggekratzt und 
über Kreuz gelötet. ;-)

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias B. schrieb:
> Und der zweite grösste Fehler, DI und DO vertauscht.
> Ich habe mich durch die Bezeichnung MISO und MOSI auf dem ATiny2313
> verwirren lassen.
Da bist Du nicht der einzige. Was auch immer die bei Atmel geraucht 
haben, damals die Pinzuordnung festgelegt wurde...

Der zweite Fehler liegt darin, zu suggerieren USI wäre ein 
(vollwertiger) Ersatz für das SPI-Modul der ATMegas. Eigentlich ist es 
nur eine kleine Hilfe für Software-SPI: Man spart sich das Schieben und 
muß trotzdem noch quasi-manuell toggeln...

Der Gipfel ist der Quellcode zur Appnote AVR319, wo das Toggeln durch 
einen Timer-Interrupt getriggert wird. Wer bitte braucht SPI-Takte im 
unteren kHz-Bereich?

Autor: Ralph S. (jjflash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... mich würde der verwendete Pascal Compiler intetessieren. Es soll 
Leute geben, die es geschafft haben, FreePascal für AVR und STM32 ans 
laufen zu bringen... ich wars nicht.

Autor: Karl K. (karl2go)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralph S. schrieb:
> ... mich würde der verwendete Pascal Compiler intetessieren. Es soll
> Leute geben, die es geschafft haben, FreePascal für AVR und STM32 ans
> laufen zu bringen... ich wars nicht.

Das oben kompiliert problemlos mit Freepascal, AVR Embedded, Subsystem 
AVR25 (das sind die meisten Tinys).

Man sollte allerdings tunlichst die aktuelle Trunk mit FPC 3.1.1 nehmen. 
Dafür werden wie man sieht so nette Sachen wie Boolean Datentypen, 
Bitpacked Arrays unterstützt, und effizient umgesetzt.

Zur Installation schaust Du am besten im deutschen Lazarusforum.

Autor: Ralph S. (jjflash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl K. schrieb:
> Zur Installation schaust Du am besten im deutschen Lazarusforum.

.. das hab ich schon geguckt... Hmmmm, kannst du ein 32 und ein 64 Bit 
Binary hochladen?

Autor: Karl K. (karl2go)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralph S. schrieb:
> .. das hab ich schon geguckt... Hmmmm, kannst du ein 32 und ein 64 Bit
> Binary hochladen?

3.5GB? Nun, da Lazarus und Freepascal sämtliche Sourcen mitbringen, wird 
das so groß

Hol Dir den passenden Installer: 
https://github.com/newpascal/fpcupdeluxe/releases

Installiere Dir Lazarus und Freepascal nach C:\Lazarus oder so, nicht 
nach C:\Programme, im Installerpfad darf a) kein Leerzeichen sein und b) 
Lazarus kompiliert sich selbst, das geht im "geschützten" 
Programmverzeichnis schief.

Achtung, das dauert und zieht einige GB aus dem Netz.

Du kannst mehrere Releases (Stable und Trunk) von Lazarus und FPC haben, 
lege dazu jeweils ein eigenes Verzeichnis an.

Installiere Packete nach, Anchordocking ist sehr zu empfehlen.

Installierie die für Dich interessanten Crosscompiler nach: 
http://wiki.freepascal.org/AVR_Embedded_Tutorial_-_Entry_Lazarus_and_Arduino/de

Du kannst mehrere Subsysteme für AVR 
(https://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html) nutzen, wie das 
geht steht hier: 
https://www.lazarusforum.de/viewtopic.php?f=9&t=11718&p=104920&hilit=fpcupdeluxe#p104920

Machst Du nur ATmega328 = Arduino Uno / Nano, reicht Subsystem AVR5.

Programmbeispiele für AVR Embedded: 
http://wiki.freepascal.org/AVR_Embedded_Tutorial/de

Autor: Mathias Burkhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralph S. schrieb:
> ... mich würde der verwendete Pascal Compiler intetessieren. Es
> soll Leute geben, die es geschafft haben, FreePascal für AVR und STM32
> ans laufen zu bringen... ich wars nicht.

Ich gehöre dazu.

Das Tutorial für Arduino/STM32 und Lazarus ist von mir. Wobei es mit dem 
STM32 noch recht habert,

Das Problem mit dem USI habe ich schon ins Tutorial aufgenommen.

Ich bin um jede Anregung und Kritik dankbar,  nur somit habe ich  ein 
Canche das Tutorial zu verbessern.

Bei Problemen unschieniert im deutschen Lazarus Forum fragen.

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.