ATtiny 5 überfordert ?

Antworten
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

ATtiny 5 überfordert ?

Beitrag von Mathias »

Ich habe folgendes Multiplex-Programm geschrieben. Es sollte immer abwechslungsweise 2 Masken ausgegeben werden. Als Demo sollte einmal alles leuchten und dann wieder aus sein.
Aber leider sieht das Bild aus der Matrix aus, wie 2 verschiedene Q-Code. Ich habe das Gefühl, das das nicht Richtig auf die Konstante zugegriffen wird.
Als Info, die Ausgabe ist auf eine 8x8 Led Matrix, welche über 2 Schieberegister angesteuert wird.
Unten bei der Data Zuweisung, habe etwas ausgeklammert. Wen ich aber diese Werte zuweisen, wechseln 4 Balken wie erwarte hin und her.

Code: Alles auswählen

program Project1;

uses
  intrinsics;

{$O-,J-}

const
  Smily: array[0..1, 0..7] of byte = ((
    %11111111,
    %11111111,
    %11111111,
    %11111111,
    %11111111,
    %11111111,
    %11111111,
    %11111111), (

    %00000000,
    %00000000,
    %00000000,
    %00000000,
    %00000000,
    %00000000,
    %00000000,
    %00000000));

type
  TSPIGPIO = bitpacked record
    DataOut, Clock, SlaveSelect, p3, p4, p5, p6, p7: boolean;
  end;

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

  i, j: byte;
  p: uint16 = 0;
  Counter: uint16 = 0;
  Data: array[0..1] of byte;

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

  repeat
    Inc(p);
    if p >= 8 then begin
      p := 0;
    end;

    Data[0] := 1 shl p;
    if Counter > 300 then begin
      Data[1] := Smily[0, p];
//      Data[1] := %1010101010;
    end else begin
      Data[1] := Smily[1, p];
//      Data[1] := %0101010101;
    end;

    Inc(Counter);
    if Counter >= 600 then begin
      Counter := 0;
    end;

    SPI_Port.SlaveSelect := False;
    for j := 1 downto 0 do begin
      for i := 7 downto 0 do begin
        SPI_Port.DataOut := (Data[j] and (1 shl i)) <> 0;

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

  until False;
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: ATtiny 5 überfordert ?

Beitrag von siro »

Hallo Mathias:

Meine Vermutung:

Dein "counter" läuft asynchron zum byteindex "p"
das verwurschtelt sich miteinander...

Bei deinen festen Werten geht das gut, weil da p nicht benutzt wird.

p steht irgendwo wenn counter 300 erreicht und dann nimmt er die Daten aus dem falschen Smily
Er MUSS aber IMMER das Array von 0..7 abarbeiten unabhängig vom counter.
Oder counter müsste durch 8 teilbar sein.

evtl so: ?

Code: Alles auswählen

  repeat
 
    Data[0] := 1 shl p;
    if Counter > 37 then begin
      Data[1] := Smily[0, p];
//      Data[1] := %1010101010;
    end else begin
      Data[1] := Smily[1, p];
//      Data[1] := %0101010101;
    end;
	
    Inc(p);
    if p >= 8 then begin
      p := 0;
      inc(counter);
       if Counter >= 75 then counter:=0;
    end;

    SPI_Port.SlaveSelect := False;
    for j := 1 downto 0 do begin
      for i := 7 downto 0 do begin
        SPI_Port.DataOut := (Data[j] and (1 shl i)) <> 0;

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

  until False;
wenn ich falsch liege, bitte ich um Nachsicht...
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ATtiny 5 überfordert ?

Beitrag von Mathias »

Du liegst leider falsch.

Ich habe gerade den selben Code mit dem Attiny13 probiert, dort geht es ohne Probleme.
Einzig die Pin habe ich geändert.

Code: Alles auswählen

type
  TSPIGPIO = bitpacked record
    //    DataOut, Clock, SlaveSelect, p3, p4, p5, p6, p7: boolean;
    DataIn, DataOut, Clock, SlaveSelect, p0, p1, p2, p3: boolean;
  end;
Ich habe das Gefühl, das irgend ein Stacküberlauf oder was ähnliche vorliegt.
Beim ATtiny 3 ist dies alles sehr knapp.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: ATtiny 5 überfordert ?

Beitrag von siro »

Sorry Mathias, Du hast recht, das muss laufen.
Das p ist ja die Multiplex Zeile. :P
das hatte ich falsch verstanden.

Testprogramm:
LoopCount Data[0] Data[1]
Mux_Test.jpg
Mux_Test.jpg (21.2 KiB) 1622 mal betrachtet

Ich hab grad mal im Datenblatt nachgesehen, der Controller hat ja nur 32 Byte RAM und 512 Byte Flash :shock:
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ATtiny 5 überfordert ?

Beitrag von Mathias »

32Byte ist sehr wenig, nur schon die 2 Masken brauchen 16Byte,

Unter dem Strich, kann man den ATttiny5 nur gebrauchen, wen man etwas sehr einfaches macht, so wie ein bessere Wechselblinker.
Dafür ist sein Gehäuse sehr klein, und man könnte zB. einen Blinker in einen Kugelschreiber einbauen.
Das was ich gemacht habe, hat in der Praxis Null Sinn, nur schon die Schieberegister sind einiges grösser, auch in der SMD-Variante.

Aber ich wollte einfach mal diesen Winzling ausprobieren. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: ATtiny 5 überfordert ?

Beitrag von siro »

Ich liebe ja solche Winzlinge
und habe schon mit dem 6 beinigen Microchip PICs gearbeitet und tatsächlich was "vernünftiges" damit hinbekommen.
RGB Kette zur Spannungsüberwachung eine Mikro Helicopters.
Aber das ging leider fast ausschliesslich in Assembler.
https://www.dropbox.com/s/c5lvxdgf3ng3q ... B.mp4?dl=0

Wegen Speichermangel habe ich dann unbenutze Register als Variablen benutzt, da gibts sicher im AtTiny 5 auch so Einige.
Im Datenblatt bei "Register Summary" kann man ja mal schauen was man nutzen kann.
Unglücklicherweise sind beim Tiny genauso wie beim PIC nicht immer alle 8 Bits im Register belegt,
da hat man tatsächlich Bits eingespart. Hier muss man genau gucken welche Register also noch genügend Platz bieten.
Für den Muxzähler 0..7 könnte man das Register ADCSRB benutzen, da sind die letzen 3 Bits nutzbar.

Code: Alles auswählen

var p:Byte ABSOLUTE ADCSRB;  // Werte von 0..7 passen ja da rein.
ADCSRA hat zum Beispiel komplette 8 Bits welche man nutzen kann.

Das Smily Array landet ja mit Sicherheit erstmal im RAM.
Das bekommt man mit etwas tricksen sicher auch den Code Bereich.
Mehrere Konstanten hintereinander landen "meist" auch hintereinander im Speicher,
das hängt natürlich sehr vom Compiler ab.
Ich hab sowas dann als Procedure definiert und dort mittels DB Define Byte die alle hintereinader geschrieben.
Dann kann man mit nem Pointer darauf zugreifen. Auf die Adresse der Procedure kann man ja zugreifen.

Ich denke da gibt es noch viele Experimentiermöglichkeiten.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ATtiny 5 überfordert ?

Beitrag von Mathias »

Der AVR hat 32 Register.
Ich denke mit Assembler kriegt da man schon noch was hin.
Aber ich wollte ja fpc testen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: ATtiny 5 überfordert ?

Beitrag von PascalDragon »

siro hat geschrieben:
So 1. Mai 2022, 17:15
Das Smily Array landet ja mit Sicherheit erstmal im RAM.
Das bekommt man mit etwas tricksen sicher auch den Code Bereich.
Der Modifier section NAME ist dafür gedacht. Im Fall vom Code Bereich wäre das dann section '.progmem'. Allerdings muss man dann die Daten dann auch manuell über entsprechende Befehle laden (zumindest bis dieser Merge Request integriert wurde).
Mathias hat geschrieben:
So 1. Mai 2022, 18:35
Der AVR hat 32 Register.
Ich denke mit Assembler kriegt da man schon noch was hin.
Aber ich wollte ja fpc testen.
Auch mit FPC kannst du existierende, aber nicht benutzte “Register” zum Speichern von Daten verwenden, wie siro es an Hand von ADCSRB gezeigt hat, um den RAM Verbrauch zu reduzieren.
FPC Compiler Entwickler

Antworten