ATTiny2313 und SPI

OP #5526783
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 ?

1
type
2
  TSPIGPIO = bitpacked record
3
    p0, p1, p2, p3, SlaveSelect, DataOut, DataIn, Clock: boolean;
4
  end;
5

6
var
7
  SPI_Port: TSPIGPIO absolute PORTB;
8
  SPI_DDR: TSPIGPIO absolute DDRB;
9

10
  procedure SPIWriteData(p: PByte; len: byte);
11
  var
12
    i: byte;
13
  begin
14
    SPI_Port.SlaveSelect := False;
15
    for i := len - 1 downto 0 do begin
16
      USIDR := p[i];
17
      while (USISR and (1 shl USIOIF)) = 0 do begin
18
      end;
19
    end;
20
    SPI_Port.SlaveSelect := True;
21
  end;
22

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

33
        SPI_Port.Clock := True;
34
        SPI_Port.Clock := False;
35
      end;
36
    end;
37
    SPI_Port.SlaveSelect := True;
38
  end;
39

40
var
41
  z: Int16 = 0;
42

43
begin
44

45
  SPI_DDR.DataOut := True;
46
  SPI_DDR.Clock := True;
47
  SPI_DDR.SlaveSelect := True;
48

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

51
  repeat
52
    Inc(z);
53

54
    SPIWriteData(@z, 2);
55
    //    SPIWriteDataSoft(@z, 2);
56
  until 1 = 2;
57
end.
OP #5526991
Lesenswert?

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

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

14
    end;
15
    SPI_Port.SlaveSelect := True;
16
  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 ?
#5527073
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. ;-)
Gast #5527239
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?
#5527865
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.
#5527926
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
Gast #5531340
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren