Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega8][Bascom] Sterownik na podczerwień

jacek1987-1987 22 Cze 2012 13:33 5367 36
  • #1 22 Cze 2012 13:33
    jacek1987-1987
    Poziom 11  

    Witam jestem początkujący w programowaniu uczę się dopiero i chciałem sobie stworzyć sterownik na podczerwień 12 kanałowy plus dwa kanały PWM. dodatkowo chciałem sterować trzema wentylatorkami które mają się załączać przy różnych temperaturach. Napisałem program w BASCOM i wziołem się do testów czy działa i jak się okazało niestety nie działa sterowanie poszczególnymi kanałami. Sterownie to zostało napisane z wykorzystaniem instrukcji case. Po usunięciu tej instrukcji i wpisaniu warunków uruchamiających poszczególne kanały w pętli głównej to działa sterowanie pilotem. nie testowałem jeszcze programu z podłączeniem czujnika temperatury więc nie wiem jak tam się to zachowuje. Ale prosił bym o sprawdzenie tego mojego programu i o wskazówki jak to poprawić wraz z jakimiś przykładami

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Proszę pamiętać o używaniu znaczników syntax. Opcja Listing kodu. Post poprawiłem. [adamas_nt]

    0 29
  • #2 22 Cze 2012 19:45
    LED5W
    Poziom 32  

    Select Case Nr_przycisku się nigdy nie wykona.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
    Czemu ma służyć ta konstrukcja?

    0
  • #3 22 Cze 2012 22:00
    jacek1987-1987
    Poziom 11  

    Dlaczego nigdy się nie wykona?? W takim razie prosił bym o wskazówki do tego jak to poprawić żeby się wykonała instrukcja Select case Nr_przycisku. A taką konstrukcje widziałem w książce "programowanie mikrokontrolerów AVR w języku Bascom".

    Regulamin:
    3.1.13. Zabronione jest publikowanie wpisów naruszających zasady pisowni języka polskiego, niedbałych i niezrozumiałych.

    Zdanie rozpoczynamy z dużej litery. Proszę poprawić pisownię. [adamas_nt]

    0
  • #4 22 Cze 2012 22:53
    LED5W
    Poziom 32  

    Program dojdzie do Loop po czym skoczy do Do. Instrukcje od End do końca same z siebie się nie wykonają. Można je jedynie wywołać jeśli mają etykietę lub są zadeklarowane jako podprogram lub funkcja.

    Na pewno chcesz stworzyć urządzenie, które zaczyna piszczeć i nic z tym nie można zrobić?

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #5 23 Cze 2012 11:35
    jacek1987-1987
    Poziom 11  

    To piszczenie ma być tylko wtedy gdy czujnik temperatury nie będzie odpowiadał tzn gdy np zostanie uszkodzony lub odłączony od magistrali 1-wire. To miało być jako taka informacja że coś się dzieje z czujnikiem. To w takim razie jak to zadeklarować jako podprogram lub tą funkcję do obsługi przycisków??

    0
  • #6 23 Cze 2012 17:58
    LED5W
    Poziom 32  

    jacek1987-1987 napisał:
    To w takim razie jak to zadeklarować jako podprogram lub tą funkcję do obsługi przycisków??
    Tak samo jak to zrobiłeś z odczytem temperatury.

    W Bascom są trzy sposoby tworzenia podprogramów:
    - przez etykietę (link), gdy nie potrzebujesz tego co niżej
    - przez podprogram (link), gdy chcesz przekazać parametry (bez zwracania wartości)
    - przez funkcję (link), gdy chcesz zwrócić wartość (możesz też przekazać parametry)

    0
  • #7 24 Cze 2012 21:05
    jacek1987-1987
    Poziom 11  

    Zrobiłem tak jak pisałeś tzn zadeklarowałem ten wybór przycisków jako podprogram i nadal jest na Select case Nr_przysicku lecz nadal to nie działa spędziłem nad tym sporo czasu żeby coś wykombinować i mi się nie udało. Wygląda to teraz następująco

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Mógłbyś mi to napisać jak ma to poprawnie wyglądać tak aby to działało bo ja nie mam pojęcia co z tym zrobić będę bardzo wdzięczny.

    0
  • #8 24 Cze 2012 22:21
    LED5W
    Poziom 32  

    jacek1987-1987 napisał:
    Zrobiłem tak jak pisałeś tzn zadeklarowałem ten wybór przycisków jako podprogram i nadal jest na Select case Nr_przysicku lecz nadal to nie działa [...]
    Nie rozumiem tego.

    Teraz możesz już wywołać ten podprogram, tylko nie wiem czemu tego nie robisz. A tak nawiasem, chyba miało być Przyciski, a nie Przysicki? ;)

    Poza tym zamieniłbym te podprogramy na etykiety.

    0
  • #9 25 Cze 2012 12:45
    arktik1
    Poziom 27  

    Kolejna sprawą jest konfiguracja portów.
    Po co konfigurować każdy PIN oddzielnie i rozciągać kod.
    Poza tym PORTx to wyjście a PINx to wejście.
    Można też przenieść cały fragment obsługi klawiszy do pętli głównej, będzie lepiej działać.

    Dodano po 7 [minuty]:

    No i co jest wpisywane do zmiennej.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    By CASE wiedział gdzie "skoczyć"
    Nie widzę tego jakoś w tym kodzie?

    Dodano po 5 [minuty]:

    No i boję się że z takimi przerwaniami to stos nie wytrzyma.

    0
  • #10 25 Cze 2012 15:39
    jacek1987-1987
    Poziom 11  

    Próbuje wywołać ten podprogram ale najwyraźniej się nie da bo nie działa program. Poprawiłem tą literówkę jednak to nie pomogło. Już nie mam pomysłów jak to wywołać żeby zadziałało.

    Cytat:
    Teraz możesz już wywołać ten podprogram, tylko nie wiem czemu tego nie robisz
    A czy to nie jest to wywołanie?
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
    .
    Cytat:
    Można też przenieść cały fragment obsługi klawiszy do pętli głównej, będzie lepiej działać.
    A czy po przeniesieniu tego fragmentu do pętli głównej stos wtedy wytrzyma? Początkowo program był napisany właśnie w ten sposób że obsługa klawiszy była w pętli głównej i wtedy działało bez problemów. Jednak chciałem to jakoś poprawić i stąd się wziął pomysł żeby to wykonać na Select Case.

    0
  • #11 25 Cze 2012 17:17
    LED5W
    Poziom 32  

    Szukałem po prostu Przysicki, dlatego nie znalazłem tego wywołania.

    Jak najbardziej ma sens umieszczenie obsługi przycisków bezpośrednio w pętli głównej.

    arktik1 napisał:
    No i boję się że z takimi przerwaniami to stos nie wytrzyma.
    Z jakimi, bo ja widzę tylko globalne włączenie przerwań? Choć nie wiem po co to tutaj jest.

    0
  • #12 25 Cze 2012 21:12
    arktik1
    Poziom 27  

    Co z tego że wywołujesz procedurę PRZYCISKI, jak nie "mówisz" Select Case gdzie ma przejść, to bez sensu.
    Musisz do zmiennej "Nr_przycisku" wpisać jakąś wartość.\
    Jeśli chcesz by działało np. CASE 5 to musisz zrobić "Nr_przycisku = 5"
    Po chłopsku:
    SELECT CASE, to tak jak WYBIERZ CASE.
    Czyli do zmiennej ""Nr_przycisku" musisz przypisać wartość CASE X:, gdzie x oznacza cyfrę.
    Kolejna sprawa to:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Po co po wybraniu już np. CASE 1 sprawdzać jeszcze czy Command = 1?
    łatwiej jest tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    i w takiej postaci przenieść to do pętli głównej.

    Dodano po 1 [godziny] 54 [minuty]:

    Coś ci jeszcze pokaże.
    To twój kawałek kodu do pętli DO:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    A tu poprawione błędy , inaczej napisany i w dalszym ciągu to samo.
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Zwróć uwagę na kolejność deklaracji i poprawność portów.
    Poza tym, zobacz ile mniej zajmuje linijek.
    Musisz uczyć się tego od początku, twoje kody nie będą tak zawiłe.

    0
  • #13 26 Cze 2012 19:26
    jacek1987-1987
    Poziom 11  

    Poprawiłem ten kod według wskazówek i działa z instrukcją case w podprogramie oraz z taką samą instrukcją w pętli głównej.
    Kod programu z Instrukcją case w podprogramie

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Kod programu z instrukcją case w ptli głównej
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Jedna kwestia mnie jeszcze nurtuje w tym mianowicie podczas testowania jednego i drugiego kodu załączanie któregokolwiek z kanałów nie odbywa się za pierwszym razem naciśnięcia klawisza na pilocie lecz za drugim, trzecim lub nawet czwartym razem. Myślałem że jest to wina opóźnień w programie jakie zastosowałem ale zmiana czasów opóźnienia nic nie poprawiła w działaniu.

    Napisałem inny program w którym obsługa przycisków jest na if-ach i w tym programie nie występuje taki efekt i kanały załączają się już za pierwszym naciśnięciem klawisza na pilocie.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dało by się jakoś rozwiązać ten problem jaki jest w tych dwóch pierwszych kodach? Jeśli tak to prosił bym o jakieś podpowiedzi i wyjaśnienie mi co jest przyczyną takiego działania tamtych programów.

    0
  • #14 26 Cze 2012 20:37
    arktik1
    Poziom 27  

    Jest tak dla tego, ponieważ program przełącza PORTx ok 40 razy na sekundę, dlaczego?
    A dla tego że:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    COMMAND powoduje wejście do CASE 0 za każdym razem gdy Uc zatoczy pętlę.
    Potem jest trzymany 25ms i znów pętla.
    Czyli 1000ms = 1 sekunda.
    1000ms / na 25ms = 40
    Dzieje się to gdy masz wciśnięty przycisk pilota, tak samo jak w tym drugim przypadku.
    Żeby to zmienić musisz wprowadzić zmienną, która będzie powodowała że CASE 0 wykona się tylko raz.
    Później by zostało wykonane jeszcze raz musi wyzerować zmienną przez puszczenie przycisku.
    np tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Bez sensu jest stosowanie tu wszelkiego rodzaju WAITMS.
    Nie dość że nic nie daje to jeszcze spowalnia program.

    Dodano po 4 [minuty]:

    Poza tym tu znów jest błąd:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Nie PIN tylko PORT.
    Wyjście to PORTx

    Dodano po 5 [minuty]:

    Kurcze nie pamiętam, czy COMMAND gdy nic się nie nadaje jest 255 czy 127, niech ktoś mnie poprawi.

    0
  • #16 27 Cze 2012 15:20
    jacek1987-1987
    Poziom 11  

    Próbowałem zmienić program według tego co zaproponował kolega arktik1 w celu zniwelowania tego błędu przy włączaniu i wyłączaniu kanałów ale nie działa to przy zastosowaniu tego program w ogóle nie odpowiada nic się nie dzieję w układzie. Umieszczałem to w pętli głównej jak i w podprogramie i efekt był taki sam.

    Cytat:
    1000ms / na 25ms = 40
    Skąd się wzięła ta wartość 1000ms?
    Cytat:
    COMMAND powoduje wejście do CASE 0 za każdym razem gdy Uc zatoczy pętlę.
    Czyli mam rozumieć to tak że instrukcja select case działa w ten sposób że cały czas jest wykonywana w pętli mimo to że nie jest np wciśnięty jakiś przycisk a po w ciśnięciu danego przycisku następuję skok do case dla tego odpowiedniego przycisku i wykonanie tych instrukcji które się tam znajdują??

    A tak jeszcze przy okazji to co jest źle z programem dla odczytu temperatury? Ten program pochodzi z wyżej wymienionej przeze mnie książki i nie działa. W kodzie z książki efekt działania tego programu miał być wyświetlany na wyświetlaczu LCD i podczas prób tego programu okazało się że on nie działa cały czas jest wyświetlany napis na LCD "brak ukladu" co miało sygnalizować jakiś problem z czujnikiem. Dodam że posiadam czujnik temperatury DS18B20

    0
  • #17 27 Cze 2012 17:05
    arktik1
    Poziom 27  

    Cytat:
    Skąd się wzięła ta wartość 1000ms?

    1000ms to sekunda.Było to napisane po to buś wiedział ile razy na sekundę zostaje przełączony twój PORTx.
    Wklej cały kod, zobaczymy co jest źle.

    0
  • #18 27 Cze 2012 22:11
    jacek1987-1987
    Poziom 11  

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #19 28 Cze 2012 13:13
    arktik1
    Poziom 27  

    A gdzie jest to:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    A i kod po niżej CASE 16 nie będzie działał :D
    Trzeba to przenieść poza warunek i dodać na początku następne SELECT CASE.
    Przełączanie kanałów musi następować tylko raz przy wciśniętym przycisku.
    Regulacja PWM musi trwać do puki nie puścisz przycisku, w tym co napisałeś regulacja PWM będzie przesuwać się tylko o 1 punkt.
    By ustawić np. wartość 255 od 0, będziesz musiał nacisnąć pilota 255 razy.
    Jeśli chcesz to poprawie twój kod i zamieszczę wieczorem.

    0
  • #20 28 Cze 2012 14:04
    jacek1987-1987
    Poziom 11  

    Bardzo bym prosił w takim razie jak byś mógł to popraw ten mój kod. I jeśli by się jeszcze dało to zerknij na fragment kodu związany z odczytem temperatury co tam jest źle czemu to nie działa.

    0
  • #21 28 Cze 2012 14:38
    arktik1
    Poziom 27  

    W jakich temperaturach system będzie funkcjonował?

    0
  • #22 28 Cze 2012 15:31
    zumek
    Poziom 39  

    Zastanów się również, nad poniższym fragmentem kodu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    zumek

    0
  • #23 28 Cze 2012 22:12
    jacek1987-1987
    Poziom 11  

    Chciałem tak żeby przy temperaturze 30 stopni celcjusza załączał się pierwszy wentylator, przy 35 żeby działał pierwszy i drugi wentylator, a przy 40 i więcej żeby działały wszystkie trzy naraz wentylatory oraz żeby buzzer się wtedy włączył. I zawsze będą to temperatury dodatnie bo to będzie funkcjonowało wewnątrz budynku

    0
  • #24 28 Cze 2012 22:46
    LED5W
    Poziom 32  

    zumek napisał:
    Zastanów się również, nad poniższym fragmentem kodu:
    [kod]
    Chodziło o to, że zawsze 1. lub 2. warunek będzie spełniony i kolejne nie będą sprawdzane.

    0
  • #25 28 Cze 2012 23:41
    arktik1
    Poziom 27  

    Sprawdź to:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Co prawda nie sprawdzane, ale może będzie działać :D

    0
  • #26 29 Cze 2012 16:07
    jacek1987-1987
    Poziom 11  

    Niestety ale ten program nie działa. Nie reaguje na wciskane przyciski nic się nie dzieje oraz ten odczyt temperatury też nie działa. Mógłbyś to u siebie sprawdzić.

    0
  • #27 29 Cze 2012 20:42
    arktik1
    Poziom 27  

    Czy fusebity masz dobrze ustawione?

    0
  • #28 29 Cze 2012 21:20
    jacek1987-1987
    Poziom 11  

    [ATmega8][Bascom] Sterownik na podczerwień
    Tak mam ustawione fusebity są to ustawienia "fabryczne" nic nie zmieniałem. Które ewentualnie należy zmienić i dlaczego akurat te np. za co one odpowiadają.

    0
  • #29 29 Cze 2012 22:51
    arktik1
    Poziom 27  

    Jeśli są ustawione fabrycznie, to nie może poprawnie działać.
    W fabrycznych ustawieniach Atmega 8 ma 1MHz a ty w programie deklarujesz $crystal = 4000000.
    Zobacz sobie to:
    https://www.elektroda.pl/rtvforum/topic1354542-0.html
    Tam bezpiecznie przestawisz FUSE.
    Fuse i $crystal muszą mieć taką samą wartość.
    1MHz to $crystal = 1000000

    0
  • #30 30 Cze 2012 15:31
    jacek1987-1987
    Poziom 11  

    Po ustawieniu fuse bitów tak żeby uwzględnić $crystal=4000000 program w dalszym ciągu nie reaguje na nic. Mógłbyś napisać program do odczytu temperatury z DS18B20 i wyświetleniu jej na LCD tak żebym mógł sobie sprawdzić moje czujniki temperatury

    0