volgorde in bloks (basiskennis)

Ik ben pas begonnen en kan dit eenvoudige probleem niet verklaren.
In onderstaand programma staat alleen een setup en een loop.
Als ik het programma sequentieel afloop zou je denken dat in het blok “loop” de lcd.printopdracht staat of wordt aangeroepen, waardoor herhaald de tekst 'hello world’wordt geprint.
Het komt nu over dat de tekst blijft staan en alleen de LCD aan en uit wordt gezet.
Het programma werkt wel, maar wil het ook snappen wat er gebeurt.
De vraag is moeilijk te beschrijven waardoor ik niets kan vinden.

// include the library code:
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
// set up the LCD’s number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print(“hello, world!”);
}

void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis() / 1000);
}

Dat de tekst blijft staan dat klopt. Immers je verandert die eerste regel niet meer. Dat knipper effect komt omdat je met een bloed snelheid naar die lcd zit te schrijven. Gooi er eens na die print van die millis een delay(1000); er bij en het zal allemaal wat rustiger worden

Je 'blok' heet officieel een funktie (en als het een onderdeel van een class is, wordt het meestal een method genoemd). setup is een funktie en loop is een funktie.

Nico's voorstel zal de truc doen. Je kunt ook overwegen om het scherm alleen te verversen als millis()/1000 verandert.

Bedankt voor jullie reactie, maar ik ben er nog niet uit.
Ik dacht dat een programma loopt in de volgorde van

  1. Declaratie
  2. Setup
  3. Hoofdprogramma (main) met aanroep naar de functie(s).

In het voorbeeld mis ik het hoofdprogramma.
Het voorbeeld loopt van functie setup naar functie loop (zonder aanroep naar de herhaalde printopdracht)

Main() is niet zichtbaar voor je, en dat betekent dus dat die er wel is (het is dus transparant).
Die roept loop () aan en daar gebeurt dus verder eigenlijk wat jij in main () zou verwachten.

Je hebt het niet helemaal juist. In de Arduino wereld heb je volgende elementen waar je je zorgen over moet maken :wink:

declaraties en definities
2)
functie setup()
3)
functie loop()

In zowel setup() als loop() kun je functies aanroepen. In je voorbeeld de functies lcd.begin() en lcd.print() in setup() en functies lcd.setCursor(), lcd.print() en millis() in loop().

Zoals MAS3 al zei, er is een main die voor je verborgen is. De IDE zorgt ervoor dat deze automatisch wordt mee-gecompileerd als je programma wordt gecompileerd.

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

Zoals je kunt zien roept main() setup() aan en vervolgens in een eindeloze lus roept main() loop() aan. Op een windows systeem kun je de main() functie vinden in C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp

Dat zaken niet zichtbaar zijn maakt het per definitie diffuus. Is dit alleen voor de Arduino zo of is dit ook bij C# of C++ ?
Voor de beginnende programmeur zou ik dan toch de printopdracht in de functie "loop" plaatsen. De herhaling verwacht je niet in de funtie "setup"
Gestructureerd programmeren begint met transparantie.

Wees blij dat er een Arduino omgeving is. Anders had je alles zelf moeten programmeren. Zoals het zetten van allerlei registers etc. En zelfs voordat main() begint gebeurt er ook van alles. Bij C++ en C wordt er direct gewerkt via main(). Maar ook daar zou je een setup() en loop() constructie kunnen opzetten.
Zonder die omgeving was de Arduino nooit zover gekomen zoals het nu is. Alleen slaan mensen zo ongeveer alle tutorials over.. Tja... Dan begrijp je er weinig van.

Voor C# is het een ander verhaal. Daar zit vaak een hele engine onder die er onder andere voor zorgt dat je bijv. op OSx, Windows en Linux kan draaien. Ik zie C# altijd als de tegenhanger voor JAVA.

En voor wat dat laatste betreft....
Gestructureerd programmeren begint bij mij met "eerst denken en dan doen".

Janhou:
Dat zaken niet zichtbaar zijn maakt het per definitie diffuus. Is dit alleen voor de Arduino zo of is dit ook bij C# of C++ ?

Het is wat het is in de Arduino wereld; als je in gedachte houdt dat het Arduino team besloot om het leven voor een beginnende programmeur gemakkelijker te maken was het een logische keuze.

Maar ja, als je als beginnende programmeur een normale C/C++ handleiding volgt, kan het verwarrend zijn.

Janhou:
Voor de beginnende programmeur zou ik dan toch de printopdracht in de functie "loop" plaatsen. De herhaling verwacht je niet in de funtie "setup"

Ik vemoed dat je niet helemaal begrijpt hoe het programma dat je laat zien werkt. Er is geen herhaling in setup().

Er is een print opdracht (hello, world!) in setup() die een keer wordt uitgevoerd omdat setup() maar een keer wordt aangeroepen vanuit main(); er is een print opdracht in loop() (millis() / 1000) die iedere keer wordt aangeroepen wanneer loop() wordt aangeroepen vanuit main().

Janhou:
Gestructureerd programmeren begint met transparantie.

Transparantie is veel te gecompliceerd voor de beginner. Als je transparantie wilt ben je waarschijnlijk beter af met Atmel Studio of een fatsoenlijke tekst bewerker (vi, notepad++) en command-line voor het compileren.

Je kunt altijd je eigen main() schrijven en die in je sketch zetten.

int main(void)
{

}

En vervolgen daar op verder bouwen :slight_smile: En niet huilen als je code wilt overzetten van bv en 328P processor (bv Uno) naar bv een 32U4 processor (bv Leonardo) en een gedeelte moet herschrijven.

Heldere uitleg.
"Setup" heeft voor mij een intieel karakter. Het is net als de tafel dekken en alvast beginnen met het voorgerecht