Warning: Illegal string offset 'name' in [path]/includes/functions.php on line 6439
Pulksteņu laiku sinhronizācija -
+
... 5 6 7 8 9

thread: Pulksteņu laiku sinhronizācija

  1. #61
    Senior Member
    Feb 2007
    Rīga
    983


    Daži tomēr atzīst visādus DXus, aliexpres, alibabas, jebajus, jo tur IR LĒTĀK. Pohuj ka mēnesi jāgaida. Tā vietā aizmirstam farneļus, mauzerus, digijekus, rs-electronikas, elfas-distrelekus,tme, vietējās bodītes. Galvenais ir lētāk. Vai sevi vairs nemaz necienam? Klientam var mēģināt iesmērēt lētāk. Vai pašam priekš sevis patīk kaut kas lēts? Personīgi man gribās vislabāko, nevis lētāko. Atvainojiet par žults izgāšanu, bet reizēm tā sauktie elektroniķi, patiesībā kaut kādi šarlatāni-santīmpisēji.
    Ja man pat ļoti vajag un/vai gribās, tad maksātu arī vairāk. Nesparotu kāpēc hobijam jāskaita naudu? Naudu jāskaita biznesā nevis hobijā. Izskatās pēc totāla pašcieņas trūkuma.
    Ja JDat dzīvotu kaut kur rietumos, šī brēkāšana būtu saprotama. Bet dzīvojam LV ar LV-algām; hobijam (burtiski: vaļaspriekam) var atļauties tērēt tik
    cik varam.
    var jau nostāties pozā un brīvajā laikā sūkt šnabīti, tam naudas pietiks.
    Sorry, offtopiks...
    Viena galva labi, divas nav smuki (uz viena rumpja).

  2. #62
    Senior Member
    Nov 2009
    Jēkabpils
    2,058

    Vienā no autora abām tēmām bija uzdots jautājums man par SI4432 latenci. Sorry, ka tik ilgi neatbildēju Tam SI4432 nav 5V tolerantās kājas atšķirībā no nrf. Un bez tam Arduino es ciest nevaru Bet nu, tā kā mani arī ieinteresēja šīs lietiņas, tad tika savērti divi nano ar SI caur līmeņu čeindžeriem.

    TIMER1 nonstopā skaita tikšķus (tikšķus nevis mikrosekundes!). Vienā mainīgajā (pirmā kolona) ierakstu TCNT1 vērtību pirms padodu SI komandu sūtīt paketi, otrā mainīgajā (otrā kolona) vērtība tiek ierakstīta, kad notiek INT1 pārtraukums no uztvērēja SI GPIO0 kājas - Sync Word Detected. Nu trešā kolona ir šo starpība izdalīta ar 16.
    Uztvērējs:
    :
    #include "SI4432.h"
    #include <util/delay.h>
    
    volatile uint8_t nirq;
    
    ISR(INT1_vect)
    {
      
    }
    
    int main(void)
    {
      uint8_t int1;
      
      PORTD = (1<<PD3);
      PORTB |= (1<<PB1); //NIRQ
      PORTD |= (1<<PD7); DDRD = (1<<PD7); //LED
      _delay_ms(500);
      PORTD &= ~(1<<PD7);
      _delay_ms(2000);
      //EICRA = (1<<ISC10); //INT1 falling edge
      //EIMSK = (1<<INT1);
      
      spi_init();
      
      if(SI4432_reg_read(REG_DEV_TYPE)==0b00001000)
      {
        PORTD |= (1<<PD7);
        _delay_ms(100);
        PORTD &= ~(1<<PD7);
      }
      _delay_ms(500);
    
      if(SI4432_reg_read(REG_DEV_VERSION)==0b00000110)
      {
        PORTD |= (1<<PD7);
        _delay_ms(100);
        PORTD &= ~(1<<PD7);
      }
      _delay_ms(500);
       
      SI4432_set_interrupts(0x00, INT2_ENABLE_CHIP_READY);
      SI4432_clear_interrupts();        
      SI4432_reg_write(REG_STATE, STATE_SOFTWARE_REGISTER_RESET);
      _delay_ms(10);
      int1 = SI4432_reg_read(REG_INT_STATUS2);
      if(int1 & INT2_ENABLE_CHIP_READY)
      {
        SI4432_init();
        while(1)
        {
          SI4432_reg_write(REG_STATE, STATE_READY_MODE);
          SI4432_set_interrupts(INT1_STATUS_CRC_ERR + INT1_STATUS_VALID_PACKET_REC, 0x00);  
          SI4432_clear_interrupts();
          SI4432_reg_write(REG_STATE, STATE_RX_ON_MANUAL_RECIEVER_MODE);
          while(PINB&(1<<PB1));
          SI4432_reg_write(REG_STATE, STATE_READY_MODE);
          int1 = SI4432_reg_read(REG_INT_STATUS1);
          if(int1 & INT1_STATUS_VALID_PACKET_REC)
          {
              if((SI4432_reg_read(REG_RECEIVED_LENGTH) == 1) && (SI4432_reg_read(REG_FIFO) == 0x55))
              {
                PORTD |= (1<<PD7);
                _delay_ms(100);
                PORTD &= ~(1<<PD7);
              }
          }
          SI4432_reset_rx_fifo();
        }
      }
    }
    Raidītājs:
    :
    #include "SI4432.h"
    #include <util/delay.h>
    
    volatile uint32_t tim1_ovf_count = 0;
    volatile uint16_t startTime_lowWord = 0, endTime_lowWord = 0;
    
    ISR(TIMER1_OVF_vect)
    {
      tim1_ovf_count++;
    }
    
    ISR(INT1_vect)
    {
      endTime_lowWord = TCNT1;
    }
    
    int main(void)
    {
      uint8_t int1;
      Serial.begin(115200);
      
      TCCR1B = (1<<CS10);
      TIMSK1 = (1<<TOIE1);
      
      PORTD = (1<<PD3);
      PORTB |= (1<<PB1); //NIRQ
      PORTD |= (1<<PD7); DDRD = (1<<PD7); //LED
      _delay_ms(500);
      PORTD &= ~(1<<PD7);
      _delay_ms(2000);
      EICRA = (1<<ISC10)|(1<<ISC10); //INT1 raising edge
      EIMSK = (1<<INT1);
      sei();
      
      spi_init();
      
      if(SI4432_reg_read(REG_DEV_TYPE)==0b00001000)
      {
        PORTD |= (1<<PD7);
        _delay_ms(100);
        PORTD &= ~(1<<PD7);
      }
      _delay_ms(500);
    
      if(SI4432_reg_read(REG_DEV_VERSION)==0b00000110)
      {
        PORTD |= (1<<PD7);
        _delay_ms(100);
        PORTD &= ~(1<<PD7);
      }
      _delay_ms(500);
      
      SI4432_set_interrupts(0x00, INT2_ENABLE_CHIP_READY);
      SI4432_clear_interrupts();        
     
      SI4432_reg_write(REG_STATE, STATE_SOFTWARE_REGISTER_RESET);
      _delay_ms(10);
      int1 = SI4432_reg_read(REG_INT_STATUS2);
      if(int1 & INT2_ENABLE_CHIP_READY)
      {
        SI4432_init();
        while(1)
        {
          SI4432_reg_write(REG_STATE, STATE_READY_MODE);
          SI4432_reg_write(REG_PKG_LEN, 1); 
          SI4432_reg_write(REG_FIFO, 0x55);
          SI4432_set_interrupts(INT1_STATUS_PACKET_SENT, 0x00);     
          SI4432_clear_interrupts();
          cli();
          startTime_lowWord = TCNT1;
          sei();
          SI4432_reg_write(REG_STATE, STATE_TX_ON_MANUAL_TRANSMIT_MODE); 
          while(PINB&(1<<PB1));
          SI4432_reg_write(REG_STATE, STATE_READY_MODE);
          int1 = SI4432_reg_read(REG_INT_STATUS1);
          if(int1 & INT1_STATUS_PACKET_SENT) PORTD |= (1<<PD7);
          _delay_ms(200);
          PORTD &= ~(1<<PD7);
          _delay_ms(1000);
          Serial.print(startTime_lowWord);
          Serial.print("\t");
          Serial.print(endTime_lowWord);
           Serial.print("\t\t");
          Serial.println((endTime_lowWord - startTime_lowWord)>>4);
          _delay_ms(1000);
        }
      }
    }
    Sorry, ka nav komentāru. Šis nav rakstīts nopietnai lietošanai. Ja interesē, tad varu pakomentēt.

    Esmu gatavs sagaidīt pārmetumus par kļūdaino realizāciju.

  3. #63
    Moderator
    Jan 2009
    Rīga
    4,423

    Te kāds apraksts, pēc kura, cik es sapratu, WiFi iekārtas jau pašas sevi sinhronizē. Izskatās, ka pat dzelža līmenī. Visu gan nesapratu no tā raxta.
    https://en.wikipedia.org/wiki/Timing...ation_Function
    Nu vo. Klāt pieli pēdējā brīža "bonus track". Saucās: Kurš meklē, tas atrod. Interesanta fīča. Paliek jautājums: vai no ESP var nolasīt TSF. Tas būtu diezgan inčīgi un noderīgi.

    Atgriežoties pie DIY. Palaidu uz propellera savi NTP interpetāciju.
    Dotajā brīdī delta (latence) ir 2800 cikli +/-550 cikli, jeb 350 uS +/- 69 uS. Interesanti ka latence ir tikai divi skaitļi vai nu 2304 vai 3408 cikli. Kpaēc pieminu ciklus? Tāpēc ka MCu clock=80 MHz un ar tādu frekvenci skaita master timer, jeb ciens cikls=0.125 uS
    Thau (kavēšana) star klientu un serveri ir: 174250 cikli +/ 350 cikli, jeb 21.78 mS +/- 43 us. Kaut kas manšajos ciparos ļoti nepatīk. Prasās izmēģināt ASM versiju, jo SPIN interpretators varētu būt pārāk lēns, par at visām hardcore optimizācijām. Varbūt arī kaut kuc esmu pielaidis fundamentālu kļūdu.

  4. #64
    Moderator
    Jan 2009
    Rīga
    4,423

    TIMER1 nonstopā skaita tikšķus (tikšķus nevis mikrosekundes!). Vienā mainīgajā (pirmā kolona) ierakstu TCNT1 vērtību pirms padodu SI komandu sūtīt paketi, otrā mainīgajā (otrā kolona) vērtība tiek ierakstīta, kad notiek INT1 pārtraukums no uztvērēja SI GPIO0 kājas - Sync Word Detected. Nu trešā kolona ir šo starpība izdalīta ar 16.
    Esmu gatavs sagaidīt pārmetumus par kļūdaino realizāciju.
    Da pofig visi tie komentāri!

    Gribi teikta ka tev ir:
    i1) nano uz 16 MHz kvarca/kream. rezonatora
    i2) viens tiksķis ir ekvivalents 16 MHz?
    i3) Starpība ir ~ +/- 1 uS (mikrosekunde)?
    i4)
    :
    if (i1 && i2 && i3) {eju_atspārdīties();}

  5. #65
    Senior Member
    Nov 2009
    Jēkabpils
    2,058

    Aha, nano uz 16MHz, 16 bitu taimeris skaita bez dalītāja.
    Nu tā sanāk, ka +/- 1 us.
    Nesapratu, kas ar to "if" domāts, bet tas galīgi nav svarīgi. Notikums Sync Word Detected jau sen ir noticis, vienkārši, pārliecināmies, ka pakete ir 1 baitu gara un tas baits ir 0x55. edit: sapratu, laikam miegs nāk, lēnā pielekšana

    Datareits tam SI gan ir iemests kāut kāds neatceros kāds, vnk paņēmu no citas vietas copy/paste. Rīt paņemšu to viņu Excelgrāmatu un paspēlēšos ar ātrumiem un modulācijām...

  6. #66
    Moderator
    Jan 2009
    Rīga
    4,423

    Nesapratu, kas ar to "if" domāts, bet tas galīgi nav svarīgi.
    Ja noteikumi i1-i3 izpildās, tad eju atspārīties. Kaspičs savulaik bija ielicis video kā var pats sevi atspādīt, tikai nevaru atrast linku. Šobrīd ļoti noderētu.

  7. #67
    Senior Member
    Nov 2009
    Jēkabpils
    2,058

    Jā, man lēnā pielekšana bija uz brīdi .
    Itin kā šaizi atrast nevaru...

  8. #68
    Senior Member
    Mar 2011
    1,119

    Nu trešā kolona ir šo starpība izdalīta ar 16.
    Rezultāts iespaidīgs, lai gan nedaudz liekas aizdomīgi, ka tik precīzi 1010/1011. Tagad nevaru izšķirties vai pasūtīt un mēģināt šos raidītājus vai tomēr izkost to TSF.

    Paliek jautājums: vai no ESP var nolasīt TSF. Tas būtu diezgan inčīgi un noderīgi.

    Ja nekļūdos, tad šeit
    0x3ff21048

  9. #69
    Senior Member
    Nov 2009
    Jēkabpils
    2,058

    Rezultāts iespaidīgs, lai gan nedaudz liekas aizdomīgi, ka tik precīzi 1010/1011.
    Nu jā, ir jau aizdomīgi. Bet nu tās pirmās divas kolonas - skaitītājs pirms komandas "sūtīt" un saņemot apstiprinājumu no uztvērēja...
    Padomāju, mož tam nano iekš CLKPR ierakstīts kaut kas, un CLKi/o != CLKcpu. Nekā, CLKPR vienas nulles.

  10. #70
    Senior Member
    Mar 2011
    1,119

    vai no ESP var nolasīt TSF. Tas būtu diezgan inčīgi un noderīgi.
    Izrādās ka tas TSF darbojas tikai AP mode. STA ir bez STF, līdz ar ko nekāda dižā sinhronizācija tur nesanāk. Tas tā teorētiski, bez praktiskiem experimentiem.
    BET, vai JDat gadījumā neminēja ka darbojas ar RTL8710?? Vai tam modulim nav pilns TSF abos galos?

+