• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 1 głosów - średnia: 1
  • 1
  • 2
  • 3
  • 4
  • 5
Odczyt wartości Timera1 - problem.
#11
Zobacz co wypluje mój testowy kod  zamiast do pinu D2 podłącz pin D8

Kod:
#include <Arduino.h>
#define pinICSH 8
#define IC_Timers 40000                   // Przepelnienie licznika Timer1 co 20ms
#define LICZBAPROBEK_ICS_PulseH 10       
#define LICZBAPROBEK_ICS_Okres 10

///////////// Timer 1 Input Capture sygnal  pin 8
volatile uint32_t ICS_Okres =0;               
volatile uint32_t Suma_ICS_Okres = 0;         
volatile uint8_t  ICS_Tik_Okres =0;           
volatile uint32_t Srednia_ICS_Okres =0;         
volatile uint16_t ICS_Tim_Okres =0;           
volatile uint8_t ICS_Timers_Okres =0;         
volatile uint16_t Ostatni_ICS_Tim_Okres =0;   

volatile uint32_t ICS_PulseH =0;             
volatile uint32_t Suma_ICS_PulseH = 0;         
volatile uint8_t ICS_Tik_PulseH =0;           
volatile uint32_t Srednia_ICS_PulseH =0;       
volatile uint16_t ICS_Tim_PulseH =0;           
volatile uint8_t ICS_Timers_PulseH =0;         
volatile uint16_t Ostatni_ICS_Tim_PulseH =0;   

volatile bool ICS_zbocze = false;                      
volatile bool ICS_bool_PulseH = false;         
volatile bool ICS_bool_Okres = false;         

ISR(TIMER1_COMPA_vect) {    //////////// przepelnienie licznika co 20ms

  ICS_Timers_Okres++;
  ICS_Timers_PulseH++;


  if(ICS_Timers_PulseH >100){     // time out 2s
     ICS_Timers_PulseH =0;
     ICS_Timers_Okres =0;
     Srednia_ICS_PulseH =0;
     Srednia_ICS_Okres =0;
     { TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); ICS_zbocze = false; } // oczekuj na sygnal L/H
    
   }

}

ISR(TIMER1_CAPT_vect) {      // przerwanie input capture
 
    ICS_Tim_PulseH = ICR1; // odczytaj aktualny stan licznika
  ICS_Tim_Okres = TCNT1;

    if (ICS_zbocze == false) {
        TCCR1B &= ~(1<<ICES1);
        TIFR1 |= (1<<ICF1);
        ICS_zbocze = true;              //  zmien wyzwolenie na zbocze high-low

    Ostatni_ICS_Tim_PulseH=ICS_Tim_PulseH; // zapamiętaj stan licznika początek sygnału HIGH
    ICS_Timers_PulseH=0;         // wyzeruj przepelnienia licznika

    if(ICS_Timers_Okres >0){
            if(ICS_Timers_Okres >1){
                Ostatni_ICS_Tim_Okres = IC_Timers - Ostatni_ICS_Tim_Okres;
                ICS_Okres = (((ICS_Timers_Okres-1)*IC_Timers)+Ostatni_ICS_Tim_Okres+ICS_Tim_Okres)>>1;
            }else{
                Ostatni_ICS_Tim_Okres = IC_Timers - Ostatni_ICS_Tim_Okres;
                ICS_Okres = (Ostatni_ICS_Tim_Okres+ICS_Tim_Okres)>>1;
            }
        }else{
            ICS_Okres=(ICS_Tim_Okres-Ostatni_ICS_Tim_Okres)>>1;
        }

    Ostatni_ICS_Tim_Okres=ICS_Tim_Okres;
    ICS_Timers_Okres=0;

    //////////////// wyliczanie sredniej Okres

    Suma_ICS_Okres=Suma_ICS_Okres+ICS_Okres;
    ICS_Tik_Okres++;

    if(ICS_Tik_Okres>=LICZBAPROBEK_ICS_Okres){

      Srednia_ICS_Okres=(Suma_ICS_Okres/ICS_Tik_Okres);
      ICS_Tik_Okres=0;
      Suma_ICS_Okres=0;
      ICS_bool_Okres=true;
    }

    }else {
        TCCR1B |= (1<<ICES1);
        TIFR1 |= (1<<ICF1);
        ICS_zbocze = false;              // zmien wyzwolenie na zbocze L/H

        if(ICS_Timers_PulseH >0){
            if(ICS_Timers_PulseH >1 ){
                Ostatni_ICS_Tim_PulseH = IC_Timers -Ostatni_ICS_Tim_PulseH;
                ICS_PulseH = (((ICS_Timers_PulseH-1)*IC_Timers)+Ostatni_ICS_Tim_PulseH+ICS_Tim_PulseH)>>1;

            }else{
              Ostatni_ICS_Tim_PulseH = IC_Timers-Ostatni_ICS_Tim_PulseH;
              ICS_PulseH = (Ostatni_ICS_Tim_PulseH+ICS_Tim_PulseH)>>1;
            }

        }else{
            ICS_PulseH = (ICS_Tim_PulseH-Ostatni_ICS_Tim_PulseH)>>1; // ICR1 liczy co 0.5 us 2MHz

        }

    //////////////// wyliczanie sredniej pulseH 30-100hz sygnal

    Suma_ICS_PulseH=Suma_ICS_PulseH+ICS_PulseH;
    ICS_Tik_PulseH++;

    if(ICS_Tik_PulseH>=LICZBAPROBEK_ICS_PulseH){

      Srednia_ICS_PulseH=(Suma_ICS_PulseH/ICS_Tik_PulseH);
      ICS_Tik_PulseH=0;
      Suma_ICS_PulseH=0;
      ICS_bool_PulseH=true;
    }   
    }    
}

void setup() {


  Serial.begin(9600);
  pinMode(pinICSH, INPUT);

  cli();
  TCCR1A = 0;
  TCCR1B = (0<<ICNC1) | (0<<ICES1) | (1<<CS11) | (1<<WGM12) ;
  TCCR1C = 0;
  OCR1A = (IC_Timers-1);
  TIFR1 = (1<<ICF1) | (1<<TOV1);   
  TIMSK1 = (1<<ICIE1)  | (1 << OCIE1A);
  { TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); ICS_zbocze = false ; }  /// ustaw L/H
  sei();
}

void loop() {
  Serial.println( ICS_Okres);
  Serial.println(Srednia_ICS_Okres);
  Serial.println(ICS_PulseH);
  Serial.println(Srednia_ICS_PulseH); 
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#12
Jakieś krzaki lecą.
   
 
Odpowiedź
#13
luknij jeszcze raz bo poprawiłem
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#14
@Jarewa0606 potrafisz używać rejestrów układów peryferyjnych po co jeszcze bawisz się w arduino? Nie czas porzuć je i zacząć pisać w np AS co pozwoli używać debugera?
Kod z delay to nie kod, to DEMO!
Możliwości sprzętowe uC trzeba wykorzystywać a nie /machać/. GPIO!
Jestem a usilnie chcę być amatorem to dwie różne rzeczy.

http://er-mik.prv.pl/projekty edw.php 
http://er-mik.prv.pl/projekty_avt.php
 
Odpowiedź
#15
(08-03-2020, 23:32)Jarewa0606 napisał(a): luknij jeszcze raz bo poprawiłem

Jest jakiś błąd.


sketch_mar08b:33: error: 'ICP_Timers_Okres' was not declared in this scope
 
Odpowiedź
#16
(08-03-2020, 23:36)MERASerwis napisał(a): @Jarewa0606 potrafisz używać rejestrów układów peryferyjnych po co jeszcze bawisz się w arduino? Nie czas porzuć je i zacząć pisać w np AS co pozwoli używać debugera?

Kolega jak taki mądry to niech pomoże.
 
Odpowiedź
#17
teraz musi pujsc za duzo wkleiłem
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#18
(08-03-2020, 23:49)Jarewa0606 napisał(a): teraz musi pujsc za duzo wkleiłem

Tak to wygląda od samego początku aż do ustabilizowania wyników. 
Kod:
3280
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
58636
0
0
0
58636
0
0
0
58636
0
0
0
58636
0
55036
0
58636
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100314
0
55036
0
100314
0
55036
0
100314
0
55037
0
100314
0
55037
0
100314
0
55037
0
100313
0
55037
0
100313
0
55037
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100314
0
55036
0
100314
0
55036
0
100314
0
55036
0
100314
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
0
55036
0
100313
96145
55036
0
100313
96145
55036
55036
100313
96145
55036
55036
100313
96145
55036
55036
100314
96145
55036
55036
100314
96145
55036
55036
100314
96145
55036
55036
100313
96145
55036
55036
100313
96145
55036
55036
100313
96145
55036
55036
100313
96145
55036
55036
100313
96145
55036
55036
100313
96145
55036
55036
100313
96145
55036
55036
100314
96145
55036
55036
100314
96145
55036
55036
100314
96145
55036
55036
100313
96145
55036
55036
100313
96145
55036
55036
100313
96145
55036
55036
 
Odpowiedź
#19
(08-03-2020, 23:36)MERASerwis napisał(a): @Jarewa0606 potrafisz używać rejestrów układów peryferyjnych po co jeszcze bawisz się w arduino? Nie czas porzuć je i zacząć pisać w np AS co pozwoli używać debugera?

Używam VSC i PlatfrmIO.... 
Uczę się...


To cos nie halo bo okres na poziomie 100ms daje 10Hz na pewno na generatorze miałeś ustawione 1Hz??
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#20
Dokładnie, teraz miałem 10Hz.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości