• 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
Zmiana stanów logicznych oświetlenia
#21
Niestety pomysł Agregacika nie działa (przynajmniej w moim wykonaniu). Przebudowałem funkcję timera i wygląda ona następująco:

byte lampka = 0;

#define t1Pin 3

// Godzina, minuta, sekunda włączenia obwodu 1
int t1HOn, t1MOn, t1SOn;

// Godzina, minuta, sekunda wyłączenia obwodu 1
int t1HOff, t1MOff, t1SOff;

...

//przyciski z bluetooth

        if (wiadomosc == "swit") {
      lampka = 1;         
      wiadomosc = "";
    }

        if (wiadomosc == "zmierzch") {
      lampka = 0;     
      wiadomosc = "";
    }

....

//funkcja timera

boolean timer(int tPin, byte hOn, byte mOn, byte sOn, byte hOff, byte mOff, byte sOff) {

  long czWL = (long(hOn) * 3600) + (long(mOn) * 60) + long(sOn);
  long czWYL = (long(hOff) * 3600) + (long(mOff) * 60) + long(sOff);

 
  if (czWL < czWYL) {
    if (AktualnyCzas >= czWL && AktualnyCzas < czWYL) {
      lampka = 1;
    }
  }

  if (czWL > czWYL) {
    if (AktualnyCzas >= czWL && AktualnyCzas <= 86399) {
      lampka = 1;
    }
    if (AktualnyCzas >= 0 && AktualnyCzas < czWYL) {
      lampka = 1;
    }
  }

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if (lampka == 1) {
    analogWrite(led, jasnosc); // wejscie pwm jest deklarowane na pin leda o okreslonej jasnosci rownej 0
    jasnosc += wypelnienie;
    if (jasnosc > 255) //jesli jest powyzej 255, to ustalamy spowrotem 255
      jasnosc = 255;
  }

  if (lampka == 0) {
    analogWrite(led, jasnosc); // wejscie pwm deklarowane na pin led o jasnosci rownej 0
    jasnosc -= wypelnienie;
    if (jasnosc < 0) //jesli spadlo nam ponizej zera, to wracamy na wartosc 0.
      jasnosc = 0;
  }

}





Co do przerwań to czy zmienią one fakt, który opisywałem wcześniej? Nie chodzi mi o to czy czasowo program wpasuje się aby włączyć i wyłączyć lampkę bo robi to dobrze tylko czy po przekroczeniu przedziałów czasowych będe mógł operować manualnie lampką?
 
Odpowiedź
#22
(25-11-2019, 19:48)Krzaczek napisał(a): Co do przerwań to czy zmienią one fakt, który opisywałem wcześniej? Nie chodzi mi o to czy czasowo program wpasuje się aby włączyć i wyłączyć lampkę bo robi to dobrze tylko czy po przekroczeniu przedziałów czasowych będe mógł operować manualnie lampką?
Nie będziesz miał flag "lampka_świeci" i podobny, program się uprości.
Tylko raz, gdy czas będzie równy czasowi on/off lampka zmieni stan. To beda us. Poza sytuacjami gdy ma nastąpić automatyczne przełączenie przyciskiem możesz zmienic stan lampki.

Widać, że nie rozumiesz mechanizmu przerwań, musisz zapoznać się z tematem.
W pierwszej wersji softu zrezygnuj z płynnej zmiany świecenia lampki, zrób on/off (pwm min/max). Jak już program będzie działał poprawnie dodasz płynną zmianę świecenia, naturalnie na przerwaniach. W AVR nie ma innej możliwości aby zapewnić płynną zmianę (nie ma DMA). Czas wykonania pętli głównej jest różny, zależy od wielu warunków.
AVR to nie 8080 gdzie miesiącami pisano kod, aby funkcja wykonywała się zawsze w tym samym czasie bez względu na to czy warunek był czy nie wykonany. Tego w C nie zrobisz (za dużo roboty), tylko ASM wchodzi w grę. Przerwania będą przeszkadzać i taka metoda jest dobra dla prostych zadań. Znam tylko jeden program, działający na tej zasadzie. Ile go pisano? Nie wiem ale pewnie rok czy dwa przez zespół osób.
 
Odpowiedź
#23
Dziękuję Semi za wyjaśnienie. Czy do stawiania pierwszych kroków przy przerwaniach mogę opierać się na kursie z forbota części drugiej, lekcji czwartej gdzie są przerwania? Czy może polecisz mi jakieś źródło gdzie jest to dobrze opisane? Spróbuję zrobić kod tak jak mi podpowiadasz tylko pytanie jak szybko ogarnę ten temat.
 
Odpowiedź
#24
(25-11-2019, 21:25)Krzaczek napisał(a): Czy do stawiania pierwszych kroków przy przerwaniach mogę opierać się na kursie z forbota części drugiej, lekcji czwartej gdzie są przerwania?
Nie wiem co jest na kursie Forbota w temacie AVR, wiem natomiast, że w kursach dla ARM są błędy wykluczające działanie kodu! Można więc przyjąć, że w przypadku AVR jest podobnie.

Co do innych źródeł to nie mam pojęcia. Gdy uczyłem się o przerwaniach AVR jeszcze nie istniały natomiast w temacie samych AVR posiłkowałem się notą katalogową układu i dokumentacja kompilatora AVR-GCC, najgorszego (najbardziej ograniczonego) kompilatora C jaki znam.
 
Odpowiedź
#25
Jest takie powiedzenie, że nie myli się tylko ten co nic nie robi - więc w kursach Forbot-a, jak i pewnie wielu innych można znaleźć błędy.
Ale zamiast pisać że są, może lepiej byłoby je wskazać i poprawić? Autorzy, albo chociaż właściciel portalu na pewno byliy wdzięczni za pomoc. A krytykować to każdy potrafi.
 
Odpowiedź
#26
(26-11-2019, 07:43)elvis napisał(a): Ale zamiast pisać że są, może lepiej byłoby je wskazać i poprawić? Autorzy, albo chociaż właściciel portalu na pewno byliy wdzięczni za pomoc. A krytykować to każdy potrafi.
Wskazywałem (często brak volatile, deklaracja ogromnych dynamicznych tablic większych niż zadeklarowany obszar sterty)  ale zero odzewu, zero reakcji. Błędny kod nadal jest na stronie.

To nie pierwszy przypadek, gdy twórca witryny uznaje się za nieomylnego, nie przyznaje się do błędu. Firma Gotronik publikuje filmy, na których pokazuje sposób wykorzystania transformatora separującego zagrażający zdrowiu i życiu. Mimo sygnalizowaniu problemu przez wiele różnych osób film nadal jest publikowany.
 
Odpowiedź
#27
Jak chodzi o volatile to coś sobie przypominam w kursie F4, ale tablic dynamicznych nie pamiętam - mógłbyś podać gdzie to widziałeś?
 
Odpowiedź
#28
(26-11-2019, 10:23)elvis napisał(a): Jak chodzi o volatile to coś sobie przypominam w kursie F4, ale tablic dynamicznych nie pamiętam - mógłbyś podać gdzie to widziałeś?
odbiór uart albo usb. Dynamiczna allokacja 1kb a taki jest rezerwowany obszar bez zmian w opcjach kompliacji. Jak nie zadeklaruje się tablicy globalnie, statycznie albo nie zmieni opcji kompilatora to pierwsze odebranie znaku i program ląduje w wyjątku.

Brak volatile kilka razy widziałem.
 
Odpowiedź
#29
Gdzie ty widzisz użycie sterty o której napisałeś wcześniej?
Inna sprawa że w przypadku uart ja nigdzie nie widzę tego 1kb, dynamicznej alokacji tym bardziej. W tym kursie są błędy ale nie dotyczą sterty ani dynamicznej alokacji pamięci, bo tego akurat się nie używa.
Co więcej testowałem te programy i wcale nie jest tak jak piszesz. Błąd wynika z innej przyczyny i czasem może się pojawić, o czym nawet autor kursu wspomina - ale nie pojawia się natychmiastowy wyjątek. W sumie nawet gdyby przepełnić stos i tak wyjątek by się nie pojawił, bo stm32 nie wykrywa przepełnienia stosu.
 
Odpowiedź
#30
(26-11-2019, 10:58)elvis napisał(a): Gdzie ty widzisz użycie sterty o której napisałeś wcześniej?
Czy mam pamiętać każdy bład na Forbocie po kilku latach?
Może jest to jak już pisałem w obsłudze USB a nie UART?
Może to nie 1kB a 10?
Admin strony ma w d... błędy a ja mam je wszystkie po latach pamiętać?
Chcesz to szukaj.

(26-11-2019, 10:58)elvis napisał(a): W sumie nawet gdyby przepełnić stos i tak wyjątek by się nie pojawił, bo stm32 nie wykrywa przepełnienia stosu.
Temat był poruszany na Elekrodzie i faktycznie program wywalał się. Rozwiązanie problemu podałem.
Chcesz - szukaj w archiwum, tylko po co? Zgłosisz błąd a i tak nie będzie poprawiony! Szkoda czasu!
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości