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


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przerwania po wykryciu zbocza.
#1
Drodzy forumowicze.
Mam problem z kodem. Mianowicie po kompilacji otrzymuję komunikat:

warning: invalid conversion from 'int' to 'void (*)()' [-fpermissive]  attachInterrupt(digitalPinToPinChangeInterrupt(2), zO, FALLING);

Efekt jaki chcę uzyskać to detekcja zbocza opadającego, przerwa i powrót do wykonywania kodu. Niestety ciągle wyrzuca ostrzeżenie. W czym tkwi błąd? Wczytuję się dostepne materiały lecz nie wiem jak z tego wybrnąć. 

int odczytanaWartosc = 0;
int czas = 0;
int x = 0;
volatile int zO;
const int podajImpuls = 8;
int time = 0;
#include "PinChangeInterrupt.h" 
void setup() 
{
  pinMode(6, OUTPUT); 
  pinMode(5, INPUT_PULLUP); 
  attachInterrupt(digitalPinToPinChangeInterrupt(2), zO, FALLING); //detekcja zbocza opadajacego

}
void loop(void)
  {
 
  void zO();
  {
  time==5;
  return;
  }
if (digitalRead(5) == LOW) //
{
  digitalWrite(6, HIGH); //praca
  delay(czas);
  }
  else {
  digitalWrite(6, LOW); //Wyłączenie
  }
 
Odpowiedź
#2
Kot CI chyba wszedł na klawiaturę i masz nawiasy {} w losowych miejscach (czy tam nie masz).
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Ponadto wiele innych rzeczy nie jest dobrze "poustawianych".
Poczytaj może tu https://plociennik.info/index.php/obsluga-przerwan jak to wszystko "ustawić" po kolei aby działało.
Nie jestem orłem, ale tu się uczyłem i dałem radę z przerwaniami.
 
Odpowiedź
#4
Funkcja void zO(); jest wewnątrz funkcji main(), a nie powinna.

Funkcja void zO(); niby coś zwraca, a nie powinna skoro jest void.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#5
Witam mam problem z odpaleniem przerwania. kod się kompiluje tylko nie wiem już co robię nie tak. Może ktoś pomoże
Kod:
int PWM_1 = 5;
int interruptPin = 19;
int state = 0;
unsigned long start_time_1;
int RPM;
int count;
void setup() {
  pinMode(PWM_1, OUTPUT);
analogWrite(PWM_1, 0);
Serial.begin(9600);
 
  //pinMode(interruptPin, INPUT_PULLUP);
//  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(interruptPin),count_1, RISING);
}

//void loop() {
//  if (int PWM_1=0; PWM_1 <=255; PWM_1 +=51 {
//    delay 5000
//    start_time_1 = millis();
//  count = 0;
//  while ((millis() - start_time_1) < 1000){
//  }
//  rpm = count *30;
//  Serial.print(map(PWM_1, 0, 255, 0, 100));
//  Serial.print(RPM);
//analogWrite(PWM_1, 150);
//}
void loop() {
  for (int pwm = 0; pwm <=255; pwm += 51){
    analogWrite(PWM_1, pwm);
    delay(5000);
    start_time_1 = millis();
    count = 0;
    while((millis() - start_time_1 < 1000)) {
    }
//    RPM = count * 30;
Serial.print("PWM = ");
Serial.print(map(pwm, 0, 255, 0, 100));
Serial.print("% , Speed = ");
Serial.print(RPM);
Serial.print("rpm");
  }
  }
void count_1() {
  count = count++;
}


PS. jak mam płytkę mega2560 i wykorzystuję piny 19 i 18 to jest to interrupt dla 19 to interrupt 4 a dla 18 to interrupt 5? Nie umiem zczytać tej prędkości.
 
Odpowiedź
#6
W deklaracji
volatile uint16_t count;
(bo nie wiem po co Ci ujemne też do licznika)
i w przerwaniu po prostu
count++;
A czy reszta kodu ma sens to nie wiem, ale się domyślam.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
(17-02-2022, 14:51)kaczakat napisał(a): W deklaracji
volatile uint16_t count;
(bo nie wiem po co Ci ujemne też do licznika)
i w przerwaniu po prostu
count++;
A czy reszta kodu ma sens to nie wiem, ale się domyślam.
Dzięki  o ten count++; Rozumiem idee volatile uint16_t count; tylko nie bardzo widzę gdzie bym miał zmienić z INT-a bo rozumiem, że to o to chodzi chyba chodziło o rpm-y. Rozumiem że przerwanie mogę sobie wywoływać po jakiejś funkcji by nie koniecznie było cały czasz. 

A teraz jak to przerobić by czytać dwa wentylatory jak kol wiek jeden po drugim bądź równocześnie.
 
Odpowiedź
#8
Nie napisałeś po co ten program wymyśliłeś i co ma robić. Ale tak ogólnie to można z nim zrobić tylko to:
[Obrazek: killitwithfire-reaction.gif]
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#9
(17-02-2022, 21:11)kaczakat napisał(a): Nie napisałeś po co ten program wymyśliłeś i co ma robić. Ale tak ogólnie to można z nim zrobić tylko to:
[Obrazek: killitwithfire-reaction.gif]
Masz rację robię sobie prototyp cieplarki do wychowu matek pszczelich. Kod już zapożyczyłem z neta i deko go zmodyfikowałem. Jako że uczę się sam dla siebie to wygląda ten kod jak na obrazku wyżej.  Ten fragment ma kontrolować przepływ powietrza w kołnierzu komory grzewczej. Jeszcze mam kilka problemów oczywiście ale jakoś to będzie nie ukrywam, że będę z czasem jeszcze pytał o jakieś poprawki. Mam pytanie z innej beczki jak układać program w zakładkach za pomocą odesłania bezzwrotnego void w petli loop?
 
Odpowiedź
#10
Ten cały wątek jest jakiś dziwny...
Bardzo dobrze, że się uczysz, ale zacznij od kursu, książki o C. Nauka polega na zrobieniu i przetestowaniu tych kilkudziesięciu zadań, a po poznaniu millis zrobieniu ich ponownie bez delay. Jakaś książka o C/C++  też nie zaszkodzi.
Nie jest ważne co tam chcesz cieplarkować, ale co ma robić ten kod.
Wg wypisanych poleceń/funkcji ma po wejściu w loop rozpocząć iterację, ustawić PWM, odczekać 5s delayem, wyzerować count, odczekać sekundę millisem (co czyni to zwykłym delayem), zmienić nastawę PWM i znowu odczekać 5s, itd, w sumie tak 6x, co zajmie ponad 36s, po czym ma wydrukować zmienną RPM, która niezmiennie będzie=0.
Pętla loop ma trwać mikrosekundy, przy milisekundach może być kiepskie działanie programu, mało responsywne, ale nie sekundy.
Ostatniego pytania w ogóle nie rozumiem.
Gorąco polecam kurs. Na razie tak to wygląda, że nawet nie wiesz czego nie wiesz i o co pytać.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości