Re: PISO 74HC165 till arduino ger opålitlig data
Postat: 15 april 2016, 18:55:40
Vad händer om du lägger alla höga?
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Inkluderar dethär daisy chain ingången? (DS)minuzed skrev:Så länge ALLA inputs är jordade via 10k så visar den 0b0000 0000 men så fort jag antingen drar någon till VCC så ballar den ur. Det funkar heller inte att bara jorda någon input direkt till GND för då flippar den precis som om dom vore flytande.
Om jag lägger alla höga med 10k motstånd så blir det fladder, lägger jag dom höga direkt till VCC blir det oxå fladder.Castor skrev:Vad händer om du lägger alla höga?
CE (clock enable) har många kopplat direkt till GND (aktiv låg) men jag kopplade den till en pinne för kunna ha kontroll över den. Jag drar den låg (aktiv) så fort jag gjort läsningen och låter den vara det tills jag skiftat ut alla 8-bitarna och drar sen den hög (inaktiv) igen. Jag har provat att alltid ha den aktiv till GND och det blir ingen skillnad i resultatet.Icecap skrev:74HC ger bättre nivåer än HCT så det delen er OK. Men jag funderar lite på varför CE ens är kopplat till en pinne. I min värld ska det ske en läsning (LD -> aktiv -> inaktiv) varefter det ska shiftas in 8 bit. Jag har inte läst databladet så det kan finnas anledning men rent logisk kan jag inte se den.
Eftersom jag inte använder DS och det är en input så har jag lagt den låg med ett 220R motstånd för att den inte ska vara flytande. Jag tror heller inte att det blir någon skillnad om jag skippar motståndet och drar den direkt till GND. Jag har fler 165or som jag hade tänkt koppla ihop senare men det känns ganska långt borta innan jag ens har fått EN att fungerarvl skrev:Inkluderar dethär daisy chain ingången? (DS)
Testade nyss att driva den från USB-porten på en laptop på enbart batteridrift, samma fladder när alla inputs är höga.rvl skrev:Ett felsökningssteg kunde vara att mata Arduinon från en laptop som kör från sitt batteri utan galvanisk kopling till elnätet, eller andra trådnät.
Det jag egentligen gjort nu är bara att sätta en switch på en av mina inputs för att enkelt kunna göra den hög. Jag har då satt en 100nF keramisk kondensator parallellt med switchen i hopp om att minska studsandet. Jag har även testat med två olika elektrolyter, en 100uF och en 10uF, även detta gav ingen skillnad. Så länge jag håller nere switchen och gör inputen hög (aktiv) så ger det fladder.baron3d skrev:Det skulle vara av intresse och veta exakt hur du kopplat när du styr kretsen med switchar.
Fladdret sker alltid medan någon (oavsett vilken) av mina inputs är höga.sodjan skrev:Är "fladdret" kontinuerligt eller enbart då en switch ställs om?
En timme senare? Eller efter hur lång tid?
Kod: Markera allt
/* How many shift register chips are daisy-chained.
*/
#define NUMBER_OF_SHIFT_CHIPS 1
/* Width of data (how many ext lines).
*/
#define DATA_WIDTH NUMBER_OF_SHIFT_CHIPS * 8
/* Width of pulse to trigger the shift register to read and latch.
*/
#define PULSE_WIDTH_USEC 5
/* Optional delay between shift register reads.
*/
#define POLL_DELAY_MSEC 1
/* You will need to change the "int" to "long" If the
* NUMBER_OF_SHIFT_CHIPS is higher than 2.
*/
#define BYTES_VAL_T unsigned int
int ploadPin = 31; // Connects to Parallel load pin the 165
int clockEnablePin = 30; // Connects to Clock Enable pin the 165
int dataPin = 50; // Connects to the Q7 pin the 165
int clockPin = 52; // Connects to the Clock pin the 165
BYTES_VAL_T pinValues;
BYTES_VAL_T oldPinValues;
/* This function is essentially a "shift-in" routine reading the
* serial Data from the shift register chips and representing
* the state of those pins in an unsigned integer (or long).
*/
BYTES_VAL_T read_shift_regs()
{
long bitVal;
BYTES_VAL_T bytesVal = 0;
/* Trigger a parallel Load to latch the state of the data lines,
*/
digitalWrite(ploadPin, LOW); // Pull PL low (active) and high (inactive) to load the parallel data into the register
delayMicroseconds(PULSE_WIDTH_USEC);
digitalWrite(ploadPin, HIGH);
delayMicroseconds(PULSE_WIDTH_USEC);
digitalWrite(clockEnablePin, LOW); // Enable clock CE
delayMicroseconds(PULSE_WIDTH_USEC);
/* Loop to read each bit value from the serial out line
* of the SN74HC165N.
*/
for(int i = 0; i < DATA_WIDTH; i++)
{
bitVal = digitalRead(dataPin);
/* Set the corresponding bit in bytesVal.
*/
bytesVal |= (bitVal << ((DATA_WIDTH-1) - i));
/* Pulse the Clock (rising edge shifts the next bit).
*/
digitalWrite(clockPin, HIGH);
delayMicroseconds(PULSE_WIDTH_USEC);
digitalWrite(clockPin, LOW);
}
digitalWrite(clockEnablePin, HIGH); // Done reading data, disable clock
return(bytesVal);
}
/* Dump the list of zones along with their current status.
*/
void display_pin_values()
{
Serial.print("Pin States:\r\n");
for(int i = 0; i < DATA_WIDTH; i++)
{
Serial.print(" Pin-");
Serial.print(i);
Serial.print(": ");
if((pinValues >> i) & 1)
Serial.print("HIGH");
else
Serial.print("LOW");
Serial.print("\r\n");
}
Serial.print("\r\n");
}
void setup()
{
Serial.begin(9600);
/* Initialize our digital pins...
*/
pinMode(ploadPin, OUTPUT);
pinMode(clockEnablePin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, INPUT);
digitalWrite(clockPin, LOW); // Active high
digitalWrite(ploadPin, HIGH); // Active low
digitalWrite(clockEnablePin, HIGH); // Active low
/* Read in and display the pin states at startup.
*/
pinValues = read_shift_regs();
display_pin_values();
oldPinValues = pinValues;
}
void loop()
{
/* Read the state of all zones.
*/
pinValues = read_shift_regs();
/* If there was a chage in state, display which ones changed.
*/
if(pinValues != oldPinValues)
{
Serial.print("*Pin value change detected*\r\n");
display_pin_values();
oldPinValues = pinValues;
}
delay(POLL_DELAY_MSEC);
}
Jepp jag kör den på 9600 och monitorn på sammaSeniorLemuren skrev:En liten men kanske dum fråga: Har du satt monitorn på 9600 baud. Jag brukar glömma det ofta och då blir det ju kajko.
Kod: Markera allt
// Setup pins
const int internalLEDPin = 13; // This pin will control the on-board LED
const int plPin = 31; // This pin will control the parallel load
const int cpPin = 33; // This pin will control the clock pin
void setup() {
// put your setup code here, to run once:
pinMode(internalLEDPin, OUTPUT);
pinMode(plPin, OUTPUT);
pinMode(cpPin, OUTPUT);
digitalWrite(internalLEDPin, LOW); // LED off
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() {
// put your main code here, to run repeatedly:
load_parallel_data_into_register();
shift_out_data_to_LED();
}
void load_parallel_data_into_register()
{
digitalWrite(plPin, LOW); // Pull PL low (active) to load parallel data into the register
// Blink the on-board LED 2 times to show that we set PL active
for(int i = 0; i < 2; i++) {
digitalWrite(internalLEDPin, HIGH);
delay(250);
digitalWrite(internalLEDPin, LOW);
delay(250);
}
digitalWrite(plPin, HIGH); // Pull PL high (inactive) so we can shift out the register
delay(1000); // Wait for 1 sec
}
void shift_out_data_to_LED()
{
// Send 8 clock-signals to CP to shift out the register
for(int i = 0; i < 8; i++) {
digitalWrite(cpPin, HIGH); // Activate clock-signal
digitalWrite(internalLEDPin, HIGH); // Turn on on-board LED to show that we are sending clock-signals
delay(1000); // Wait for 1 sec
digitalWrite(cpPin, LOW); // Deactivate clock-signal
digitalWrite(internalLEDPin, LOW); // Turn on-board LED off
delay(1000); // Wait for 1 sec
}
// Show that all data has been shifted out by lighting the on-board LED for 5 secs
digitalWrite(internalLEDPin, HIGH);
delay(5000);
digitalWrite(internalLEDPin, LOW);
delay(1000);
}