In shiftOut12 blijft led 1 altijd aan. Voer ik in de sketch een getal in hoger dan 0 flitst heel kort de corresponderende led en blijft daarna dus niet aan, maar led 1 wel! Heb alles al tig keer opnieuw aangesloten met 3 verschillende shift registers (595) maar steeds hetzelfde resultaat. Ik zie wel dat het resultaat van de coderegel "int bitToSet=Serial.read() -48;" steeds de uitkomst -38 geeft, ongeacht het getal ik invoer.
Kan iemand mij helpen dit op te lossen?
Welkom
Waarschijnlijk de linefeed (0x0A, 10 decimaal). 10 - 48 is ...
Waar staat de line ending in de seriële monitor op?
Kun je aub je programma tonen; vergeet niet om code tags te gebruiken (de <CODE/>
hier op het forum) zoals beschreven in How to get the best out of this forum.
PS
De meesten van ons hebben geen idee wat shiftOut12 is.
Dit is de code van de sketch die ik als "ShiftOut12" van "https://www.arduino.cc/en/Tutorial/ShiftOut12" gedownload heb.
/*
Shift Register Example
for 74HC595 shift register
This sketch turns reads serial input and uses it to set the pins
of a 74HC595 shift register.
Hardware:
* 74HC595 shift register attached to pins 8, 12, and 11 of the Arduino,
as detailed below.
* LEDs attached to each of the outputs of the shift register.
Created 22 May 2009
Created 23 Mar 2010
by Tom Igoe
*/
//Pin connected to latch pin (ST_CP) of 74HC595
const int latchPin = 8;
//Pin connected to clock pin (SH_CP) of 74HC595
const int clockPin = 12;
////Pin connected to Data in (DS) of 74HC595
const int dataPin = 11;
void setup() {
//set pins to output because they are addressed in the main loop
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
Serial.begin(9600);
Serial.println("reset");
}
void loop() {
if (Serial.available() > 0) {
// ASCII '0' through '9' characters are
// represented by the values 48 through 57.
// so if the user types a number from 0 through 9 in ASCII,
// you can subtract 48 to get the actual value:
int bitToSet = Serial.read() - 48;
// write to the shift register with the correct bit set high:
registerWrite(bitToSet, HIGH);
}
}
// This method sends bits to the shift register:
void registerWrite(int whichPin, int whichState) {
// the bits you want to send
byte bitsToSend = 0;
// turn off the output so the pins don't light up
// while you're shifting bits:
digitalWrite(latchPin, LOW);
// turn on the next highest bit in bitsToSend:
bitWrite(bitsToSend, whichPin, whichState);
// shift the bits out:
shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);
// turn on the output so the LEDs can light up:
digitalWrite(latchPin, HIGH);
}
De sketch zou zo moeten werken dat wanneer ik een getal invoer (in de monitor) tussen 0 en 9 de led die met het ingevoerde getal overeenkomt, gaat branden en daarna weer uitgaat als er een ander cijfer wordt ingevoerd. Ongeacht wel getal ik invoer, gaat bij mij altijd de eerste led branden en gaat daarna ook niet meer uit. Wel zie ik dat de led die overeenkomt met het ingevoerde getal heel kort even flitst. Hopelijk heb ik mijn probleempje iets beter kunnen verduidelijken.
Kun je deze ook even beantwoorden? Dan zal ik er morgenochtend naar kijken.
Sorry, maar begrijp niet precies wat je bedoelt.
Mvg,
Jovanwe
Ik heb je programma wat aangepasst zodat je kunt zien wat er gebeurt.
Er even van uitgaande dat je IDE 2.x gebruikt is er een optie aan de rechterkant (rood onderstreept) die aangeeft wat er moet worden toegevoegd aan de gegevens die je stuurt; er zijn 4 opties waar je mee kunt spelen. Het programma is geschreven voor de optie "No Line Ending" (geen idee wat het in het Nederlands is).
Voor IDE 1.x zitten de opties rechts onder.
Het gewijzigde programma
//Pin connected to latch pin (ST_CP) of 74HC595
const int latchPin = 8;
//Pin connected to clock pin (SH_CP) of 74HC595
const int clockPin = 12;
////Pin connected to Data in (DS) of 74HC595
const int dataPin = 11;
void setup()
{
//set pins to output because they are addressed in the main loop
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
Serial.begin(115200);
Serial.println("reset");
}
void loop()
{
if (Serial.available() > 0)
{
// ASCII '0' through '9' characters are
// represented by the values 48 through 57.
// so if the user types a number from 0 through 9 in ASCII,
// you can subtract 48 to get the actual value:
char ch = Serial.read();
int bitToSet = ch - 48;
Serial.print(F("character received = 0x"));
if (ch < 0x10)
{
Serial.print("0");
}
Serial.print(ch, HEX);
if (ch < 0x20)
{
Serial.println(F(" (...)"));
}
else
{
Serial.print(F(" ('"));
Serial.print(ch);
Serial.println(F("')"));
}
Serial.print(F("bit to set = "));
Serial.println(bitToSet);
// write to the shift register with the correct bit set high:
registerWrite(bitToSet, HIGH);
}
}
// This method sends bits to the shift register:
void registerWrite(int whichPin, int whichState)
{
// the bits you want to send
byte bitsToSend = 0;
// turn off the output so the pins don't light up
// while you're shifting bits:
digitalWrite(latchPin, LOW);
// turn on the next highest bit in bitsToSend:
bitWrite(bitsToSend, whichPin, whichState);
// shift the bits out:
shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);
// turn on the output so the LEDs can light up:
digitalWrite(latchPin, HIGH);
}
Je kunt de ASCII codes opzoeken op bv https://www.asciitable.com/
Opmerkingen:
- Ik ben gewend om in hexadecimaal te werken; 0x0A is 10 decimaal, 0x0D is 13 decimaal.
- Je kunt de aanroep van
registerWrite(bitToSet, HIGH);
afhankelijk maken van de waarde vanbitToSet
; als deze kleiner is dan 0 roep je de functie niet aan. - Mijn standaard baud rate is 115200; je moet de gepresenteerde code aanpassen of je moet de baud rate in de seriële monitor aanpassen.
Dat is even een snelle reactie! Alvast dank daarvoor. Ga zo snel mogelijk alles uitproberen. En laat je natuurlijk weten wat het resultaat is.
Mvg,
Jovanwe
Daar ben ik weer. Ik begon met het selecteren van “No Line Ending” en … bingo! Toen heb ik ook de baudrate gewijzigd in 115200 en dat werkte niet!
Nu ga ik nog je gewijzigde sketch uitproberen. Laat je nog weten hoe dat uitpakt. Nogmaals dank voor de hulp.
Mvg,
Jovanwe
Zoals ik probeerde uit te leggen, de sketch die ik presenteerde is geschreven voor 115200. En dus moet je de seriële monitor ook op 115200 zetten als je mijn sketch gebruikt
Sorry, werkt wel. Ik was vergeten de baudrate in de monitor ook te wijzigen
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.