2 poorten tegelijk HIGH

Arduino specifieke Software
Berichten: 2
Geregistreerd: 19 Mei 2021, 19:06

2 poorten tegelijk HIGH

Berichtdoor Henk Schepers » 25 Mei 2021, 10:52

Goede morgen,
Ik ben pas begonnen met het programmeren van de arduino
Ik ben met een project bezig om een modelbouwbus van verlichting te voorzien.
De modelbus is een gele standaard lijnbus waarvan de richting aanwijzers vóór twee lampjes
om en om knipperen boven elkaar. Dit is goed gelukt. Maar als je de alarmlichten aan doet
Moet links en rechts synchroon knipperen om en om boven en beneden.
ik heb dit geprobeerd maar werkt niet geeft fout te veel argumenten

digitalWrite(3,5 HIGH);//richtingaanwijzer links boven
delay(700);
digitalWrite(3,5 LOW);//richtingaanwijzer rechts boven

Iemand een idee?


void setup()

{
pinMode(3, OUTPUT);//richtingaanwijzer links boven
pinMode(4, OUTPUT);//richtingaanwijzer links beneden
pinMode(2, OUTPUT);//koplampen
pinMode(5, OUTPUT);// richtingaanwijzer rechts boven
pinMode(6, OUTPUT);//richtingaanwijzer rechts onder

}
void loop()
{

digitalWrite(2, HIGH);//koplampen
delay(8000);
digitalWrite(2, LOW);//koplampen
//----------------------------------------------

digitalWrite(3, HIGH);//richtingaanwijzer links boven
delay(700);
digitalWrite(3, LOW);

digitalWrite(4, HIGH);//richtingaanwijzer links onder
delay(700);
digitalWrite(4, LOW);

digitalWrite(3, HIGH);//richtingaanwijzer links boven
delay(700);
digitalWrite(3, LOW);

digitalWrite(4, HIGH);//richtingaanwijzer links onder
delay(700);
digitalWrite(4, LOW);

digitalWrite(3, HIGH);//richtingaanwijzer links boven
delay(700);
digitalWrite(3, LOW);

digitalWrite(4, HIGH);//richtingaanwijzer links onder
delay(700);
digitalWrite(4, LOW);

digitalWrite(3, HIGH);//richtingaanwijzer links boven
delay(700);
digitalWrite(3, LOW);

digitalWrite(4, HIGH);//richtingaanwijzer links onder
delay(700);
digitalWrite(4, LOW);

digitalWrite(3, HIGH);//richtingaanwijzer links boven
delay(700);
digitalWrite(3, LOW);

digitalWrite(4, HIGH);//richtingaanwijzer links onder
delay(700);
digitalWrite(4, LOW);

digitalWrite(3, HIGH);//richtingaanwijzer links boven
delay(700);
digitalWrite(3, LOW);

digitalWrite(4, HIGH);//richtingaanwijzer links onder
delay(700);
digitalWrite(4, LOW);

digitalWrite(3, HIGH);//richtingaanwijzer links boven
delay(700);
digitalWrite(3, LOW);






//----------scheiding links en rechts
digitalWrite(5, HIGH);//richtingaanwijzer rechts onder
delay(700);
digitalWrite(5, LOW);

digitalWrite(6, HIGH);//richtingaanwijzer rechts boven
delay(700);
digitalWrite(6, LOW);

digitalWrite(5, HIGH);//richtingaanwijzer rechts onder
delay(700);
digitalWrite(5, LOW);

digitalWrite(6, HIGH);//richtingaanwijzer rechts boven
delay(700);
digitalWrite(6, LOW);

digitalWrite(5, HIGH);//richtingaanwijzer rechts onder
delay(700);
digitalWrite(5, LOW);

digitalWrite(6, HIGH);//richtingaanwijzer rechts boven
delay(700);
digitalWrite(6, LOW);

digitalWrite(5, HIGH);//richtingaanwijzer rechts onder
delay(700);
digitalWrite(5, LOW);

digitalWrite(6, HIGH);//richtingaanwijzer rechts boven
delay(700);
digitalWrite(6, LOW);

digitalWrite(5, HIGH);//richtingaanwijzer rechts onder
delay(700);
digitalWrite(5, LOW);

digitalWrite(6, HIGH);//richtingaanwijzer rechts boven
delay(700);
digitalWrite(6, LOW);

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 2 poorten tegelijk HIGH

Berichtdoor shooter » 25 Mei 2021, 17:37

eenvoudigste is 2 digitalwrites onder elkaar dus 1 met pin 3 en dan pin 5 bijvoorbeeld.
Code: Alles selecteren
digitalWrite(3, HIGH);//richtingaanwijzer links boven
digitalWrite(5, HIGH);
delay(700);
digitalWrite(3, HIGH);

iets makkelijks is ook define dus
#define linksboven 3
dan kun je in je eigen code dus linksboven gebruiken dat kun je dus ook voor
#define aan HIGH
#define uit LOW
want het is vaak beter om te sinken dus LOW maken is ledje aan etc.
paul deelen
shooter@home.nl

Berichten: 2
Geregistreerd: 19 Mei 2021, 19:06

Re: 2 poorten tegelijk HIGH

Berichtdoor Henk Schepers » 25 Mei 2021, 22:22

Dank je, ik heb voor het knipperen nu functies gemaakt waardoor het overzichtelijk is geworden.
Maar ben er nog niet uit om beide kanten links en recht tegelijk in hetzelfde ritme te laten branden
Zie bijlage. De linker en de rechter richtingaanwijzers moeten moeten in alarmfase beide kanten branden

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 2 poorten tegelijk HIGH

Berichtdoor shooter » 26 Mei 2021, 21:42

zoals je bij mij ziet staat er geen delay tussen de beide writes en gaan ze tegelijk aan (oke er zit iets minder dan een microseconde tussen voor de puristen maar dat kun je echt niet zien.
paul deelen
shooter@home.nl

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: 2 poorten tegelijk HIGH

Berichtdoor ctunes » 26 Mei 2021, 22:50

Henk Schepers schreef:
digitalWrite(3,5 HIGH);//richtingaanwijzer links boven


Arduino IDE's: "digitalWrite()", kan maar 1 term tegelijk aan, vandaar je foutmelding. (Maar hulde voor je C++ inzichten, Stroustrup zou trots op je kunnen zijn door net als hem te denken.)

Een alternatief is om direct het PORT-register te gebruiken,
(Maar dat schijnt alleen aan een "geboren programmeur" toevertrouwd? ... (meent iemand, elders) en vereist de hardware te kennen)

https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf

paragraaf 13.4.8 pagina 73

In het geval van de standaard arduino (328/168) zijn pin D3 en D5 gekoppeld aan bit 3 en 5 van het PORTD-register, en dat is direct adreseerbaar:

Code: Alles selecteren
PORTD |= (1 << 5) & (1 << 3)   // Turn on left blinkers.


"|=" staat voor "a = a OR b", de logische OF operator.


"a << b" wil zoveel zeggen als: "Schuif a b plaatsen naar links op. Dus a wordt b plaatsen naar links opgeschoven.

Voorbeeld:
het getal 16+4=20
Als ik dat binair weergeef staat er: "10100", om het te onderscheiden van andere bases, zet ik er 0b voor, dus:
0b10100 // als het goed is zie je direct al welke "bits" "gezet" moeten worden ... het derde en het vijfde.

als ik dus programmeer: a = 1 << 3 , dan maak ik van a: wat a was + 4 EN met a = 1 << 5, wat a was + 16.

Wat a ook maar was, a is nu a OR 20, wat ik zeker weet is dat bits 5 en 3 gezet zijn.

Wat, logisch gezien, hetzelfde resultaat geeft als:
Code: Alles selecteren
digitalWrite(3, HIGH);//richtingaanwijzer links boven
digitalWrite(5, HIGH);//richtingaanwijzer links onder


Beiden zijn immers equivalent voor de processor.

De menselijke interpretatie echter??? vooral die van anderen???

(PORTD |= 20, werkt ook, maar is niet echt duidelijk ... Dat kun je gebruiken als je niet wilt dat anderen jouw code makkelijk kunnen lezen.)

En dan:
Code: Alles selecteren
PORTD &= (0 << 5) & (0 << 3)

om ze weer uit te zetten.

a = a AND b de logische AND operator.

(Je kunt de 1 door HIGH vervangen en de 0 door LOW, ze zijn immers gelijk gedefinieerd).

Alternatief:

Code: Alles selecteren
#define LEFT_BLINKER 0b00010100      // Bits 5 and 3
#definde RIGHT_BLINKER 0b00001010 // Bits 4 and 2


Code: Alles selecteren
if (put_left_ blinkerleds_on == true) PORTD |= LEFT_BLINKER
else PORTD &= !LEFT_BLINKER


Let op het "!" symbool, dat keert alle logica om.

Stel je wilt alleen bit 3 uitschakelen in a, en de rest intact houden?

1 EN 0 = 0
1 EN 1 = 1

A = A & NOT(0b100)

NOT 0b100, is een getal met oneindig veel 1-en aan het begin en slechts 2 aan het eind, en het derde staat op 0.

Dus als de derde een 1 was, 1 AND 0 = 0, en de led dooft.

Klaar.

Het verschrompelt je brein misschien, dat ben ik met je eens, maar de logica werkt perfect.

En het is de enige manier waarop je werkelijk programmeren leert, zonder telkens weer voor verrassingen te komen staan die je de liefde van het programmeren zouden kunnen ontnemen.

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: 2 poorten tegelijk HIGH

Berichtdoor ctunes » 28 Mei 2021, 20:31

Mja ... dit was een nogal .. eehh .. "inside" reaktie.

Niettemin illustreert het wel dat als jij gewend bent analoog te denken in: "soms WAAR", "misschien NIET", en "afentoe JUIST",
dat er dan onoverkomelijk veel problemen in je verschiet komen te liggen.

De Digitale wereld kan alleen maar onderscheiden tussen: "soms, misschien en afentoe", door statistiek te bedrijven.

AI heet dat ook wel.

https://taalpraat.nl/2013/11/leugens-grove-leugens-en/

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: 2 poorten tegelijk HIGH

Berichtdoor ctunes » 28 Mei 2021, 20:44

@Henk Schepers

Wat heeft dit alles met Uw richtingaanwijzer te maken?

In feite niets.

Dus U kunt ook ervoor kiezen mijn reakties te negeren.

Dat is aan U.

Niettemin heb ik U een methode getoond (en wellicht in turbo versnelling uitgelegd), maar daar pogen wij dan ook cursussen voor te geven:
- "Leren het digitale tijdperk te begrijpen voor wat het is, met behulp van een arduino."

Geïnteresseerden kunnen zich via PM aanmelden.

PS
Dit is geen reclame, dit is een slechts een idee.
Bij genoeg gegadigden kan de cursus vorm gaan krijgen.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 14 gasten