Arduino Timer/Counter

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
zoli_varga
DrótVégénSzéndarab
Hozzászólások: 20
Csatlakozott: 2009. november 9. hétfő, 7:00

Hozzászólás Szerző: zoli_varga »

Üdv!

Szerintem a megoldás ASM számlálóciklus 8bit timerrel?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

ASM? Ágyú - veréb?
Avatar
zoli_varga
DrótVégénSzéndarab
Hozzászólások: 20
Csatlakozott: 2009. november 9. hétfő, 7:00

Hozzászólás Szerző: zoli_varga »

Külső HW nélkül hogyan lehetne még?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Ott a PC, amin a SW készül:)
- hangkártya,
- USB-s illesztő az áramkörön,
- mikrofon,
- USB-s eszközök garmadája :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Ötlet:

Kód: Egész kijelölése

void signaltime() 
 { 
   TimeOfSignal = micros(); 
   if (Mode != CalibrationMode) 
    { 
     action = 1; 
    } 
   SignalCounter++; 
 }

 // Futás időmérés
 unsigned long starttime;
 unsigned long endtime;
 unsigned long time;
 
 starttime = micros();
  for (int i=0; i < 100; i++){
      signaltime(); // meghívjuk 100*
      nop;
   } 
 endtime = micros();
 time = (endtime - starttime) / 100; // Átlagot számolunk


  starttime = micros();
  for (i=0; i < 100; i++){nop;} 
 endtime = micros();
 
 time = time - ((endtime - starttime) / 100); // Kivonjuk az üres ciklus időt

 Serial.println(time);
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. november 28. szerda, 10:19-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A 2. for ciklust a forídtó kioptimalizálja. (?)
Ide érdemes egy ASM betétet berakni, mely tartalma NOP (üres utasítás).
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Hozzászólás Szerző: GPeti »

Lenne egy kérdésem, ez mit jelent?
// Disable standard Arduino interrupts used for timer etc. (you can clearly see the text flicker if they are not disabled)
TIMSK0=0;
TIMSK1=0;
TIMSK2=0;

Olyan skatch ami Arduino csak szinte a keret és C ben van írva.
Azért Arduino-s sorok is vannak benne.

Hogy van az megcsinálva hogy van a .ino file behúzza a többit is pl:
output.h , gps.ccp ?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

2 módon:

1, rendszerfüggvény és fordításkor automatikusan betölti
2, include-val behúzod a programba, mint library-t.
Lenne egy kérdésem, ez mit jelent?
// Disable standard Arduino interrupts used for timer etc. (you can clearly see the text flicker if they are not disabled)
TIMSK0=0;
TIMSK1=0;
TIMSK2=0;
Google translate? :twisted:

Timert kikapcsolja (Timer0, Timer1 és Timer2-t is). Viszont regiszter szinten (alacsony szinten) teszi meg. Ezért megsérti az Arduino szabályrendszert! Innentől az Arduino csak egy szerkesztő, ami beépítve tartalmaz egy C fordítót. meg pár függvénykönyvtárat, amit _neked_ kell teljesen átlátni és kézbentartani.
Olyan mintha lenne egy Forma-1es versenypályád (Arduino), és kimennél a forgalomba... (C, ill szabályszegések...)

A kikapcsolás oka, hogy ne villogjon a kijelző. A Timer leállításával az _öszes_ időzítési rutint felfüggesztetted. Az Arduino a millis(), microseconds() esetén a Timer0-t használja. És rengeteg függvénykönyvtár használ időzítést. Szóval az Arduino-t ezzel ki is lőtted...
Avatar
BraskoS
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2011. április 12. kedd, 6:00

Hozzászólás Szerző: BraskoS »

Nekem kapu48-al szemben az nem jutott eszembe, hogy a signaltime() elvégzéséhez szükséges idő ugyanannyi akár normál futás közben, akár a megszakításban fut. :-(

Üdv:
Sanyi
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Signaltime(), ha INTben van a be- és kilépés idejével is számolni kell!
Avatar
BraskoS
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2011. április 12. kedd, 6:00

Hozzászólás Szerző: BraskoS »

Sziasztok

Megmértem a futásidőt a kapu48 által javasolt módon, 7um jött ki.
De mivel ebben az INT-be történő be és kilépés ideje nincs benne, így csak igénybevettem egy külső HW-t. Csináltam régeben egy DSLR expozíció vezérlőt, az hardveresen teljesen megfelelő lett, csak a programot kellett átírni.
Mondjuk itt van is egy dolog amit nem értek:

Kód: Egész kijelölése

void loop() 
{
  digitalWrite (PIN_BULB4, HIGH);
  delayMicroseconds(200000);
  digitalWrite (PIN_BULB4, LOW);
  delayMicroseconds(200000);
}
Nos ez semmit nem csinál, viszont ha átírom:

Kód: Egész kijelölése

void loop() 
{
  digitalWrite (PIN_BULB4, HIGH);
  delay(200);
  digitalWrite (PIN_BULB4, LOW);
  delay(200);
}
akkor remekül működik.
Szóval így mérve 10us lett az eredmény.
Az egymás utáni értékek egyike mindíg a 200000us alatt a másik fölötte volt, gondolom az optocsatolónál a fel és a lefutás éle nem egyforma, ezért lehet. Kb 150 jel mérését átlagoltam.
A programot a korrekcióval ellátva újból mértem, így le is tudtam ellenőrizni a mérést.

Köszönöm a tanácsokat.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A paraméter 0...65535 közt lehet!
A200000 ennél több! Ezért hibás a működése...
Avatar
BraskoS
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2011. április 12. kedd, 6:00

Hozzászólás Szerző: BraskoS »

Igen, miután elküldtem a hozzászólást, utánaolvastam és is. legközelebb figyelmesebben kell olvasnom .-)
atilla
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2016. május 10. kedd, 18:35

Re: Arduino Timer/Counter

Hozzászólás Szerző: atilla »

Üdvözlet!

Kicsit elakadtam a kódomban.

Kód: Egész kijelölése

void setup()
{
  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  TCCR2A =  _BV(COM2A1) | _BV(WGM20) | _BV(COM2B1);
  TCCR2B = _BV(CS20);
  TCNT2 = 125;
  OCR2A = 126;
  OCR2B = 126;
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  TCCR1A =  _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10) | _BV(WGM13) | _BV(WGM12);
  TCCR1B = _BV(CS10);
  OCR1A = 126;
  OCR1B = 126;
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  TCCR0A =  _BV(COM0A1) | _BV(WGM00) | _BV(COM0B1);
  TCCR0B = _BV(CS00);
  TCNT0 = 50;
  OCR0A = 126;
  OCR0B = 126;
}

void loop()
{
}
A lényeg, hogy mind a 3 timernek azonos frekvencián kellene mennie, szinkronban egymáshoz képest. Az egyik timer az alap, a másik kettőnek a fázisát ehhez képest kellene állítanom. Ez most megy is, de a frekvencia nem megfelelő. Így 31316 hertzen megy. Kb a felére van szükségem. Hogyan tudnám a frekvencia állítását megtenni úgy, hogy a három timer szinkronban maradjon, és a fázis is állítható legyen? Kvarc cserével megy, de valami frappánsabbra gondoltam. Osztóval nem jó, mert ha 8-cal osztom, akkor az meg már kevés.

Köszi.
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Arduino Timer/Counter

Hozzászólás Szerző: csabeszq »

A fastpwm móddal tetszőleges frekvencia beállítható.
A TCNT regiszterrel meg fázist lehet állítani.

Érdemes a neten példákat nézegetni és a timer leírását elolvasni. Atmel Studioval meg szimulátorral ki is próbálhatod.
Válasz küldése