Normalt att det blir bugg om man anropar funktion i funktion

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Wiring är mer likt C än C++ och är inte "kraftigt förenklat". Wiring kör inga klasser.

Wiring har free array, malloc, sizeof(), struct, enum, vilket inte C++ har.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46974
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av TomasL »

Wiring ÄR en kraftigt förenklad variant av C++, det säger i alla fall upphovsmännen till det.
Och jo du använder klasser, troligen utan att du vet om det.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Hur då använder jag klasser utan att ens skriva class?
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Magnus_K »

Al_Bundy skrev: Men nu behöver jag hjälp med att räkna ut hur lång tid det tar för processorn att räkna tiden det tar för att hämna in information från DS18B20, två stycken faktiskt. Kanske är ointressant.
Tror inte det är så här man normalt gör men det är i alla fall det första som föll mig in:
(Observera att jag egentligen inte vet vad jag håller på med och koden är ytterst otestad)

Kod: Markera allt

unsigned long StartTime;
unsigned long StopTime;
unsigned long SignalTxRxTime;


long TakeTime(){

	StartTime = micros();					           //Place system clock value in variable

	SensorData = 0;						              //Zero sensor data
	sensor.RequestData();				              //Request sensor data

	void loop(){
		if(sensordata != 0)				             //If sensordata is not 0, then proceed
			{					
			StopTime = micros();			            //Set stop-time       
			SignalTxRxTime = StartTime - StopTime;   //Subtract stop-time from start-time
			Serial.Print(SignalTxRxTime);			   //Print the result from above
			sensordata = 0;					           //Zero sensordata again
			}
}
Det saknas lite delar som tex hur den begärda tempen flyttas till "sensortemp" variablen men alla dessa syntax kan du bättre än jag.

Det finns säkert både enklare och bättre sätt än detta men så hade jag provat om jag satt i djungeln utan internet.
Databladet förtäljer ju också en hel del som rör detta....

EDIT: Lagt till ; samt ändra > till !=
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Tackar!
Jag ser metodiken och tanken hur man ska kunna mäta av. :)
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Det var fint och tappert försök du gjorde, men jag insåg att det är ganska svårt att vara exakt så jag höftar på en delay på 500 millisekunder, vilket blir ca 1 sekund delay då på riktigt.

Det enda nackdelen är att felvärdet ökar desto längre jag kör.
Det var tiden jag skulle räkna ut för att skicka en signal till DS18B20 temperatursensor och tillbaka till processorn. :?

EDIT: Kom på en nu!

Kod: Markera allt

unsigned long StartTime;
StartTime = micros();  // start the clock in milliseconds
sensors.requestTemperatures(); // call the sensors
new_delay = 1000 - StartTime;
delay(new_delay);
Nollställs StartTime varje gång inbyggda funktionen micros(); körs?

EDIT2:
Tydligen gjordet den inte det.
Senast redigerad av Al_Bundy 5 maj 2014, 22:57:52, redigerad totalt 1 gång.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av jesse »

Det står väl i dokumentationen.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Jag testade mig fram! :)

Jag har gjort en kod en är ungefär som jag hade räknat med. Felvärde desto längre tid går mot oändligheten. Ca +-5 sekunder fel på en minut. Så en uC jobbar inte konstant tid trots evighetsloop?

Men jag kan inget göra mera. Vet inte hur jag ska räkna ut tiden det tar för att köra en funktion.

Kod: Markera allt

unsigned long StartTime;
unsigned long new_delay;
unsigned long EndTime;

void setup()
{
  Serial.begin(9600);
  
}

void loop()
{
  StartTime = millis();  // start the clock in milliseconds
  delay(100); // the sensor delay
  EndTime = millis();
  new_delay = EndTime - StartTime;
  delay(1000 - new_delay);
  Serial.println(1000 - new_delay);
}

Zeela
Inlägg: 176
Blev medlem: 28 augusti 2008, 11:23:49
Ort: Åtvidaberg
Kontakt:

Re: Sv: Normalt att det blir bugg om man anropar funktion i

Inlägg av Zeela »

Vad är det som blir fel? Visa gärna outputen från en körning.

Om det där är hela programmet så ska det fungera.... och det som kommer vi seriesnöret borde vara runt 900 varje gång
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46974
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av TomasL »

Så en uC jobbar inte konstant tid trots evighetsloop?
Jo det gör den, om klockan använder kristall, Om det är en RC-oscillator som genererar klockan kommer den att variera några procent, beroende på bl.a. temperatur.
Men jag kan inget göra mera. Vet inte hur jag ska räkna ut tiden det tar för att köra en funktion.
I många IDEer finns möjlighet att ta tid mellan två brytpunkter, på så sätt kan man ta reda på hur lång tid en funktion tar att köra.

För att få rätt tidsfördröjningar finns ett antal alternativ.
Ett är att titta på assemblerkoden, och räkna instruktioner.
Ett annat alternativ är att använda de inbyggda fördröjningsfunktionerna som brukar finnas i medföljande bibliotek.
Ett tredje alternativ är att använda en inbyggd hårdvarutimer och interrupt.
Ett fjärde är att använda coretimer eller motsvarande om processorn i fråga stöder detta.
Ett femte är att skapa en loop i asm, anropa den ett antal gånger.
Ett sjätte alternativ är att skapa en loop i C, använda IDE'ts inbyggda tidtagningsfunktion.

Det finns många sätt att fixa det på, dock blir det aldrig noggrannare än klockoscillatorn.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Aj då.
Då tror jag att jag får låta det allt vara. Jag vet att det är noggrant med att vara exakt med tiden, men denna ska mest bara vara på ett ca ungefär.

Så nästa gång kör jag oscillator på 16 Mhz om jag ska hålla koll på tiden :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av sodjan »

Det du frågade tidigare om var att ta tid på 1-Wire rutinerna.
Jag vet inte säkert hur det är med DS-tempgivarna, men det
kan ju vara så att det finns tider som inte går att bräkna
enbart genom att titta på koden, t.ex om processorn väntar
på en konvertering eller något liknande. Och sannolikt är del
helt olämligt att ha sådana rutinern under tiden som man
har något slags tidtagning i själva koden.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av jesse »

I längden blir det ohållbart att försöka räkna ut hur lång tid olika programsnuttar tar för att på så vis försöka hålla reda på vad klockan är. Det enda vettiga är att man räknar tiden med en inbyggd timer. Det är därför den kallas timer och det är denna man använder.

Vid uppstart konfigurerar du och startar upp timern.
Det normala är att man sedan låter timern skapa ett interrupt när en viss tid gått (t.ex 1 millisekund)
I interruptet kan du göra olika saker:

Göra en klocka: ha en global variabel som räknar från 0-999. När den blir 1000 sätter du den till 0 igen och räknar då upp en ny variabel , som t.ex. går från 0 -60 (sekunder) osv...

Genom att läsa av variablerna har du exakt tid hela tiden.
En sak till man kan göra i interruptet är att sätta flaggor. (Flagga = varabel som signalerar ett visst tillstånd)
Varje gång sekund-räknaren räknar upp sätter du en flagga till TRUE i interruptet.
Ute i "programmet" kollar du sedan denna flagga så ofta som möjligt. Så fort den är TRUE så går utför du en viss funktion som ska utföras exakt en gång per sekund. I funktionen måste du även nollställa flaggan, annars utförs den ju igen nästa gång den kollas.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av Al_Bundy »

Kanske en 555 timer ?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46974
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Normalt att det blir bugg om man anropar funktion i funk

Inlägg av TomasL »

SUCK
Skriv svar