Normalt att det blir bugg om man anropar funktion i funktion
Re: Normalt att det blir bugg om man anropar funktion i funk
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.
Wiring har free array, malloc, sizeof(), struct, enum, vilket inte C++ har.
Re: Normalt att det blir bugg om man anropar funktion i funk
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.
Och jo du använder klasser, troligen utan att du vet om det.
Re: Normalt att det blir bugg om man anropar funktion i funk
Hur då använder jag klasser utan att ens skriva class?
- 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
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: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.
(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 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 !=
Re: Normalt att det blir bugg om man anropar funktion i funk
Tackar!
Jag ser metodiken och tanken hur man ska kunna mäta av.
Jag ser metodiken och tanken hur man ska kunna mäta av.

Re: Normalt att det blir bugg om man anropar funktion i funk
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!
Nollställs StartTime varje gång inbyggda funktionen micros(); körs?
EDIT2:
Tydligen gjordet den inte det.
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);
EDIT2:
Tydligen gjordet den inte det.
Senast redigerad av Al_Bundy 5 maj 2014, 22:57:52, redigerad totalt 1 gång.
Re: Normalt att det blir bugg om man anropar funktion i funk
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.

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);
}
Re: Sv: Normalt att det blir bugg om man anropar funktion i
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
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
Re: Normalt att det blir bugg om man anropar funktion i funk
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.Så en uC jobbar inte konstant tid trots evighetsloop?
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.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.
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.
Re: Normalt att det blir bugg om man anropar funktion i funk
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
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

Re: Normalt att det blir bugg om man anropar funktion i funk
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.
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.
Re: Normalt att det blir bugg om man anropar funktion i funk
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.
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.