foutmeldingen in sprong opdrachten

algemene C code
Berichten: 14
Geregistreerd: 26 Jan 2013, 16:18

foutmeldingen in sprong opdrachten

Berichtdoor A.Voorn » 01 Feb 2014, 17:07

Ik ben een programma aan het maken voor een stappenmotor die een pomp aanstuurt.
het probleem wat zich voordoet als je de motor snel wil laten draaien is dat de uitvoer van de i2c display dusdanig langzaam is dat dit de motordelay tussen de stappen belemmerd.
In het onderstaande programma heb ik dit geprobeerd te ondervangen met sprong opdrachten maar ik loop vast op de volgende foutmeldingen.
Wie kan mij hierin wat duidelijkheid verschaffen hoe ik deze sprongen werkend kan krijgen.
bvd.
AD..
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014.ino: In function 'void loop()':
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014:84: error: jump to label 'pomp_aan_800_MS'
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014:39: error: from here
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014:79: error: crosses initialization of 'int analoog_A1'
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014:109: error: redeclaration of 'int analoog_A1'
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014:79: error: 'int analoog_A1' previously declared here
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014:116: error: jump to label 'pomp_aan_600_MS'
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014:41: error: from here
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014:79: error: crosses initialization of 'int analoog_A1'
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014:142: error: redeclaration of 'int analoog_A1'
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014:79: error: 'int analoog_A1' previously declared here
STAPPENMOTOR_BASIS_SNEL_006_29_01_2014:43: error: label 'pomp_aan_50_MS' used but not defined


///////////////////////////////////////////////////////////////////////////////////////////////////#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);

int motorPin1 = 8; // stepper sturing 1 = pen 11 = D8
int motorPin2 = 9; // stepper sturing 2 = pen 12 = D9
int motorPin3 = 10; // stepper sturing 3 = pen 13 = D10
int motorPin4 = 11; // stepper sturing 4 = pen 14 = D11
int delayTime = 0;
int uit = 1; // inverteer het signaal ivm relai input.
int aan = 0; // inverteer het signaal ivm relai input.
int relai_1 = 12; // relai-1 = pen 15 = D12
int relai_2 = 7; // relai-2 = pen 10 = D7
int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

void setup() {
lcd.init();
lcd.backlight();

pinMode(relai_1, OUTPUT);
pinMode(relai_2, OUTPUT);

pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
}
void loop() {
int analoog_A7 =analogRead(A7);

if (analoog_A7 <= 10) { goto pomp_uit;}

if ((analoog_A7 >= 10) && (analoog_A7 <= 51 )) lcd.clear(); lcd.setCursor(0,0); lcd.print(analoog_A7); lcd.print(" STAP 1. "); lcd.setCursor(0,2); lcd.print(" POMP_AAN "); lcd.setCursor(0,3); lcd.print(" 1000 MIL-SEC ");
digitalWrite (relai_1 , aan); {goto pomp_aan_1000_MS;}// hier stuur ik de display aan om geen interferentie te hebben op het pomp programma zelf.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ((analoog_A7 >= 52) && (analoog_A7 <= 103 )) lcd.clear(); lcd.setCursor(0,0); lcd.print(analoog_A7); lcd.print(" STAP 2. "); lcd.setCursor(0,2); lcd.print(" POMP_AAN "); lcd.setCursor(0,3); lcd.print(" 800 MIL-SEC ");
digitalWrite (relai_1 , aan); { goto pomp_aan_800_MS;}// hier stuur ik de display aan om geen interferentie te hebben op het pomp programma zelf.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ((analoog_A7 >= 104) && (analoog_A7 <= 155 )) { goto pomp_aan_600_MS;}
// etc.
if ((analoog_A7 >= 312) && (analoog_A7 <= 363 )) { goto pomp_aan_50_MS;}

pomp_uit:
lcd.clear();
lcd.setCursor(0,0);
lcd.print(analoog_A7);
lcd.print(" STAP 0. ");
lcd.setCursor(0,2);
lcd.print(" POMP_UIT ");
delay (500);
digitalWrite (relai_1 , uit);
return;
//======================================
pomp_aan_1000_MS:
// hier stuur ik de display (niet) aan om geen interferentie te hebben op het pomp programma zelf.
// want bij een lage delaytime gaat de display flikkeren en de motor stotteren omdat het door de uitvoer van de display word vertraagd.
delay(1000);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(1000);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(1000);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(1000);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
// hier kijk ik of de pomp moet doorpompem op dit programma of naar een ander moet springen.
int analoog_A1 =analogRead(A7);
if ((analoog_A1 >= 10) && (analoog_A7 <= 51 )) {goto pomp_aan_1000_MS;}
else
return;
//======================================
pomp_aan_800_MS:
// hier stuur ik de display (niet) aan om geen interferentie te hebben op het pomp programma zelf.
// want bij een lage delaytime gaat de display flikkeren en de motor stotteren omdat het door de uitvoer van de display word vertraagd.
digitalWrite (relai_1 , aan);
delay(800);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(800);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(800);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(800);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
// hier kijk ik of de pomp moet doorpompem op dit programma of naar een ander moet springen.
int analoog_A1 =analogRead(A7);
if ((analoog_A1 >= 52) && (analoog_A7 <= 103 )) {goto pomp_aan_800_MS;}
else
return;


//======================================
pomp_aan_600_MS:
// hier stuur ik de display (niet) aan om geen interferentie te hebben op het pomp programma zelf.
// want bij een lage delaytime gaat de display flikkeren en de motor stotteren omdat het door de uitvoer van de display word vertraagd.

digitalWrite (relai_1 , aan);
delay(550 );
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(600);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(600);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(600);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
// hier kijk ik of de pomp moet doorpompem op dit programma of naar een ander moet springen.
int analoog_A1 =analogRead(A7);
if ((analoog_A1 >= 104) && (analoog_A7 <= 155 )) {goto pomp_aan_600_MS;}
return;}
// etc..
//======================================
//pomp_aan_50_MS:
// lcd.clear();
// lcd.setCursor(0,0);
// lcd.print(analoog_A7);
// lcd.print(" STAP 7. ");
// lcd.setCursor(0,2);
// lcd.print(" POMP_AAN ");
// lcd.setCursor(0,3);
//
// digitalWrite (relai_1 , aan);

// for(int i = 7; i >= 0; i--)
//{
// setOutput(i);
// 4500= 5ml per minuut
// delayMicroseconds(1500);
// }
//}
//void setOutput(int out)
//{
// digitalWrite(motorPin1, bitRead(lookup[out], 0));
// digitalWrite(motorPin2, bitRead(lookup[out], 1));
// digitalWrite(motorPin3, bitRead(lookup[out], 2));
// digitalWrite(motorPin4, bitRead(lookup[out], 3));
//return;
//======================================
// }

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: foutmeldingen in sprong opdrachten

Berichtdoor nicoverduin » 01 Feb 2014, 17:35

Buiten de gekozen oplossingsrichting (waar ik nog wel een verschil van mening over heb :)) klopt het dat je meldingen krijgt van "redeclaration".
In jouw programma gebruik je dan binnen een 'scope' (= tussen accolades) een variabele meerdere keren wordt gedeclareerd. En dat klopt ook.

voorbeeld:
Code: Alles selecteren
// hier kijk ik of de pomp moet doorpompem op dit programma of naar een ander moet springen.
int analoog_A1 =analogRead(A7);
if ((analoog_A1 >= 10) && (analoog_A7 <= 51 )) {goto pomp_aan_1000_MS;}
else
return;
//======================================
pomp_aan_800_MS:
// hier stuur ik de display (niet) aan om geen interferentie te hebben op het pomp programma zelf.
// want bij een lage delaytime gaat de display flikkeren en de motor stotteren omdat het door de uitvoer van de display word vertraagd.
digitalWrite (relai_1 , aan);
delay(800);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(800);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(800);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(800);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
// hier kijk ik of de pomp moet doorpompem op dit programma of naar een ander moet springen.
int analoog_A1 =analogRead(A7);
if ((analoog_A1 >= 52) && (analoog_A7 <= 103 )) {goto pomp_aan_800_MS;}
else
return;

Er staat 2 x int analoog_A1 = binnen dezelfde scope (vanuit de compiler gezien). Je kan dit oplossen door het de eerste keer te laten staan en daarna int weg te laten. Immers hij bestaat al. Of je zet hem boven in jouw programma als int analoog; en laat voor de rest int weg.
Verder zou ik mijn best doen om meerdere statements in een regel te proppen vooral NIET DOEN!!!. Het maakt je programma lastig te lezen en niet uitnodigend voor een ander om door jouw code te spitten.

Hoewel GOTO niet verboden is, zijn er alternatieve routes (if (){} of switch of compleet ander design). GOTO is lastig te doorgronden voor anderen. Ik ga niet zover dat het "verboden" is. die discussie heb ik regelmatig gevoerd in de 70-80'er jaren met de invoering van meer gestructureerde talen. Er kunnen altijd redenen zijn om ervoor te keizen. In jouw geval.... tot op heden niet.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 14
Geregistreerd: 26 Jan 2013, 16:18

Re: foutmeldingen in sprong opdrachten

Berichtdoor A.Voorn » 02 Feb 2014, 11:28

Nico, bedankt voor je uitleg hier kan ik weer verder mee. Wat betreft meerdere statements op een regel daar heb je helemaal gelijk in en mijn manier van programmeren komt omdat ik zo eind 70-jaren in basic en turbo-pascal programmeerde en sinds kort dit weer heb opgepakt. Maar oude gewoontes zijn moeilijk af te leren.

AD..

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: foutmeldingen in sprong opdrachten

Berichtdoor nicoverduin » 02 Feb 2014, 12:00

Om je een beetje op weg te helpen:
- als je de code bekijkt, dan zijn de aansturingsroutines overal hetzelfde. Dus kan je er een subroutine van maken
- Echter je werkt hier met C/C++ dus wordt het een functie. bijvoorbeeld :
Code: Alles selecteren
void function stapMotor(delayTime){
    //
    // hie al die digital Writes (kom ik nog op terug)
    //
}


En dan in je code bijvoorbeeld stapMotor(1000);

Verder gebruik je delays en dat is dode tijd. De CPU zit dan te wachten en dat is zonde. daar is zeker een slimmere oplossing voor mogelijk gebruik makend van bijvoorbeeld millis.
Er zijn ook uitstekende stappenmotor libraries waarin je de snelheid aangeeft en in de loop ze gewoon aanroept. Als er niets te stappen valt komt de routine gelijk terug.
Mocht je snellere digitalWrites willen kun je gebruik maken van de libary DigitalIO. Die is ongeveer 50x zo snel als de standaard digitalWrite.

Nog ff en de Arduino zit 50% van zijn tijd uit zijn neus te peut.eren :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten