AVR ATtiny2313 USI und 74HC165

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

AVR ATtiny2313 USI und 74HC165

Beitrag von Mathias »

Folgende Basis:

Deklaration:

Code: Alles auswählen

program Project1;
{$O-,J-}
type
  TSPIGPIO = bitpacked record
    p0, p1, p2, p3, SlaveSelect, DataIn, DataOut, Clock: boolean;
  end;
 
var
  SPI_PORT: TSPIGPIO absolute PORTB;
  SPI_DDR: TSPIGPIO absolute DDRB;
  SPI_PIN: TSPIGPIO absolute PINB;
 
 
Wen ich einen 74HC165 Softwaremässig einlese, funktioniert alles bestens.

Code: Alles auswählen

  function SoftShiftIn165: byte; // geht
  var
    i: byte;
  begin
    Result := 0;
    for i := 0 to 7 do begin  // LSBFIRST
      Result := Result shl 1;
      if SPI_PIN.DataIn then Inc(Result);
      SPI_PORT.Clock := True;
      SPI_PORT.Clock := False;
    end;
  end;   

 
Will ich aber über die USI-Schnittstelle einlesen, kommt das Result falsch.

Code: Alles auswählen

  function HardShiftIn165: byte; // geht nicht.
  begin
    USISR := (1 shl USIOIF);
 
    repeat
      USICR := (%01 shl USIWM) or (%010 shl USICS) or (1 shl USICLK) or (1 shl USITC);
    until (USISR and (1 shl USIOIF)) <> 0;
 
    Result := USIDR;
  end;

 
Das gleiche Verhalten kann ich feststellen, wen ich Softwaremässig einlese, wie es shiftIn von Arduino macht. Man beachte das SPI_PORT.Clock .

Code: Alles auswählen

  function SoftShiftIn165: byte; // geht nicht
  var
    i: byte;
  begin
    Result := 0;
    for i := 0 to 7 do begin  // LSBFIRST
      Result := Result shl 1;
      SPI_PORT.Clock := True;
      if SPI_PIN.DataIn then Inc(Result);
      SPI_PORT.Clock := False;
    end;
  end


Kann ich USI dazu bringen, das das Clock-Verhalten anders ist ?
Geht dies überhaupt ?

Im Anhang der ganze Code.
Dateianhänge
Project1.pas
(1.97 KiB) 209-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: AVR ATtiny2313 USI und 74HC165

Beitrag von Maik81SE »

Moin Matthias,

ist deine Frage nach 11 Monaten noch aktuell oder hast du dies erfolgreich lösen können?
Frage, da ich wohl oder übel auf eine analoges Problem bei der USI-TWI stoßen werden, wenn ich einen C-Code in FP umschreibe. und warum soll man da nicht gleich beide Möglichkeiten in ein Package schreiben, wenn man schon dabei ist.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

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

Re: AVR ATtiny2313 USI und 74HC165

Beitrag von Mathias »

Ich konnte es bis jetzt nicht lösen.

Habe ich dich richig verstanden, das du eine Lösung in C hast ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten