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 »

Sug på dig själv :D
Godnatt
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 »

Jag har tyvärr förlorat den röda tråden i tråden men något jag måste få klarhet i; Om TS söker "bästa" sätt att veta hur lång en funktion tar så får man det från att tyda/räkna den relaterade asm-koden men vill han istället ta tiden på en "extern" funktion så gör man detta bäst genom interupts och timers?

Sen tolkade jag detta som en engångsfunktion för att få en idé hur lång tid det tar för givaren att svara men jag missförstod det nog...
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 tror jag inte kan mäta exakt då jag saknar 16 Mhz kristallen. Jag kör med den interna 8 Mhz.
Nerre
Inlägg: 27229
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

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

Inlägg av Nerre »

Det är relativt enkelt att för hand räkna fram hur många instruktionscykler en viss kod tar. Från det kan kan räkna ut hur många klockcykler koden tar.

Då kan man skriva en kod (en loop t.ex.) som togglar en utgång, sen kopplar man ett oscilloskop (eller en frekvensräknare) till den utgången och mäter periodtiden.

Baserat på det kan man baklänges räkna ut klockfrekvensen.

Men sen är ju den interna oscillatorn kanske inte så stabil, så utan kristall kommer tiden kanske att diffa (men frågan är hur mycket, en diff på 1-2% är inte så farligt).
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 »

Nu har jag inget oscilloskop tyvärr men det blir väll så så småningom.

Jag blir bara nöjd om den kan räkna i sekunder och hålla jämn takt. Men den kunde inte det direkt.
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

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

Inlägg av Kaggen »

Al_Bundy skrev: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

...
  StartTime = millis();  // start the clock in milliseconds
  delay(100); // the sensor delay
  EndTime = millis();
  new_delay = EndTime - StartTime;
  delay(1000 - new_delay);     // <------ ???????????????????????? Vad gör denna rad ????????????????
  Serial.println(1000 - new_delay);
....
Varför kör du delay(1000 - new_delay)? Vad är den raden bra för?

Om du skall ta tid på en funktion kan du göra som typ nedan.

Kod: Markera allt

unsigned long StartTime;
unsigned long TotalFunctionTime;
unsigned long EndTime;

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

void loop()
{
  StartTime = millis();  // starttid
  delay(100); // <--- Funktionen vi tar tid på
  EndTime = millis();  // sluttid
  TotalFunctionTime = EndTime - StartTime; // Räkna ut tiden funktionen tagit. Total tid = sluttid - starttid
  Serial.println(TotalFunctionTime);
}
Förstår inte vad problemet är?

EDIT: Nu fattar jag. Du skall alltså få loopen att köra precis en sekund. Du kan ju kalibrera ner ditt värde i delay tills du kommer närmare. typ delay(900 - new_delay). Behöver nog ändras ett antal ggr för att finjusteras. Om det nu går att få bra öht.
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 »

Al_Bundy skrev:Kanske en 555 timer ?
Nej.
Använd någon av AVR-processorns inbyggda timers.
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 »

Nästa gång jag kör med tid så ska jag köra den där externa 16 Mhz oscillatorn.
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 »

Istället för den "interna kristallen"... :-)

Men, dina problem med tidmätningar har ingenting alls med det att göra.
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 »

Jaha? Nyss var det att om jag körde med en externa oscillatorn så kommer jag ha jämnare takt av läsning av koden.
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 »

När det gäller "klockan" för processorn så har du i princip två val:
- Intern oscillator. (Inte "intern kristall", som du skrev flera gånger)
- Extern kristall. (En "extern oscillator" en en helt annan sak...)

Enda skillnaden är att det är lite olika precision/noggranhet.

Problemet med din tidtagning var att du försökta "ta tid" genom
att justera och anpassa koden till att ta en viss tid. Det fungerar
lika dåligt oavssett vilket av alternativen ovan du använder.

Så ja, dina tidmätningsproblem har inte så mycket med valet mellan
intern oscillator eller extern kristall att göra. Du får samma problem
oavsett hur du gör. Att använda processorn timers är rätt väg.

En "gräj" med AVR är dock att, om man har ställt om processorn till
extern kristall (via "fuses"), så måste man också ha en kristall för
att kunna programmera om processorn via ISP igen. D.v.s för att t.ex
kunna ändra tillbaka den "fuse" som anger att kristall ska användas.
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 »

Har processorn en timer? Eller vad menar du?
sodjan skrev: En "gräj" med AVR är dock att, om man har ställt om processorn till
extern kristall (via "fuses"), så måste man också ha en kristall för
att kunna programmera om processorn via ISP igen. D.v.s för att t.ex
kunna ändra tillbaka den "fuse" som anger att kristall ska användas.

Jag har ställt in processorn för en 8 Mhz intern oscillator. Det finns kod tillgängligt på Arduinos hemsida.
Nu när jag har lyckats programmera AVR uC utan att använda mig av bootloader. Lyckas även radera bootloadern. Kan jag då använda vilka AVR uC då med min arduino?

Som du har sagt förr så spelar språket ingen roll, det man programmerar i. Så länge kompilatorn kan omvandla koden till binärtal så är det fullt möjligt att programmera. Om jag vill t.ex programmera en ATting45 för att använda som en liten processor som ska mäta volt och lysa med en LED diod. Är det bara för mig att totalt skita i bootloader och bara koppla upp MISO, MOSI, SCK, RST, VCC, GND på denna ATtiny med programmeraren och sen bränna över sketchen?

Jag vet att man måste ställa in vilken klockfrekvens man vill köra på och vilken "klocka" man vill använda, dvs den interna oscillatorn eller den externa oscillatorn.

Om jag vill programmera en ATmega328 med den interna oscillatorn så klistrar jag bara in detta i ett textdokument som heter boards.txt

atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock)

atmega328bb.upload.protocol=stk500
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=57600

atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05
atmega328bb.bootloader.path=arduino:atmega
atmega328bb.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F

atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.core=arduino:arduino
atmega328bb.build.variant=arduino:standard


Sen väljer jag bara "board" och sen bränner över sketchen, utan att använda mig av extern oscillator eller keramik kondensatorer. på 20-22 pF.

Men med tanke på att jag använder en mkii programmerare så behöver jag inte bootloader. Då behöver jag bara typ denna kod.

atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock)

atmega328bb.upload.protocol=stk500
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=57600

atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.core=arduino:arduino
atmega328bb.build.variant=arduino:standard


Eller hur fungerar det?
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 »

Läs databladet för processorn och handledningarna till ditt IDE och programmeraren, allt står säkert där.

Du måste naturligtvis också programmera konfigregistren (fuses)
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 »

Visst är det detta datablad du menar om vi syftar på ATmega328? Det fanns nämligen två. Ett stort och ett litet.

Om JA: Vilken typ av flik ska man leta i? Detta är som en nål i en höstack.

Tack.
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 »

Läs hela då.
Skriv svar