Využitie micros pre tisíciny času

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

martinius96

Využitie micros pre tisíciny času

Príspevok od používateľa martinius96 » 08 Sep 2017, 14:36

Ahojte, snažím sa prísť nato ako čo najjednoduchšie dať do kódu tisíciny času. Momentálne sa využívajú desatiny s millisom. Boli by ste mi ochotní polopate vysvetliť prípadne čosi doplniť do kódu aby som to pochopil a využívalo to tisíciny času? NIkdy som ešte s časom nepracoval a všetko, čo som sa snažil doplniť tak nefunguje.

Kód: Vybrať všetko

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR    0x3F  // Define I2C Address where the PCF8574A is
                          // Address can be changed by soldering A0, A1, or A2
                          // Default is 0x27

// map the pin configuration of LCD backpack for the LiquidCristal class
#define BACKLIGHT_PIN 3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

LiquidCrystal_I2C lcd(I2C_ADDR,
                      En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin,
                      BACKLIGHT_PIN, POSITIVE);

const int spustacresettlacidlo = 12;     //The pin for spustacresettlacidlo

long lastPressedspustacresettlacidlo = 0;    //Last millisecond we pressed spustacresettlacidlo

boolean run = false;         //Should the system run?

int spustacresettlacidloState = LOW;      //The value the spustacresettlacidlo reads
int spustacresettlacidloCurrState = LOW;  //The last value of spustacresettlacidlo



long timer = 0; //The timer

int second = 0;
int minute = 0;
int tenth = 0;

 
void setup() {
  lcd.begin(20, 4);                // intialise the LCD.
     lcd.setBacklight(HIGH); // Turn on backlight, LOW for off
  pinMode(spustacresettlacidlo, INPUT);
  lcd.setCursor(0,0);
  lcd.print("00:00:0 L");
   lcd.setCursor(0,1);
   lcd.print("00:00:0 P");

}

void tickClock() {
  Serial.println(millis() /10);
  if((timer - millis()/100) >= 100 || timer == 0) {
    tick();
    timer = millis()/100;
  }
}

void loop() {
  tickClock(); //Start ticking the clock
  spustacresettlacidloState = digitalRead(spustacresettlacidlo);
  checkStart();
}

void checkStart() {
  if(spustacresettlacidloState != spustacresettlacidloCurrState) {    //Check if the button state has changed
    if(spustacresettlacidloState == HIGH && (millis()-lastPressedspustacresettlacidlo) > 100 || lastPressedspustacresettlacidlo == 0) {
      lastPressedspustacresettlacidlo = millis();
      run = !run; //Switch the running state
    }    
  }
  spustacresettlacidloCurrState = spustacresettlacidloState;    //Set the current state equals the button state
}


void tick() {
  if(run) {
    updateLCD();
    
    
    
    if(tenth == 9) {
      tenth = 0;
      
      if(second == 59) {
        second = 0;
        minute++;
        
      } else {
        second++;
      }
    } else {
    tenth++;
    }
  }
}

void updateLCD() {
  //
   lcd.setCursor(0,0);
  if(minute < 10) {      // If hour does not have 2 digits
    lcd.print("0");
  }
  lcd.print(minute, DEC);
  lcd.print(":");

  if(second < 10) {    // If minute does not have 2 digits
    lcd.print("0");
  }
  lcd.print(second, DEC);
  lcd.print(":");

  lcd.print(tenth, DEC); 
  //
  lcd.setCursor(0,1);
  if(minute < 10) {      // If hour does not have 2 digits
    lcd.print("0");
  }
  lcd.print(minute, DEC);
  lcd.print(":");

  if(second < 10) {    // If minute does not have 2 digits
    lcd.print("0");
  }
  lcd.print(second, DEC);
  lcd.print(":");

  lcd.print(tenth, DEC); 
}
Diky za rady. Viem poslať aj knižnicu, ak by vam to nešlo skompilovať.
Obrázok

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12407
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Využitie micros pre tisíciny času

Príspevok od používateľa boraicho » 08 Sep 2017, 14:45

Haha, kasli na kniznice. Precitaj si v ds ako sa zapina 16bit timer a pouzi ho. Ale na tisiciny potrebuje aj velku rychlost hodin. 16?32? Mhz? Nechce sa mi to pocitat...
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

martinius96

Re: Využitie micros pre tisíciny času

Príspevok od používateľa martinius96 » 08 Sep 2017, 15:00

Kiežby bol niekde sketch aj s LCD displejom, že by to aspoň počítalo ten čas a ja by som si s tým už potom vedel spraviť ostatné.

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: Využitie micros pre tisíciny času

Príspevok od používateľa bobo87 » 08 Sep 2017, 15:02

Taky jednoduchy napad: nastavit niektory z timerov, aby vyvolaval prerusenie povedzme v intervale 1ms. A v tom preruseni len inkrementujes nejaku vhodnu (napr. uint32_t) premennu, ktora bude obsahovat systemovy "cas" s pozadovanym rozlisenim. A na citanie tejto premennej (kedze robis len s 8 bitom), vyrobis nejaku jednoduchu funkciu napr. getSystemTime, ktora zariadi spravne citanie tejto premennej (aby sa popri citani nezmenila v preruseni).
0
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2572
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Využitie micros pre tisíciny času

Príspevok od používateľa maskrtnik01 » 08 Sep 2017, 15:35

Martinius, keď to s programovaním MCU myslíš vážne, mal by si si odvyknúť od toho, že všetko dá nejaká Arduino knižnica.
Veľakrát treba priamo narábať s registrami, maximálne nejaký peripheral driver.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Využitie micros pre tisíciny času

Príspevok od používateľa jirka.jirka. » 08 Sep 2017, 15:45

bobo87 napísal:Taky jednoduchy napad: nastavit niektory z timerov, aby vyvolaval prerusenie povedzme v intervale 1ms. A v tom preruseni len inkrementujes nejaku vhodnu (napr. uint32_t) premennu, ktora bude obsahovat systemovy "cas" s pozadovanym rozlisenim. A na citanie tejto premennej (kedze robis len s 8 bitom), vyrobis nejaku jednoduchu funkciu napr. getSystemTime, ktora zariadi spravne citanie tejto premennej (aby sa popri citani nezmenila v preruseni).
Njn. Ale tady už to zavání programováním. :D Ne jenom

Kód: Vybrať všetko

#include "arduino.h" 
ahoj svete. 
a display ukáže ahoj svete. :D

Tak jak zde píšou. Jestli to myslíš Martine vážně, tak železo od arduina používej (je to dokonce skvělý pomocník), protože připojíš USB nastavíš ATMEL STUDIO a programuješ v čistém C.

Teprve potom už to začíná být zábavné.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Využitie micros pre tisíciny času

Príspevok od používateľa peterple » 08 Sep 2017, 20:10

bobo87 napísal:Taky jednoduchy napad: nastavit niektory z timerov, aby vyvolaval prerusenie povedzme v intervale 1ms. A v tom preruseni len inkrementujes nejaku vhodnu (napr. uint32_t) premennu, ktora bude obsahovat systemovy "cas" s pozadovanym rozlisenim. A na citanie tejto premennej (kedze robis len s 8 bitom), vyrobis nejaku jednoduchu funkciu napr. getSystemTime, ktora zariadi spravne citanie tejto premennej (aby sa popri citani nezmenila v preruseni).
presne to čo si napísal vrátane toho správneho čítania robí milis(), tak načo si robiť vlastné? Ešte ti tam machri urobili aj korekciu aby to bola v priemere čo najpresnejšia milisekunda. Nakoľko z hw arduina 8 bitovým čítadlom presná milisekunda urobiť nejde.

martinius96: vyrábať a používať micros je úplne vedľa.
martinius96 napísal:Ahojte, snažím sa prísť nato ako čo najjednoduchšie dať do kódu tisíciny času. Momentálne sa využívajú desatiny s millisom. Boli by ste mi ochotní polopate vysvetliť prípadne čosi doplniť do kódu aby som to pochopil a využívalo to tisíciny času? NIkdy som ešte s časom nepracoval a všetko, čo som sa snažil doplniť tak nefunguje.

Kód: Vybrať všetko

void tickClock() {
  Serial.println(millis() /10);
  if((timer - millis()/100) >= 100 || timer == 0) {
    tick();
    timer = millis()/100;
  }
}

void updateLCD() {
....

}
Nechce sa mi veriť že je to možné pri tvojich skúsenostiach.

Mohol by si sa prosím zamyslieť a odpovedať mi na zopár otázok?
  1. Čo vráti funkcia milis()?
  2. Čo robí funkcia tickClock() (to volanie tick() ignoruj, ako by tam ani nebolo)
  3. Koľko trvá než sa vykoná updateLCD()? Vieš to odhadnúť? alebo ešte lepšie zmerať? (buď nejakým kódom a zobraziť na seriák, alebo nejakým prístrojom)
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok