Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 20:05


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 12 sie 2019, o 13:23 
Offline
Nowy

Dołączył(a): 02 maja 2016
Posty: 16
Pomógł: 0

Witam serdecznie.

Od razu mówię, że nie jestem profesjonalistą w dziedzinie programowania w języku C, dlatego też proszę o pomoc. Kilka lat temu napisałem program na ATMEGA8 realizujący sekwencyjne zapalanie ledów, umieszczonych w stopniach schodowych. Program ten jest uruchamiany za pomocą 2 czujek podających stan wysoki, gdy wykryją ruch. Miałem wtedy problem z jedną rzeczą:

"co zrobić, gdy ledy zapalą się samoczynnie przez np. błąd czujki i program będzie realizowany bez przerwy?"

Chciałem napisać tzw. timer do tego programu, który by odliczał czas np. "jeżeli ledy świecą ponad 5 minut, wyłącz", jednak nie wiedziałem jak to zlepić wszystko do kupy by trybiło w jednym, spójnym programie. Dlatego zastosowałem drugi mikrokontroler ATTiny, który odliczał czas i gdy minęło załóżmy 5 minut, podawał stan wysoki na jedną z nóżek, która natomiast była przylutowana do pinu wejścia ATMEGA8. Dzięki temu ATMEGA8 otrzymując stan wysoki od ATTIny na wejście realizowała sekwencje gaszenia ledów.

Wiem, że jest to durna realizacja, bo jestem pewien, że da się to zaimplementować po prostu w programie i wystarczyłaby sama ATMEGA8, jednak nie mam pojęcia jak tego dokonać, dlatego proszę o wskazówki. Poniżej wstawiam obydwa programy (ATMEGA8 i ATTiny).

Główny program na ATMEGA8 realizujący zapalanie/gaszenie ledów schodowych

Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Drugi program ATTiny realizujący odliczanie czasowe:

Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Bardzo bym prosił o jakąkolwiek pomoc w jaki sposób "zlepić" te dwa programy w jedną całość.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2019, o 13:33 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

To ja ci tylko podpowiem, że warto zacząć od tej książki:

https://atnel.pl/mikrokontrolery-avr-jezyk-c.html

bo te dwa jak je nazwałeś "programy" ciężko nazwać programami - szczególnie ten pierwszy .... Ok ja rozumiem, że zaczynasz - no ale ... warto jednak zrobić krok naprzód - bo w ten sposób nigdy nie pisze się programów a ich łączenie - to po prostu istna mordęga

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2019, o 13:59 
Offline
Nowy

Dołączył(a): 02 maja 2016
Posty: 16
Pomógł: 0

mirekk36 napisał(a):
To ja ci tylko podpowiem, że warto zacząć od tej książki:

https://atnel.pl/mikrokontrolery-avr-jezyk-c.html

bo te dwa jak je nazwałeś "programy" ciężko nazwać programami - szczególnie ten pierwszy .... Ok ja rozumiem, że zaczynasz - no ale ... warto jednak zrobić krok naprzód - bo w ten sposób nigdy nie pisze się programów a ich łączenie - to po prostu istna mordęga


Z całym szacunkiem dla Ciebie Mirku, ale już wybrałem inny kierunek w swojej karierze, a programowanie dla mnie jest bardzo czasochłonne - nie posiadam niestety tyle czasu, by rozpocząć naukę od podstaw. Doskonale zdaję sobie sprawę, że aż oczy bolą jak się widzi takie programowe herezje, jednak dla mnie najważniejszą rzeczą jest to, że ten program mimo wszystko działa jak należy, chciałem tylko zastosować ten timer w jednym programie, ponieważ ATTiny przestał działać. Spodziewałem się, że nie jest to jakaś trudna sprawa dla doświadczonego programisty. I nie proszę tutaj "Panowie, zróbcie mi ten program tak by było dobrze", tylko o jakiekolwiek wskazówki, ale jeżeli mówisz, że zastosowanie timera w programie głównym to istna mordęga, to rzeczywiście tak musi być.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2019, o 14:12 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

z całym szacunkiem ale połączenie IDEI działania obu programów wymaga co najmniej przepisania od nowa tego pierwszego - a nie tam jakichś wskazówek jak to połączyć - przecież tam masz drastyczne programowanie liniowe - toż już na pierwszy rzut oka widać, że można by tam byle pętle zastosować i funkcje żeby to uprościć do maksimum a później móc łączyć z czymś innym - więc takie mogą być wskazówki.

I ja rozumiem, że ktoś nie chce się uczyć podstaw programowania - ja mam tak samo np z linuxem - już się go nie nauczę w życiu, a próbowałem - tyle że czasu nie starcza aby dalej się uczyć - ale też nie rzucam się wtedy na linuxa - no bo jak ? ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2019, o 17:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 maja 2015
Posty: 61
Pomógł: 2

A fuj z tymi delayami :lol:
Jeśli masz BB to gotowiec jest na stronie od 326 do 329.
Pisząc gotowiec mam na myśli że jest tam pokazane jak się do tego
zabrać :D :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sie 2019, o 08:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

Cytuj:
I nie proszę tutaj "Panowie, zróbcie mi ten program tak by było dobrze", tylko o jakiekolwiek wskazówki
widzisz, piszesz że nie masz czasu na naukę programowania, to jak ktoś ma Ci dać wskazówki skoro prawdopodobnie bez douczenie nie będziesz w stanie ich wykorzystać?
Ale ok, mogę spróbować Ci pomóc tylko jeszcze musisz uzupełnić założenia. Ten timer po odliczeniu ma wyłączyć ledy i zablokować ich zapalanie na jakiś czas, czy do resetu czy jeszcze jakoś inaczej?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sie 2019, o 10:06 
Offline
Nowy

Dołączył(a): 02 maja 2016
Posty: 16
Pomógł: 0

xentis napisał(a):
Cytuj:
I nie proszę tutaj "Panowie, zróbcie mi ten program tak by było dobrze", tylko o jakiekolwiek wskazówki
widzisz, piszesz że nie masz czasu na naukę programowania, to jak ktoś ma Ci dać wskazówki skoro prawdopodobnie bez douczenie nie będziesz w stanie ich wykorzystać?
Ale ok, mogę spróbować Ci pomóc tylko jeszcze musisz uzupełnić założenia. Ten timer po odliczeniu ma wyłączyć ledy i zablokować ich zapalanie na jakiś czas, czy do resetu czy jeszcze jakoś inaczej?



Masz rację, jednak gdybym otrzymał jakąś wskazówkę, to jakby zakres poszukiwań rozwiązania by się diametralnie zawęził, bo doskonale wiem, że programowania nie da się nauczyć w tydzień czy miesiąc. Bardzo dziękuję za litość ;) Timer po odliczeniu ma wyłączyć po prostu zapalone ledy - jeżeli nie są zapalone to odliczanie nie ma być realizowane. Nie ma blokować ich zapalenia, ten timer ma wyłączać ledy po to, gdyby np. ledy same się zapaliły przez błąd czujki, żeby nie świeciły cały dzień gdy nie ma mnie w domu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sie 2019, o 11:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

Tak na początek to mała uwaga na temat makra _delay_ms(), a mianowicie jest to makro a nie funkcja, tak więc nie powinno się wartości czasu podawać w postaci zmiennej, ponieważ kompilator to makro zamienia na blok zawierające "pustą instrukcję" (poprostu kompilator liczy ile tych pustych instrukcji musi wstawić aby opóźnienie było takie jakie chcemy). W twoim programie masz do tego makra wstawione zmienne, ale masz je od razu zainicjowane więc kompilator zna ich wartość w momencie kompilacji, ale jeśli w programie były by wykonywane jakieś operacje na tych zmiennych to program by Ci się nie skompilował a kompilator wypluł by błąd.
Jak chcesz mieć możliwość łatwej zmiany czasu bez przerabiania kodu zdefiniuj te wartości poleceniem #define
czyli zamiast
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

użyj czegoś takiego
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Takie rozwiązanie zadziała zawsze i nie zajmie pamięci ram procesora.

Wracając do tematu to musisz uruchomić tejmer sprzętowy który atmega8 posiada w ilości 3 na swoim wyposażeniu, proponuję timer1 bo na nim najwygodniej dostosować czas, a i tak leży odłogiem.
Włączasz przerwanie od porównania timera i ustawiasz timer tak by generował przerwanie co powiedzmy 1s.
W programie tworzysz zmienną, to będzie licznik sekund zliczający do 300 (czyli twoje 5minut świecenia).
Zmienna powinna być opatrzona jako volatile oraz powinna być 16 bitowa:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W obsłudze przerwania wstawiasz coś w tym stylu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

a w pętli głównej dodajesz warunek:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Na koniec w warunkach zapalających ledy ładujesz licznik na zadany czas czyli nasze 300.
I teraz w momencie gdy czujka zainicjuje zapalenie ledów, załaduje również licznik. Tykające przerwanie ten licznik będzie co sekundę zmniejszało o 1. Gdy licznik dojdzie do 1 odliczanie się zatrzyma, równocześnie spełniony zostanie warunek w głównej pętli programu odpowiedzialny za natychmiastowe zgaszenie ledów, jednocześnie licznik zostanie wyzerowany i cały mechanizm zdezaktywowany)
Dla porządku możesz w warunku stopniowego gaszenia również wyzerować licznik by mechanizm bezwarunkowego gaszenie nie wywoływał się gdy ledy już wcześniej zostały wygaszone przez czujkę.
To chyba tyle. Mam nadzieję że coś zrozumiesz i sobie poradzisz. Ewentualnie dopytaj.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sie 2019, o 11:49 
Offline
Użytkownik

Dołączył(a): 28 wrz 2016
Posty: 215
Pomógł: 14

Musisz uruchomić jakiś timer. Proponuję TIMER0, bo jest najprostszy.
Aby to zrobic należy:
dodać plik nagłówkowy interrupt.h (#include <avr/interrupt.h>)
uruchomic timer
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

dodać obsługę przerwania timera, np. taką
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

wartość 122 w if() jest "z rękawa". Nie wiem z jaka częstotliwością pracuje u Ciebie Atmega. Dla 8MHz przerwanie be4dzie wykonywać się z częstotliwością
8000000/(1024*256)=30,5Hz, a if wykona sie co ok 4s. Uzyskanie dłuższych czasów nie powinno być już dla Ciebie problemem.
Przerwanie odliczania czasu też nie powinno sprawić kłopotu. Można wyzerować zmienną tick.
I jeszcze mała uwaga. warto sekwencje zapalania i gaszenia led umi4eścić w odpowiednich funkcjach,. wtedy analiza kodu będzie znacznie prostsza.

_________________
de gustibus non est disputandum



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sie 2019, o 12:14 
Offline
Użytkownik

Dołączył(a): 13 lut 2012
Posty: 163
Pomógł: 10

"... timer ma wyłączać ledy po to, gdyby np. ledy same się zapaliły przez błąd czujki".
Podane przykłady jak stosować timer nie rozwiązują jeszcze powyższego założenia.
Jeżeli jest błąd czujki to należy doprowadzić do wyłączenia sterownika, tak by nie reagował w ogóle na czujkę a wręcz sygnalizował stan awarii, który wymaga ręcznego resetu przez autora sterownika lub naprawy czujki.
Czyli np. po przekroczeniu krytycznego czasu podawania ciągłego sygnału przez czujki następuje wyłączenie wszystkich LED od oświetlenia schodów oraz blokowany jest port lub piny przychodzącego sygnału od czujki i ewentualnie zapalenie jakiejś dodatkowej diody LED sygnalizującej stan awarii.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO