PS: Taki sam temat jest w dziale "programowanie" ale widzę, że chyba powinien być tutaj, więc go tu dałem, a tamtego nie idzie już usunąć, więc proszę o to moderatora.
Witam.
Mam prośbę o pomoc w napisaniu programu (do) sterownika świateł- powiedzmy 8 kanałowy.
Może wpomnę że potrzebne to jest do wesołego miasteczka- karuzela. Z pewnością niejednokrotnie widzieliście migające, "pływające" żarówki (najczęściej łączone po 4szt gdyż są na 60V). Takie coś muszę zrobić. Na poniższym filmie widać o co mi chodzi:
A więc do rzeczy: Przeczytałem już (jakiś czas temu) książkę M.Wiązani pt. "programowanie mikrokontrolerów AVR w języku BASCOM" - coś w ten deseń.
Cały schemat "programu" znam, natomiast nie wiem jak zrobić kolejne "programy"
a więc załóżmy że włączam sterownik.
I leci sobie pierwszy program:
Code:
Portd=&B01010101
Do
Rotate Portd,Left
Waitms 200
Loop
I w ten oto sposób pojawia się "wąż świetlny", to jest łatwe. Ale za Boga nie potrafię wymyśleć jak zrobić aby przykładowo schodziły się kanały do środka, coś takiego:
Uogólniając: jak to wszystko połączyć aby samo chodziło (bez konieczności naciskania przycisków) i żeby każda "sekwencja" następowała po poprzedniej?
Pomijam tutaj sam sterownik, jak to zrobić na 230V, to już wiem bo mamy kilka takich sterowników. Niestety albo są na motorolach albo na PIC. Ja chcę zrobić na Atmega8.
Bardzo proszę o pomoc.
Wzamian mogę zaoferować darmową przejażdżkę na karuzeli w maju/czerwcu w okolicach Gliwic hehe ;)
Pozdrawiam, Tomek Olech
PS: Zostawmy przekazanie mocy na triaki itd, z tym nie ma problemu, problem natomiast jest jak widać z samym programem.
Za pomoc oferuję (prócz przycisku"pomógł") 50pkt, zakładając że rozwieje to moje wątpliwości.
Dodano po 9 [minuty]:
Żeby nie było że chce a sam nie próbuje ;)
Oto program który powstał w mojej wytężonej główce ;) Wiem, że na pewno tam jest więcej złego niż dobrego, ale koledzy pomóżcie i powiedzcie jak te wszystkie "sekwencje" połączyć, aby:
-Przycisk je przełączał (naciśnięcie przycisku powoduje przejście do następnej sekwencji),
-Potencjometrem można było zmieniać szybkość wykonywania programu.
Ten przycisk oraz potencjometr podłączone do załóżmy którychkolwiek pinówB uC atmega8.
Code:
'Program do sterowania oświetlenia karuzeli 8 kanałowego
$regfile = "m8def.dat" 'informuje kompilator o pliku dyrektyw
'wykorzystywanego mikrokontrolera
$crystal = 8000000 'informuje komplitaor o częstotliwości
'oscylatora taktującego mikrokontroler
Config Portd = Output 'Wszystkie linie portu D jako wyjściowe
Portd = &B01010101 'wartość początkowa wpisana do portu
'wyjściowego D
Do 'Początek pętli nieskończonej
Rotate Portd , Left 'Przesuwaj wpisane wartości do portuD
'w lewo
Waitms 200 'opóźnienie przesunięć o 200ms
Loop 'koniec pętli głównej programu
Jeśli chcesz potencjometrem regulowac prędkość, to łączysz jego opór pomiędzy szyny zasilania mikrokontrolera, a suwak dajesz pod przetwornik ADC. I przykładowo program:
Jeśli program ma tylko sterować portami, to możesz użyć prostego WAIT.
A co do sekwencji, możesz użyć prostych poleceń z przesuwaniem bajtu SHIFT, liczników zwiększających bajt INCR przepisywany na port, czy generowania pseudolosowych liczb RND. Kombinacji jest dużo.
Pozdrawiam :)
Chwila chwila, wiem o co chodzi, tylko... nie wiem jak to zrobić. Czy aby na pewno te polecenia "SHIFT, RND" są w bascomie? hehe
PS: Poleciało "pomógł" oraz na zachętę 10pkt.
Dodano po 6 [minuty]:
Nie mogę spać przez ten cały bascom, a mam tydzień na zrobienie, uruchomienie i podłączenie całego sterownika. Całe szczęście że mam kilka kupionych, i mam na czym się oprzeć (poza programem, niestety).
Przyszedł mi na myśl kolejny program, przed przeczytaniem Twojego postu. Spójrz okiem, zobaczysz o jakie sekwencje mi mniej więcej chodzi, i powiedz czy można to jakoś "ulepszyć" (czyt. zmniejszyć?). Dałem tam już dyrektywy dla przycisku i potencjometru, tylko jak to ustawić w samym programie hehe (o potencjometrze napisałeś, już rozumiem o co chodzi).
Dodano po 1 [minuty]:
ups, zapomniałem dać sam program :)
Code:
'Program do sterowania oświetlenia karuzeli 8 kanałowego
$regfile = "m8def.dat" 'informuje kompilator o pliku dyrektyw
'wykorzystywanego mikrokontrolera
$crystal = 8000000 'informuje komplitaor o częstotliwości
'oscylatora taktującego mikrokontroler
Config Portd = Output 'Wszystkie linie portu D jako wyjściowe
Sekwencja Alias Pinb.0
Szybkosc Alias Pinb.1
'koniec pętli głównej programu
Dim Sekwencja As Bit
Do
Sekwencja = &B01111110
Gosub Opoznienie
Sekwencja = &B00111100
Gosub Opoznienie
Sekwencja = &B00011000
Gosub Opoznienie
Sekwencja = &B00000000
Gosub Opoznienie
Sekwencja = &B01111111
Gosub Opoznienie
Sekwencja = &B00111111
Gosub Opoznienie
Sekwencja = &B00011111
Gosub Opoznienie
Sekwencja = &B00001111
Gosub Opoznienie
Sekwencja = &B00000111
Gosub Opoznienie
Sekwencja = &B00000011
Gosub Opoznienie
Sekwencja = &B00000001
Gosub Opoznienie
Sekwencja = &B00000000
Gosub Opoznienie
Sekwencja = &B10000000
Gosub Opoznienie
Sekwencja = &B11000000
Gosub Opoznienie
Sekwencja = &B11100000
Gosub Opoznienie
Sekwencja = &B11110000
Gosub Opoznienie
Sekwencja = &B11111000
Gosub Opoznienie
Sekwencja = &B11111100
Gosub Opoznienie
Sekwencja = &B11111110
Gosub Opoznienie
Sekwencja = &B11111111
Gosub Opoznienie
Sekwencja = &B10010010
Gosub Opoznienie
Sekwencja = &B01001001
Gosub Opoznienie
Sekwencja = &B00100100
Gosub Opoznienie
Sekwencja = &B00010010
Gosub Opoznienie
Sekwencja = &B00001001
Gosub Opoznienie
Sekwencja = &B00000100
Gosub Opoznienie
Sekwencja = &B00000010
Gosub Opoznienie
Sekwencja = &B00000001
Gosub Opoznienie
Sekwencja = &B01111111
Gosub Opoznienie
Sekwencja = &B00111111
Gosub Opoznienie
Sekwencja = &B00011111
Gosub Opoznienie
Sekwencja = &B00001111
Gosub Opoznienie
Sekwencja = &B10000111
Gosub Opoznienie
Sekwencja = &B11000011
Gosub Opoznienie
Sekwencja = &B11100001
Gosub Opoznienie
Sekwencja = &B11110000
Gosub Opoznienie
Sekwencja = &B00111111
Gosub Opoznienie
Sekwencja = &B10011111
Gosub Opoznienie
Sekwencja = &B11001111
Gosub Opoznienie
Sekwencja = &B11100111
Gosub Opoznienie
Sekwencja = &B11110011
Gosub Opoznienie
Sekwencja = &B11111001
Gosub Opoznienie
Sekwencja = &B11111100
Gosub Opoznienie
Sekwencja = &B00111100
Gosub Opoznienie
Sekwencja = &B10011100
Gosub Opoznienie
Sekwencja = &B11001100
Gosub Opoznienie
Sekwencja = &B11100100
Gosub Opoznienie
Sekwencja = &B11110000
Gosub Opoznienie
Sekwencja = &B00110000
Gosub Opoznienie
Sekwencja = &B10010000
Gosub Opoznienie
Sekwencja = &B11000000
Gosub Opoznienie
Sekwencja = &B00000000
Gosub Opoznienie
Loop
Opoznienie:
Waitms 200
Return
Dodano po 24 [minuty]:
hha! Już wiem o co chodzi! Ma to wyglądać mniej więcej tak?
Code:
'Program do sterowania oświetlenia karuzeli 8 kanałowego
$regfile = "m8def.dat" 'informuje kompilator o pliku dyrektyw
'wykorzystywanego mikrokontrolera
$crystal = 8000000 'informuje komplitaor o częstotliwości
'oscylatora taktującego mikrokontroler
Config Portd = Output 'Wszystkie linie portu D jako wyjściowe
Sekwencja Alias Pinb.0
Szybkosc Alias Pinb.1
Do sterowania użyjmy portu B. Przycisk do zmiany efektów to pin D.2, będzie działać na przerwaniu. Potencjometr to pin C.0, przetwornik. No to prawie że gotowiec:
Code:
$regfile = "m8def.dat"
$crystal = 8000000
Config Portb = Output 'Wszystkie linie portu D jako wyjściowe
Dim Opoznienie As Word 'opóźnienie między przełączeniami, liczba do 65535
Dim Efekt As Byte 'numer efektu
Dim X As Byte 'indeks
Dim Port As Byte 'liczba którą wpiszemy do portu
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Enable Interrupts
On Int0 Przerwanie 'włączamy przerwania
Enable Int0
Do
'tutaj główna część
If Efekt = 0 Then Gosub Wprawo 'jeśli włączony efekt nr1, to idź do podprogramu WPRAWO
If Efekt = 1 Then Gosub Dosrodka 'itp
'i tak dalej...
'i po wykonaniu efektu można sprawdzać stan potencjometru
Gosub Potencjometr
Loop
End
'-------------------------
Potencjometr: 'podprogram sprawdzania wartości z potencjometru
Start Adc
Opoznienie = Getadc(0) 'w tym przypadku pinC.0
Stop Adc
Opoznienie = Opoznienie * 2 'mnożymy gdyby było za mało
Return
Przerwanie:
Disable Int0
Incr Efekt 'zmieniamy efekt
If Efekt > 9 Then Efekt = 0 'jeśli mamy tylko 10 efektów
Waitms 50 'lekkie opóźnienie żeby nie zwiększyć kilkukrotnie za jednym przyciśnięciem
Enable Int0
Return
'--------------------------
Wprawo:
Port = 255
For X = 0 To 7 'powtarzane 8 razy
Shift Port , Right 'przesuwam o jeden w prawo
Portb = Port 'wpisuje wartość do portu
Waitms Opoznienie 'opóźniam
Next X
Return
Dosrodka:
For X = 0 To 4 'powtarzane 5 razy
Port = Lookup(x , Tab_dosrodka) 'sekwencje odczytuje z tabeli
Portb = Port
Waitms Opoznienie
Next X
Return
'i tutaj następne efekty...
'a niżej tabele z sekwencjami:
Tab_dosrodka:
Data &B11111111 , &B01111110 , &B00111100 , &B00011000 , &B00000000
Nie wiem jak to zadziała, najlepiej sprawdzić w praktyce. Ale program kompiluje się bez błędów.
I jeśli efektów nie da się zrobić prostymi komendami z przesuwaniem bitów w bajcie, to można je zapisać do tabeli i kolejno odczytywać. Z resztą efektów robisz analogicznie do tego co podałem wyżej. A to, jak te efekty będą połączone, zależy od pomysłowości. Możesz też dać warunek, np. "If efekt = ileśtam Then Gosub Cośtam" - i w podprogramie "Cośtam" dajesz kolejno skoki do innych podprogramów obsługujących sekwencje, w ten sposób wygodnie uzyskasz połączone efekty. No a jeśli chciałbyś zamiast przeączania przyciskiem, automatyczne zmiany, to można dać tak:
Code:
Efekt Rnd(10)
Program wygeneruje pseudolosową liczbę z zakresu 1 do 10, i wpisze ją do zmiennej Efekt.
Powodzenia :)
Ok, wielkie dzięki :) 50pkt dla Ciebie
Jeszcze jakbyś mi powiedział (chcę się upewnić, a cóż.. w Bascomie jestem (na razie) słaby) czy mogę wkleić kolejne sekwencje poniżej tego
Code:
Data &B11111111 , &B01111110 , &B00111100 , &B00011000 , &B00000000
, czyli ostatniej linii bezpośrednio np.
Code:
Data &B01111111 , &B00111111 , &B00011111 , &B00001111 itd
I kolejne sekwencje wpisując tylko dyrektywę "Data" i wpisując tylko "&Bxxxxxxxx" ?
Mi wystarczy, jak program sam będzie chodził, same sekwencje kolejno będą chodzić, a gdy chcę moge przerzucić na następną (przyciskiem) no i szybkość tym potencjometrem. To już mamy, dzięki Tobie, a pytanie teraz, czy sekwencje same będą chodzić, czy muszę po każdej nacisnąć przycisk aby przejść do następnej?
Może wydawać się dziwne, że chcę na chama robić a nie kupić, ale kupny sterownik 4 kanałowy o mocy 2kW/kanał kosztuje ok. 400zł, więc sam widzisz że za dużo. A przy budowie dużej karuzeli koszta trzeba minimalizować, więc się szarpnąłem na to, i muszę udowodnić tacie że zrobię.
Pozdrawiam Cię Manekinen i raz jeszcze dzięki:)
port to zmienna do której je wpisujesz, x to indeks, oznacza numer kolejnej danej z tabeli, nazwatabeli jak sama nazwa mówi.
a tak wyglądać ma tabela:
Code:
nazwatabeli:
data dane, dane, dane, 'itd
każda tabela musi mieć swoją nazwę.
A to jak te sekwencje się mają wyświetlać, zależy jak je poukładasz w programie. Najpierw porób podprogramy typu "WLEWO" które będą wykonywały krótkie operacje na lampkach. Później porób podprogramy które będą sterowały tymi pierwszymi wg jakiejś tam kolejności. Od tej chwili wszystko jest proste, operujesz tylko na warunkach IF i skokach do podprogramów. Czysta logika, żadnego kombinowania. Jak to poukładasz zależy od ciebie. No wybacz, ale to już możesz sam zrobić - najpierw zbuduj układ i go uruchom, na bieżąco będziesz dodawał jakieś podprogramy z sekwencjami i sprawdzał jak to się ma w praktyce.
Powodzenia.