reset byte-waarde tijdens versturen via SPI

Arduino specifieke Software
Berichten: 3
Geregistreerd: 11 Nov 2022, 17:14

reset byte-waarde tijdens versturen via SPI

Berichtdoor Osiris » 11 Nov 2022, 17:30

Goedendag,

Ik heb 2 stuks 74HC595 in serie waar ik via SPI (MOSI) 2 bytes data naar toe verstuur. Nu ben ik er achter gekomen dat tijdens het versturen van de 2 bytes de (IL + IF) bytes weer nul worden gemaakt. Dit heb ik opgelost door de bits van deze bytes opnieuw met bitWrite te schrijven. Heeft iemand een idee hoe het komt dat de bytes tijdens het versturen weer "0" worden gemaakt?

Hierbij de uitgeklede versie van de software:

#include <SPI.h>
const int latchPin = 10;

int i;

byte IL ;
byte IF ;

void setup()
{
SPI.begin();
pinMode(latchPin, OUTPUT);
//+------------------------------------------------------------------------------------------------------------------------
SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0)); // Zet alle bits laag
digitalWrite(latchPin, LOW);
SPI.transfer(B00000000); //tweede byte
SPI.transfer(B00000000); //eerste byte
digitalWrite(latchPin, HIGH);
SPI.endTransaction();
//+------------------------------------------------------------------------------------------------------------------------
Serial.begin(9600); // debugging
}
//+------------------------------------------------------------------------------------------------------------------------





void loop()
{

// ---------------------IL+IF aan ---------------------------------+
bitWrite(IL,0,1); // eerste byte
bitWrite(IF,0,1); // tweede byte

//---------------DATA-VERSTUREN------------------------------------+
SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
digitalWrite(latchPin, LOW);
SPI.transfer(&IF,1); // tweede byte
SPI.transfer(&IL,1); //eerste byte
digitalWrite(latchPin, HIGH);
SPI.endTransaction();

// ---------------------IF uit ---------------------------------+
bitWrite(IL,0,1); // eerste byte
bitWrite(IF,0,0); // tweede byte

//---------------DATA-VERSTUREN------------------------------------+
delay(500);
SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
digitalWrite(latchPin, LOW);
SPI.transfer(&IF,1); //tweede byte
SPI.transfer(&IL,1); //eerste byte
digitalWrite(latchPin, HIGH);
SPI.endTransaction();

// ---------------------IL uit / ---------------------------------+
bitWrite(IF,0,0); // tweede byte
bitWrite(IL,0,0); // eerste byte


//---------------DATA-VERSTUREN------------------------------------+
delay(500);
SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
digitalWrite(latchPin, LOW);
SPI.transfer(&IF,1); //tweede byte
SPI.transfer(&IL,1); //eerste byte
digitalWrite(latchPin, HIGH);
SPI.endTransaction();

delay(500);
}


Ook heb al van de bytes (IL+IF) een static bytes gemaakt maar dit haalde niets uit.

Graag uw reactie. Ik ben erg benieuwd.

Met vriendelijke groet,
Osiris

Advertisement

Berichten: 68
Geregistreerd: 04 Sep 2021, 08:31

Re: reset byte-waarde tijdens versturen via SPI

Berichtdoor RobGood » 16 Nov 2022, 09:27

Hallo osiris, ik heb heel wat gestoeid met die 595 shifts. Maar ik begrijp echt dit item niet. Wat probeer je te doen? Twee arduinoos met eentje een extra 16 pinnen dmv die shifts registers en dan die waardes over een SPI protocol tussen de arduinoos uitwisselen? Of gewoon 1 arduino dmv 2 shiftregisters 16 extra outputs geven?
Vertel eens wat meer over het project...
Rob..

Berichten: 3
Geregistreerd: 11 Nov 2022, 17:14

Re: reset byte-waarde tijdens versturen via SPI

Berichtdoor Osiris » 16 Nov 2022, 12:43

Beste RobGood,

De bedoeling is meerdere digitale uitgangen te creëren met 1 arduino Uno ( Ik stap later over een een Teensy4.x). Ik zou ook een Due kunnen gebruiken maar dan kom ik nog steeds uitgangen te kort. Uiteindelijk doel is uitgangen te maken voor meerdere cilindermotoren, maar daar gaat het nu niet om.

Wat ik ontdekte (met 1 schuifregister) dat is de software wel met bitwrite de (IL) byte waarde weer op nul had gezet maar dat daarvoor de waarde van de (IL) byte al op nul stond.

Door debugging regels tussen de verschillende stappen te schrijven kwam ik er achter dat tijdens het versturen van de byte waarde de byte weer op nul wordt gezet.


//---------------DATA-VERSTUREN------------------------------------+
SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
Serial.print("IL "); Serial.println(IL, BIN);
Serial.print("IF "); Serial.println(IF, BIN);

digitalWrite(latchPin, LOW);
Serial.print("IL "); Serial.println(IL, BIN);
Serial.print("IF "); Serial.println(IF, BIN);

SPI.transfer(&IF,1); // tweede byte
Serial.print("IL "); Serial.println(IL, BIN);
Serial.print("IF "); Serial.println(IF, BIN);

SPI.transfer(&IL,1); //eerste byte
Serial.print("IL "); Serial.println(IL, BIN);
Serial.print("IF "); Serial.println(IF, BIN);

digitalWrite(latchPin, HIGH);
Serial.print("IL "); Serial.println(IL, BIN);
Serial.print("IF "); Serial.println(IF, BIN);

SPI.endTransaction();
Serial.print("IL "); Serial.println(IL, BIN);
Serial.print("IF "); Serial.println(IF, BIN);

Als je de debuggingregels laat staan maar het data versturen in de software ongedaan maakt dan verloopt de byte waarde correct.

//SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
Serial.print("IL "); Serial.println(IL, BIN);
Serial.print("IF "); Serial.println(IF, BIN);

//digitalWrite(latchPin, LOW);
Serial.print("IL "); Serial.println(IL, BIN);
Serial.print("IF "); Serial.println(IF, BIN);

enz, enz ...

Hoe kan dit? Of is het beter om SPI achterwege te laten en over te stappen op de Shif Out functie?

Graag uw reactie.

Groet van Osiris

Berichten: 68
Geregistreerd: 04 Sep 2021, 08:31

Re: reset byte-waarde tijdens versturen via SPI

Berichtdoor RobGood » 18 Nov 2022, 16:02

Osiris,
Ik twijfel of SPI library wel hiervoor de juiste keuze is.
Natuurlijk zou je kopieën kunnen maken van die twee bytes, en de kopieën versturen.
Het origineel kan dan nooit veranderen.
Die shift out is sowieso een betere optie.
Maar om een library te gebruiken om een shiftregister aan te sturen is voor mij een beetje (nu ja een heleboel) overkill...
zelf doe ik dit met een stukje code....(onderstaand...)
Wel ff in mijn eigen brabbeltaaltje maar ik heb de 'vertaling' erbij gezet...

***begin
//twee bytes dus in declaratie:
byte shiftout[2]; //Als array is het makkelijker..

void Setup(){
//Die 595 heeft aansluitingen (zie datasheet)
//SER daar komt de data op binnen Pin van de arduino 8
//OE (output enabled) (verbinden naar GND)
//RCLK (register clock) pinnetje van de arduino bv. 9
//SRCLK (shiftregisterclock) ook een pinnetje bv. 10
//SRCLR verbinden met de VCC .!
//Pootje 9 van de eerste verbinden met pootje 14 van de tweede.
//Rest is voeding en de 8 outputs, voor testen zet er 8/16 leds op bv.

//Dus pinnen 8,9, 10 declareren als outputs
PORTB |=(7<<0); //dit gaat sneller als met die pinmodes....
} //end setup

void loop(){
for (byte beit=0;beit <2;beit++){ //twee for loops nesten
for (byte bid=0;bid<8;bid ++){
PORTB &=~( 1<<0); //zet pin 8 SER laag
if(shiftout[beit] & (1<<bid)) PINB |=(1<<0); //flip pin 8 naar hoog als geteste bit waar is
PINB |=(1<<2);PINB |=(1<<2); flip pin 10 2x maakt een puls van ongeveer een 0.0625us, //schuift de bits in de registers 1 plekje op
if(bid==7 && beid ==1){ //alle bits ingeschoven? nu een puls om ze 'in te klokken'
PINB |=(1<<1);PINB |=(1<<1); flip pin 9 2x
} //end bid==7
} //end for bid
} //end for beit
} //end loop
*****end.

Shift proces draait nu op volle toeren. De data in de beide shiftouts kun je manipuleren in andere functies, effecten daarvan direct te zien op de outputs van de schuifregisters.
Heb je maar weinig mutaties in je data , dan kun je ook na een mutatie dit shiftout proces doen. Dit duurt ongeveer een 20 cycli. 0,125 us.
Ik heb het niet getest zullen vast wat syntax fouten in zitten, maar het gaat om het principe toch?
Vast zijn er betere manieren, maar voor mij werkt het...
Succes Rob

Berichten: 3
Geregistreerd: 11 Nov 2022, 17:14

Re: reset byte-waarde tijdens versturen via SPI

Berichtdoor Osiris » 20 Nov 2022, 15:45

Rob,

Dank je voor je ideeën. De reden dat ik SPI gebruik is de hogere snelheid.
De software kopieert nu de data in een aparte byte die verzonden wordt zodat het origineel in takt blijft.
Dus om het probleem heen gewerkt.




Groet van Osiris

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: RussellAlets en 20 gasten