bela_robert
Here is an updated version where you can shift all 8 values into the shift register in ONE RENDER, in the form of class where you can change the value of the shift register by calling the "SetRegister" function and giving it a number from 0 to 255. I post the header and cpp files:
/***** ShiftRegister.h *****/
#include <Bela.h>
#include "digital_gpio_mapping.h"
class ShiftRegister{
private:
char mData_Pin;
char mLatch_Pin;
char mClock_Pin;
int mValue;
public:
explicit inline ShiftRegister(char Data_pin, char Latch_pin, char Clock_pin) :
mData_Pin(Data_pin), mLatch_Pin(Latch_pin), mClock_Pin(Clock_pin) {}
inline void setup(BelaContext *context) {
pinMode(context, 0, mData_Pin,OUTPUT);
pinMode(context, 0, mClock_Pin,OUTPUT);
pinMode(context, 0, mLatch_Pin,OUTPUT);
}
void SetRegister(BelaContext *context, int val);
};
/***** ShiftRegister.cpp *****/
#include "ShiftRegister.h"
void ShiftRegister::SetRegister(BelaContext* context, int val) {
mValue = val;
// 1 First Bit (will go to Q7)
digitalWrite(context,0,mLatch_Pin,GPIO_HIGH); //latch in the start ! (not enough frames to do the opposite!!!)
digitalWrite(context,0,mClock_Pin,GPIO_LOW);
if (mValue >= 128) {
digitalWrite(context,0,mData_Pin,GPIO_HIGH);
mValue = mValue - 128;
}
else digitalWrite(context,0,mData_Pin,GPIO_LOW);
digitalWrite(context,1,mClock_Pin,GPIO_HIGH);
// 2 Second Bit (will go to Q6)
digitalWrite(context,2,mClock_Pin,GPIO_LOW);
if (mValue >= 64) {
digitalWrite(context,2,mData_Pin,GPIO_HIGH);
mValue = mValue - 64;
}
else digitalWrite(context,2,mData_Pin,GPIO_LOW);
digitalWrite(context,3,mClock_Pin,GPIO_HIGH);
// 3 Third Bit (will go to Q5)
digitalWrite(context,4,mClock_Pin,GPIO_LOW);
if (mValue >= 32) {
digitalWrite(context,4,mData_Pin,GPIO_HIGH);
mValue = mValue - 32;
}
else digitalWrite(context,4,mData_Pin,GPIO_LOW);
digitalWrite(context,5,mClock_Pin,GPIO_HIGH);
// 4 Fourth Bit (will go to Q4)
digitalWrite(context,6,mClock_Pin,GPIO_LOW);
if (mValue >= 16) {
digitalWrite(context,6,mData_Pin,GPIO_HIGH);
mValue = mValue - 16;
}
else digitalWrite(context,6,mData_Pin,GPIO_LOW);
digitalWrite(context,7,mClock_Pin,GPIO_HIGH);
// 5 Fifth (will go to Q3)
digitalWrite(context,8,mClock_Pin,GPIO_LOW);
if (mValue >= 8) {
digitalWrite(context,8,mData_Pin,GPIO_HIGH);
mValue = mValue - 8;
}
else digitalWrite(context,8,mData_Pin,GPIO_LOW);
digitalWrite(context,9,mClock_Pin,GPIO_HIGH);
// 6 Sixth Bit (will go to Q2)
digitalWrite(context,10,mClock_Pin,GPIO_LOW);
if (mValue >= 4) {
digitalWrite(context,10,mData_Pin,GPIO_HIGH);
mValue = mValue - 4;
}
else digitalWrite(context,10,mData_Pin,GPIO_LOW);
digitalWrite(context,11,mClock_Pin,GPIO_HIGH);
// 7 Seventh Bit (will go to Q1)
digitalWrite(context,12,mClock_Pin,GPIO_LOW);
if (mValue >= 2) {
digitalWrite(context,12,mData_Pin,GPIO_HIGH);
mValue = mValue - 2;
}
else digitalWrite(context,12,mData_Pin,GPIO_LOW);
digitalWrite(context,13,mClock_Pin,GPIO_HIGH);
// 8 Eighth (will go to Q0)
digitalWrite(context,14,mClock_Pin,GPIO_LOW);
if (mValue >= 1) {
digitalWrite(context,14,mData_Pin,GPIO_HIGH);
mValue = mValue - 1;
}
else digitalWrite(context,14,mData_Pin,GPIO_LOW);
digitalWrite(context,15,mClock_Pin,GPIO_HIGH);
digitalWrite(context,15,mLatch_Pin,GPIO_LOW);
}
In render you can run it as:
#include <Bela.h>
#include "ShiftRegister.h"
ShiftRegister register1 {P8_10, P8_11, P8_12}; // data , latch , clock
bool setup(BelaContext *context, void *userData)
{
register1.setup(context);
return true;
}
void render(BelaContext *context, void *userData)
{
register1.SetRegister(context,255); //will light up all 8 leds
}
The only drawback is that LATCHING (sending the data to the outputs) happens in the next render.