FAQ | Points | Add... | Recent posts | Search | Register | Log in


[bascom] Prośba o pomoc w napisaniu programu


Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> [bascom] Prośba o pomoc w napisaniu programu
Author
Message
!katun!
Poziom 19
Poziom 19


Joined: 22 Feb 2006
Posts: 676
Location: Gliwice

Post#1 Post from the author of the topic 10 Mar 2008 01:21   

Re: [bascom] Prośba o pomoc w napisaniu programu


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:


Link


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:
Code:

Portd=&B10000001
Portd=&B11000011
Portd=&B11100111
Portd=&B11111111
Albo coś takiego:
Code:

Portd=&B10000000
Portd=&B11000000
Portd=&B11100000
Portd=&B11110000
Portd=&B11111000
Portd=&B11111100
Portd=&B11111110
Portd=&B11111111

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

Do
Portd = &B10000001
Waitms 500
Portd = &B11000011
Waitms 500
Portd = &B11100111
Waitms 500
Portd = &B11111111
Waitms 500
Portd = &B10000001
Waitms 500
Portd = &B11000011
Waitms 500
Portd = &B11100111
Waitms 500
Portd = &B11111111
Waitms 500
Portd = &B10000001
Waitms 500
Portd = &B11000011
Waitms 500
Portd = &B11100111
Waitms 500
Portd = &B11111111
Waitms 500
Portd = &B10000001
Waitms 500
Portd = &B11000011
Waitms 500
Portd = &B11100111
Waitms 500
Portd = &B11111111
Loop



Jeśli ktoś mi takie coś zrobi, i rzeczywiście zadziała, to ozłocę setą punktów! hehe :) Pozdrawiam.
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 10 Mar 2008 01:21   





Back to top
   
manekinen
Poziom 21
Poziom 21


Joined: 12 Apr 2006
Posts: 1292
Location: Kętrzyn

Post#2 10 Mar 2008 01:31helpful post - solution   

Re: [bascom] Prośba o pomoc w napisaniu 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:
Code:

Config Adc = Single, Prescaler = Auto, Reference = Avcc
Start Adc

i w programie co jakiś czas sprawdzasz sobie:
Code:

opoznienie = getadc(0)

i zamiast waitms 500, dajesz
Code:

waitms opoznienie

albo jeśli to za mało to sobie mnożysz.

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 :)
Back to top
   
Google

Google Adsense


Post# 10 Mar 2008 01:31helpful post - solution   





Back to top
   
!katun!
Poziom 19
Poziom 19


Joined: 22 Feb 2006
Posts: 676
Location: Gliwice

Post#3 Post from the author of the topic 10 Mar 2008 02:57   

Re: [bascom] Prośba o pomoc w napisaniu programu


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

Config Adc = Single, Prescaler = Auto, Reference = Avcc
Start Adc

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

Shift Sekwencja , Right , 7

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:
Getadc(0)
Return
End

Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 10 Mar 2008 02:57   





Back to top
   
nsvinc
Poziom 22
Poziom 22


Joined: 25 Mar 2006
Posts: 2066
Location: otfock

Post#4 10 Mar 2008 11:23   

Re: [bascom] Prośba o pomoc w napisaniu programu


co ci da SAMO getadc(0)? Gdzie jest zmienna ktora bedzie przechowywac wartosc zwróconą przez to getadc(0) ? :D
Dopisz na poczatku programu to
Code:

dim op as word


a w subie "opóźneinie"
Code:

opoznienie:
op=getadc(0)
waitms op
return

Back to top
   
manekinen
Poziom 21
Poziom 21


Joined: 12 Apr 2006
Posts: 1292
Location: Kętrzyn

Post#5 10 Mar 2008 11:34helpful post - solution   

Re: [bascom] Prośba o pomoc w napisaniu programu


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 :)
Back to top
   
Google

Google Adsense


Post# 10 Mar 2008 11:34helpful post - solution   





Back to top
   
!katun!
Poziom 19
Poziom 19


Joined: 22 Feb 2006
Posts: 676
Location: Gliwice

Post#6 Post from the author of the topic 12 Mar 2008 12:23   

Re: [bascom] Prośba o pomoc w napisaniu programu


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:)
Back to top
   
manekinen
Poziom 21
Poziom 21


Joined: 12 Apr 2006
Posts: 1292
Location: Kętrzyn

Post#7 12 Mar 2008 12:55helpful post - solution   

Re: [bascom] Prośba o pomoc w napisaniu programu


tak odczytujesz dane z tabeli:
Code:
Port = Lookup(x , nazwatabeli)

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.
Back to top
   
!katun!
Poziom 19
Poziom 19


Joined: 22 Feb 2006
Posts: 676
Location: Gliwice

Post#8 Post from the author of the topic 12 Mar 2008 14:46   

Re: [bascom] Prośba o pomoc w napisaniu programu


Ok, wyjaśniłeś już wszystko, już dla mnie to wszystko jasne.
Za cierpliwość masz jeszcze 20pkt ;)
Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> [bascom] Prośba o pomoc w napisaniu programu
Page 1 of 1
Similar topics
[BASCOM]Pomoc w napisaniu programu - Zegar LCD Attiny2313 (11)
LCD Atmega 8 i bascom - pomoc w napisaniu programu (7)
Prośba o pomoc w napisaniu programu Atmega8 (8)
Prośba o pomoc w napisaniu programu Atmega8 (2)
[Bascom] Pomoc w napisaniu programu. (32)
Bascom, pomoc w napisaniu programu (11)
Prośba o pomoc w napisaniu programu Bascom, obsługa ekranu LCD (2)
[bascom] Prośba o pomoc w napisaniu programu (3)
ONP - prośba o pomoc w napisaniu bloku programu ANSI C/C++ (1)
Pomoc w napisaniu programu w C++ ... (33)

Page generation time: 0.155 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed