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
Tartózkodási hely: 2119, Pécel

HozzászólásSzerző: zoli_varga » 2012. november 27. kedd, 20:10

Üdv!

Szerintem a megoldás ASM számlálóciklus 8bit timerrel?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 27. kedd, 20:13

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
Tartózkodási hely: 2119, Pécel

HozzászólásSzerző: zoli_varga » 2012. november 27. kedd, 20:24

Külső HW nélkül hogyan lehetne még?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 27. kedd, 21:58

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: 3321
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2012. november 28. szerda, 3:33

Ö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: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 28. szerda, 8:30

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
Tartózkodási hely: Tápiószőlős

HozzászólásSzerző: GPeti » 2012. november 28. szerda, 17:57

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: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 28. szerda, 18:29

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
Tartózkodási hely: Miskolc
Kapcsolat:

HozzászólásSzerző: BraskoS » 2012. november 28. szerda, 20:26

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: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. november 28. szerda, 20:46

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
Tartózkodási hely: Miskolc
Kapcsolat:

HozzászólásSzerző: BraskoS » 2012. december 1. szombat, 18:25

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: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. december 1. szombat, 18:35

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
Tartózkodási hely: Miskolc
Kapcsolat:

HozzászólásSzerző: BraskoS » 2012. december 1. szombat, 18:58

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: 61
Csatlakozott: 2016. május 10. kedd, 18:35

Re: Arduino Timer/Counter

HozzászólásSzerző: atilla » 2016. május 12. csütörtök, 17:58

Ü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: 676
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Arduino Timer/Counter

HozzászólásSzerző: csabeszq » 2016. május 15. vasárnap, 21:14

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.


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég