Forum: Mikrocontroller und Digitale Elektronik ATTiny2313 und SPI


von Mathias B. (mathias_b103)


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.

von Maxim B. (max182)


Lesenswert?

Mathias B. schrieb:
> Die Led an BP7 leuchtet voll.

Und was siehst du auf dem Bildschirm von Oszi?

Du kannst AVR319 ankucken.

von S. Landolt (Gast)


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.

von S. Landolt (Gast)


Lesenswert?

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

von Mathias B. (mathias_b103)


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 ?

von Christian S. (roehrenvorheizer)


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

von Karl K. (karl2go)


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. ;-)

von Tim (Gast)


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?

von Ralph S. (jjflash)


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.

von Karl K. (karl2go)


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.

von Ralph S. (jjflash)


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?

von Karl K. (karl2go)


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

von Mathias Burkhard (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.