• 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.
#31
Ciekawe, obstawiałem że pojawią się jakieś zakłócenia, a tu nic Sad
Ale chociaż widać że obie metody dają ten sam rezultat:

15 ms
70 ms => 70-15 = 55ms
115 ms => 115-70 = 45 ms

Roznica: 45276
Roznica: 55036
Roznica: 45272
Roznica: 55036

Czyli problemem jest reakcja na oba zbocza sygnału. Tylko pytanie dlaczego? Co ciekawe przetestowałem Twój pierwszy program na Arduino UNO i u mnie działa prawidłowo.
 
Odpowiedź
#32
Proponowałbym dwa testy: użyć innej płytki, najlepiej Arduino UNO, a drugi test - użyć innego sygnału, np. wygenerowanego przez PWM, może być nawet z tej samej płytki.
 
Odpowiedź
#33
Problemem jest wyzwalanie na obydwu zboczach. To widać nawet na oko że odczyt idzie 2x na sekundę.


A może przyczyną jest coronavirus ?
 
Odpowiedź
#34
Jaką dokładnie wersję arduino używasz? Przede wszystkim - z jakim mikrokontrolerem?
 
Odpowiedź
#35
Ta zwykłe nano 328P
 
Odpowiedź
#36
Problemem jest wyzwalanie przerwania na obydwu zboczach.
Nagrałem filmik na którym to widać jak byk i tu trzeba szukać problemu.
 Dla najprostszego skeczu który tylko zmienia stan na wyjściu problem jest ten sam.
Kod:
const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}

 
Odpowiedź
#37
Przyglądnij się czy na zboczach nie ma oscylacji.
Czy jak zmienisz sposób wyzwalania na CHANGE coś się zmieni?
Może filterek RC by pomógł.
 
Odpowiedź
#38
Nic się nie zmiania, obojętnie co dam CHANGE FALLING RISING.
Próbowałem na innym egz arduino, to samo.
Pierwszy raz mnie przystawiło z tak banalnym problemem.

Może ktoś przepisze ten program ale z "ręczną" konfiguracją przerwania w ansi C. ?
Ja nie wiem jak to zrobić, musiałbym 2 dni manual studiować.
Może funkcja attacheinterrup ma jakiegoś bug-a
 
Odpowiedź
#39
Skoro inny egzemplarz arduino działą tak samo to może trzeba dokładniej ten sygnał obejrzeć.
Testowałem program z pierwszego posta:

Kod:
volatile int timer_val=0;
volatile int timer_val_old=0;

void setup() {
  Serial.begin(2000000);
  pinMode(2, INPUT);
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(2), alarm, FALLING);

    Serial.println("hello!");

  TCCR1A = 0;              // set entire TCCR1A register to 0
  TCCR1B = 0;              // same for TCCR1B
  TCNT1 = 0; // Reset Timer1 Count
  TCCR1B |= (1 << CS10);    // prescaler 1024
  TCCR1B |= (1 << CS12);    // prescaler 1024
}

void loop() {
  if(timer_val!=timer_val_old){
    Serial.println(timer_val, DEC);
    timer_val_old=timer_val;
    }
}

void alarm() {
    timer_val=TCNT1;
    TCNT1=0;
}


I po podłączeniu generatora funkcyjnego działa idealnie. Tak jak napisałem wcześniej - może warto na jednym arduino wygenerować sygnał, na drugim zmierzyć - to powinno działać.
 
Odpowiedź
#40
Elvis ma racje, nie za bardzo to rozumiem ale dałem kondensator między generator a nano i zaczęło działać prawidłowo.
Pod oscyloskopem analogowym nic nie widać żeby było coś nie tak z sygnałem. Ale i tak widzę że plan jest do bani bo od około 20Hz wzwyż chyba przerwanie włazi na Serial.print i zaczynają się krzaki.
Chyba trzeba będzie poświęcić jedno arduino żeby tylko mierzyło impulsy i nic poza tym i przesyłać do drugiego np przeze SPI któro będzie się zajmować wyświetlaniem wyników. :/
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości