Nieuws:

Nu in MSM 244 REPORTAGE: De Nederlandse Modelspoordagen * A4 Dioramawedstrijd * Virtuele Messe 2024

Hoofdmenu

inlezen van data in arduino met shift register

Gestart door bumper, 28 december 2020, 10:41:54 AM

Havoc

Zeg, waarom willen we nu absoluut het anders doen?

Ik zie niet direct iets verkeerd met de schema's van de uitbrieding van de 4021 en 595. Van programmeren ken ik niet genoeg om direct zo de fout te zien. Ik zou ook vermoeden dat het uitbreiden van de lus van 7 naar 15 genoeg zou zijn. Enige waar ik bij twijfel is de (1 << i). Naar gelang we hier met 8 of 16 bit brede registers werken. Daarvoor ken ik de processoren niet goed genoeg.
Met vakantie voor onbepaalde duur.

Karel A.J.

Citeerwaarom willen we nu absoluut het anders doen?

"absoluut"? Ik heb enkel aangegeven dat er ook andere formules mogelijk zijn, en dat die zo hun voordelen kunnen hebben. Niet voor niets schreef ik "men kan ook" ! Maar ik heb de vraagsteller alle ruimte gelaten om verder te zoeken op het ingeslagen pad, ik doe zelfs mijn best om mee te denken; al moet ik toegeven dat het voorlopig niet zo best lukt ;)

raf

En ik stelde een werkend voorbeeld hoe ikzelf het gedaan heb
en ja ik werk met een pic processor en ken dus niet genoeg van arduino
en blijkbaar de rest ook niet om te zien waar de fout zit .

bij mijn voorstelling welke processor ook neem je voor een uitbreiding gewoon een volgende poort en noem je de knoppen die daar aan zitten "toets2" alsook alle andere commando's waar toets in staat .

misschien ook bij arduino een oplossing het zo te doen

maar ja dan maar niet meer mee denken zekers als sommige denken dat het niet kan .
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

Havoc

Raf, ik zeg niet dat het niet kan, maar Bumper heeft nu eenmaal bepaalde zaken liggen klaar om te gebruiken. En ja, dat werkt met een schakelaar, met terugmeldcircuits wordt dat dan toch weer een ander verhaal.

Een ander stel in/outputs gebruiken is wel een oplossing, maar geen idee of die vrij zijn.
Met vakantie voor onbepaalde duur.

patrick smout

#19
Dag Ludo,

ik heb je programma wat aangepast en dit zou je al een heel eind op weg moeten helpen.
Het is wel zo dat je "shiftout" functie gelijkaardige aanpassingen nodig heeft maar die code zie ik er niet bij zitten. Ofwel even nog posten op het forum of ook daar byte vervangen door word. Je moet wel nog eens nakijken in heel je programma of er ergens nog iets staat zoals "byte switchvar1". Ook dat moet dan "word switchvar1" worden.

Woordje uitleg wat er niet goed is: Een variabele van het type "byte" kan maar 8 bits (=ingangen) bewaren. Om tot 16 ingangen te bewaren heb je een variabele nodig die ook 16 bits breed is. Het type "word" is op de arduino 16 bits. Wil je tot 32 ingangen inlezen dan heb je een variabele van het type "unsigned long" nodig" (en de lus teller vergroten naar 31. Uiteraard hoef je de 16/32 posities niet allemaal te gebruik. Door de lus aan te passen naar 4 bvb. kan je nog altijd met "unsigned long" types werken en toch maar 4 schakelaars inlezen.

Ik gebruik zelf geen Arduino en heb de aanpassing niet getest maar ik vermoed wel dat ze ok zijn.
Vergeet ook niet de 1 << i te vervangen door 1U << i ( is niet zo goed zichtbaar). Strikt genomen niet noodzakelijk maar eerder netjes.De aanduiding U en unsigned geven aan dat we werken zonder tekenbit. Als er met bits gewerkt wordt is het geen slecht idee om te werken zonder tekenbit. Dus unsigned variabelen , etc. Ter info, bij een arduino stemt "word" overeen met "unsigned int" en is een int 16 bit  en " byte" met "unsigned char" en is een char exact 8 bits.

mvg, Patrick


Met vriendelijke groeten,

Patrick Smout

patrick smout

Nog even als reactie op de alternatieve oplossing met de weerstanden die voorgesteld werd.
In het geval van een meerstandenschakelaar is dit idd een werkend alternatief. Als er meerdere ingangen tegelijk actief kunnen zijn dan dan zul je een weerstandsnetwerk moeten opbouwen met weerstanden die zich verhouden als machten van 2. Aangezien een Arduino slechts een 10 bit AD omzetter heeft en de nauwkeurigheid dus nog minder is dan 10 bits is het sop de kool niet waard en kan je daar beter resoluut voor shiftregisters gaan.

Mvg, Patrick
Met vriendelijke groeten,

Patrick Smout

raf

de schakelaars in het voorbeeld mogen alleen maar puls schakelaars zijn dat is een voorwaarde waar aan voldaan moet worden anders werkt het niet

er word geen weerstands waarde gemeten door het programma maar er word een tijd gemeten .
" HIGH Toets                ;Condensator ontladen
    DELAYMS 1                 ;Even wachten zodat condensator helemaal leeg is
    Weerstand = RCIN Toets, HIGH ;Geef RC oplaadtijd aan WORD variabele 'Weerstand'
"
dus de variabele "weerstand gaat de oplaad tijd bevatten "en dan word zelfs de AD convertor niet gebruikt . de waarde word dan verder in het programma gebruikt om die betreffende functie uit te voeren .
het sturen van de wissels doe ik anders en teveel uitleg voor hier .eventueel een apart topic over openen als er interesse voor is

If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

bumper

Patrick,
Bedankt voor de zeer goede informatie. Ik ga deze nieuwe info eens eerst goed bestuderen want hij bevat voor mij toch een aantal nieuwe elementen die ik eerst ten gronde wil kennen. Daarna komt het testen en laat ik het resultaat wel weten.
Bijgaand nog het ontbrekende stukje code.
void loop() {
  if (digitalRead(nieuwe_lijn) == LOW) {
    while (digitalRead(nieuwe_lijn) == LOW) {};
    delay(100);
    switchVar1 = 0;
    digitalWrite(latchPinIn, 1);
    delayMicroseconds(20);
    digitalWrite(latchPinIn, 0);
    switchVar1 = shiftIn(dataPinIn, clockPinIn, MSBFirst);
    byte ledVar1 = switchVar1;
  digitalWrite(latchPinOut,LOW);   
  shiftOut(dataPinOut,clockPinOut,MSBFirst,ledVar1);
  digitalWrite(latchPinOut,HIGH);   
  delay(5000);
}
}
Raf,
Ik ga toch de arduino richting volgen en verder uitwerken.
Iedereen bedankt voor de medewerking.

Groeten.
Ludo.
 

patrick smout

Graag gedaan Ludo.

Ik zie wel dat de code die je nog geplaatst hebt het stuk ( functie) rond shiftout nog ontbreekt. Ook in dat stuk  moet je nog de aanpassingen doen van char naar word en uiteraard ook de lusteller.

Veel succes, als je nog vragen hebt dan horen we het wel.

Mvg, Patrick
Met vriendelijke groeten,

Patrick Smout

Peter_66

Zoals Patrick reeds heeft aangegeven, dien je 16 keer te lezen ipv de 8 in het oorspronkelijk programma.
Je kan met byte werken en per 4021 dien je dan 1 byte te voorzien en ook meerdere keren de leesroutine doorlopen.
Met bv 3 kan je Var[3] gebruiken en 3x de inleesroutine doorlopen.

raf

Ludo geen probleem
er zijn meer straten die naar Straatsburg leiden

gr raf
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

bumper

Patrick,
Met één shiftregister 595 werkt het bij mij zonder problemen.
Volgens de informatie die ik heb kunnen vinden en dus ook toegepast heb, kun je de code shiftOut zo gebruiken. Als functie kan ook en mag ook maar is niet nodig. Als je met één byte werkt en ook niet meer of niet minder nodig hebt, kan het zo. Er worden automatisch acht clock pulsen gegenereerd die de byte naar het shift register sturen dewelke het parallel naar de uitgangen stuurt. Als ge iets anders nodig hebt, zal je met een functie moeten werken. Ik hoop dat je mijn uitleg verstaat en dat hij juist is. In ieder geval het werkt zo of is dit toevallig.
Groeten.
Ludo.
 

patrick smout

Dag Ludo,

Interpretatiefoutje van mij. Ik leefde in de veronderstelling dat je ook meer dan 8 uitgangen wilde hebben maar dat blijkt niet zo te zijn. Indien wel meer dan 8 vraagt het ook om een aanpassing

Mvg, Patrick Smout
Met vriendelijke groeten,

Patrick Smout