PISO 74HC165 till arduino ger opålitlig data

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Jan Almqvist
Inlägg: 1655
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: PISO 74HC165 till arduino ger opålitlig data

Inlägg av Jan Almqvist »

Jag tittade lite i den gamla koden men gav snart upp...
minuzed
Inlägg: 13
Blev medlem: 15 april 2016, 14:26:44

Re: PISO 74HC165 till arduino ger opålitlig data

Inlägg av minuzed »

Med viss modifikation av koden så funkar den nu även med 2st chip vilket ger mig totalt 16 inputs. Jag har dessutom gjort mig av med alla delays så den jobbar så snabbt som arduinon klarar.

Problemet har alltså hela tiden legat i koden. Jag har ännu inte konstaterat var/vad som varit fel för med min kod har jag än så länge inte lyckats få fram samma problem.

Ett stort tack till alla som engagerat sig i frågan och kommit med tips, ideer och åsikter! :) :tumupp: :bravo:

För den intresserade så delar jag med mig av koden här. Denna fungerar för tillfället felfritt med 2st chip kaskadkopplade och går enkelt att utöka med fler.

Kod: Markera allt

// Set up Pins
const int plPin = 31; // This pin will control the parallel load pin(s)
const int cpPin = 33; // This pin will control the clock pin(s)
const int q7Pin = 37; // This pin will recieve the serial data

// Variables
unsigned int chips = 2; // Enter how many chips you use totally
unsigned int bits_per_chip = 8; // Enter the amount of bits to read per chip
unsigned int total_bits_to_read = chips * bits_per_chip; // Calculates the total amount of bits to read

unsigned long pinValues;
unsigned long oldPinValues;

// Setup once
void setup() 
{
  Serial.begin(9600); // Set up serial monitoring for output of the serial data collected
 
  pinMode(plPin, OUTPUT);
  pinMode(cpPin, OUTPUT);
  pinMode(q7Pin, INPUT_PULLUP); // Set this pin to INPUT and activate the internal pull-up resistor so it's not floating
 
  digitalWrite(plPin, HIGH);  // This is active LOW so I set this inactive for now
  digitalWrite(cpPin, LOW);   // This is active HIGH so I set this inactive for now
}

void loop() 
{
  load_parallel_data_into_register();
  pinValues = shift_out_data();

  if(pinValues != oldPinValues) // Only print to serial monitor if there's been a change
  {
    output_data_to_serial_monitor(pinValues);
    oldPinValues = pinValues;
  }
 
}

void load_parallel_data_into_register() 
{
  digitalWrite(plPin, LOW);   // Pull PL low (active) to load parallel data into the register
  digitalWrite(plPin, HIGH);  // Pull PL high (inactive) so we can shift out the register
}

unsigned long shift_out_data()
{
  long bitVal;
  unsigned int bytesVal = 0;
 
  // Send clock-signals to CP to shift out the register
  for(int i = 0; i < total_bits_to_read; i++) {
    bitVal = digitalRead(q7Pin);
    bytesVal |= (bitVal << ((total_bits_to_read-1) - i));
   
    digitalWrite(cpPin, HIGH);          // Activate clock-signal to shift to next bit
    digitalWrite(cpPin, LOW);           // Deactivate clock-signal
  }
  return(bytesVal);
}

void output_data_to_serial_monitor(unsigned long data) 
{
  Serial.print("Data = ");
  Serial.println(data, BIN);
}
Användarvisningsbild
SeniorLemuren
Inlägg: 8426
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: PISO 74HC165 till arduino ger opålitlig data

Inlägg av SeniorLemuren »

Kan inte se att data in pin är satt som "INPUT_PULLUP" utan bara till "INPUT" i den första koden. Kanske det var hela felet?
Användarvisningsbild
rvl
Inlägg: 6948
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: PISO 74HC165 till arduino ger opålitlig data

Inlägg av rvl »

Kul att höra att det löste sig.

Angående kontaktstuds så lär en nummerskiva från en gammal telefon ge bra "klockpulser". Såg en video där en typ byggt en räknemaskin av 555or och stor LEDmatris. Han vevade in siffrorna med nummerskiva.
Skriv svar