Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Program w Bascom - coś nie tak

marion 25 Oct 2006 01:59 1652 10
IGE-XAO
  • #1
    marion
    Level 12  
    Witam serdecznie - oto fragment programu do sterowania bramą. Całośc działa w ten sposób że po zwarciu "Pind.1" następuje zapalenie lampy sygnalizacyjnej nad bramą "Portb.1" i jednocześnie wysłany jest sygnał aby otworzyć tę bramę "Portc.1", jednocześnie program ma dwa razy mignąć lampą "Portc.5" i tu tkwi problem, nie wiem jak to zrobić, pewnie dla was to "bułka z masłem" ale ja nie moge tego zrobić. Będe wdzięczny za wszelkie wskazówki. Poniżej fragment programu

    Dim Sekundy_brama_2 As Byte , Licznik_brama_2 As Byte

    Const Czasbramy_2 = 1

    Waitms 25 'czekaj 25 ms
    Debounce Pind.1 , 0 , Brama2 , Sub
    If Pind.1 = 0 Then Portb.1 = 0 'zapalenie lampy alarmowej 2
    If Pind.1 = 1 Then Portb.1 = 1 'zgaszenie lampy alarmowej 2
    If Portc.1 = 0 Then 'gdy światło włączone odliczaj czas
    Incr Licznik_brama_2 'co koło 25ms
    If Licznik_brama_2 = 30 Then 'co około 1s
    Licznik_brama_2 = 0
    Incr Sekundy_brama_2 'co około 1s zwiększ
    If Sekundy_brama_2 = Czasbramy_2 Then Portc.1 = 1 'wyłącz światło
    End If
    Else 'w spoczynku, gdy światło wyłączone
    Licznik_brama_2 = 0 : Sekundy_brama_2 = 0
    End If

    Brama2:
    Toggle Portc.1
    Return

    Pozdrawiam
  • IGE-XAO
  • #2
    electro_Nick
    Level 33  
    MOznaby wiecej szczegolow nt tego co ma robic program-z listingu widze ze program ma tez jakis czas odliczac...
  • IGE-XAO
  • #3
    *Piotrek*
    Level 15  
    Jak możesz to załącz schemat to coś się wykombinuje.
  • #4
    marion
    Level 12  
    Czas liczony jest po to aby wysłać odpowiedni sygnał o odpowiedniej długości z "Portc.1" do bramy , za krótki-brama nie zadziała, za długi-brama się zatrzyma. Dodatkowo na porcie "Portb.1" pojawia się sygnał w celu zapalenia lampy oświetleniowej, sygnał trwa tak długo jak długo "Pind.1" jest zwarty do masy. I to wszystko działa prawidłowo tylko nie potrafię poradzić sobie z jeszcze jedną funkcją: dodatkowo po zwarciu "Pind.1" z masą na "Portc.5" powinien zostać wysłany sygnał pozwalający na dwukrotne mignięcie dodatkowej lampy z częstotliwością: sekunda-zapalona, sekunda-zgaszona, sekunda-zapalona.

    Pozdrawiam
  • #5
    cyberdar
    Level 31  
    Witam

    Możesz to zrobić w podprogramie albo w przerwaniu. Jeśli w podprogramie to po pojawieniu się sygnału do otwarcia bramy daj sygnał do jej otwarcia, zapal lampę i skocz do podprogramu, w którym zapalisz lampę odczekasz sekundę, zgasisz ją, odczekasz sekundę i powtórzysz to np. 3 razy. Problem polega na tym, że jeśli będziesz w takim podprogramie i powtórzysz go trzkrotnie (w sumie 6 sekund) to nie będziesz wiedział co się dzieje z bramą; czy np. nie pojawił się sygnał z bariery o ile taką przewidziałeś.
    Drugim rozwiązaniem o wiele lepszym jest zrobienie czegoś takiego w oparciu o przerwanie. Skonfigurujesz sobie TIMER, który będzie odliczał np. sekundę. W momencie wystąpienia przerwania zanegujesz pin i lampa się zaświeci. Po kolejnym przerwaniu lampa zgaśnie. Możesz w takim przerwaniu zaimplementować np. trzy powtórzenia po czym wyłączysz TIMER. Włączanie timera odbywać się będzie w chwili pojawienia się sygnału otwarcia. W tym wypadku uC może wykonywać inne czynności jak np. sprawdzanie czy jakiś obiekt nie znalazł się w "polu rażenia"

    --
    pozdrawiam
  • #6
    marion
    Level 12  
    "cyberdar"
    Właśnie o cos takiego mi chodziło, ja to robiłem w podprogramie i w momencie skoku do niego procesor nic innego nie robił tylko zapalał i gasił lampę i dopiero po tym wykonywał pozostały program. Rozwiazanie z przerywaniami wydaje mi sie dobre tylko ja nie za bardzo daję sobie rade z tym. Może jakis delikatny przykład??

    *Piotrek* wrote:
    Jak możesz to załącz schemat to coś się wykombinuje.


    Schemat tu nic nie da. Wszystko wygląda tak

    Pind.1 - Włącznik otwierający brame i uruchamiający pozostałe funkcje
    Portc.1 - Sygnał 2 sek. wysłany do bramy w celu otwarcia jej
    Portb.1 - Sygnał zapalający oświetlenie - czas trwania = czasowi włączenia "Pind"
    Portc.5 - Sygnał (1sek.włącz-1sek.wyłącz-1.sek.włącz) w celu mignięcia lampy dodatkowej po załączeniu "Pind.1


    Aha może to ważne - µC to Atmega8

    Pozdrawiam
  • #7
    M. S.
    Level 34  
    A może by tak zastosować pętlę Do - Loop. Obecnie program przeleci raz i nici z inkrementowania. Dodatkowo bez END pewnie pójdzie gdzieś w maliny.
    Jeśli podczas oczekiwania procesor nie musi nic robić polecam instrukcję Wait (i podobne) do odmierzania czasu.
  • #8
    *Piotrek*
    Level 15  
    Nie jestem pewien czy dobrze zrozumiałem o co Ci dokładnie chodzi ale może to co napisałem na szybko będzie działać :D
    Program powinien się zachowywać tak:
    1. czeka na przycisk, jesli go wciśniemy to
    2. zapala oświetlenie (portb.1=1), oraz włącza sygnał sterujący bramą (portc.1=1)
    3.zapala lampkę, czeka sekundę, gasi lampkę i czeka sekunde.(tu mija nam mniej więcej 2 sekundy od włączenia sygnału sterującego bramą)
    4. wyłączamy bramę (portc.1=0)
    5 teraz program wchodfzi w pętle która zapala i gasi lampkę co sekunde
    6. czekamy na puszczenie przycisku, jeśli zostanie puszczony to:
    7.gasimy oświetlenie i spowrotem czekamy na przyciśnięcie przycisku.

    Jeśli coś przeoczyłem albo źle zrozumiałem to prosze o bardziej szczegułowe wyjaśnienie, i postaram się poprawić to co skopałem:D
    Code:

    do
     if pind.1=0 then 'jeśli pind.1 zwarty do masy to
     portb.1=1 'zapalenie oświetlenia
     portc.1=1 'wlaczenie sygnalu na 2 sek
     portc.5=1 'zapalenie lampki
     wait 1    'czekamy 1 sekunde
     portc.5=0 'gasimy lampke
     wait 1      'czekamy 1 sekunde
     portc.1=0 'wylaczamy sygnal wysylany do bramy po uplywi 2 sekund
      do 'petla bedzie powtarzana dopuki bedzie wcisniety przycisk
       portc.5=1 'zapalamy lampke
       wait 1
       portc.5=0 'gasimy lampke
      loop until pind=0'powtarzaj dopuki jest wcisniety przycisk
     end if 'koniec warunku
     portb.1=0 'gasimy oswietlenie
    loop
    end 'koniec:D

    Pozdrawiam Piotrek
  • #9
    marion
    Level 12  
    Nie do końca tak, po pierwsze cykl zapalenia i gaszenia lampy musi być tylko raz, czyli cykl=1 sek.zapal, 1 sek. zgaś, 1 sek. zapal, i zgaś. Cykl ten już nie będzie powtarzany w czasie tego naciśnięcia przycisku, powtarzany będzie dopiero po ponownym naciśnięciu przycisku. Pozatym Wait wstrzymuje działanie całego programu, a tak nie może być - dlaczego, a dlatego że przy tej bramie lampka miga dwa razy,ale przy następnej bramie będzie już migać 6 razy i tan czas przerwy w działaniu programu juz jest za długi - brama stanie w miejscu.
  • #10
    szymtro
    Level 30  
    Przychodzi mi do głowy pomysł z krokami-pętlami aby zrealizować twoje funkcje. Gdyż bądź co bądź masz tam warunki sekwencyjne - chyba że źle przeczytałem (ale czytałem ze trzy razy).
    Można było by zrobić coś takiego:

    Code:
    petla_00: 'zero, oczekiwanie na przycisk
    
     if pind.1=0 then go to petla_01_start
    goto petla_00

    petla_01_start:
     tajmerek_pomocniczy=233 'zaladowanie jakiegos czasu tego kroku
    petla_01:
     portc.1=1 'sygnal do startu bramy
     if pind.0=1 then goto petla_00 'gdy puscimy przycisk powrot do zera
     if tajmerek_pomocniczy=0 then goto petla_02_start
    goto petla_01

    petla_02_start:
     tajmerek_pomocniczy=233 'zaladowanie jakiegos czasu tego kroku
    petla_02:
     portc.1=0
     if pind.0=1 then goto petla_00 'gdy puscimy przycisk powrot do zera
     if tajmerek_pomocniczy=0 then goto petla_03_start
    goto petla_02
    .....

    Tajmerek pomocniczy ma byc caly czas dekrementowany gdy jest >0 w przerwaniu tajmera co określony czas. Mozna podzielic sobie na kilka kroków jak potrzeba żeby np lampka mignęła dwa razy podczas gdzy sterowanie brama ma być cały czas aktywne. Minusem jest to że trochę programu sie tworzy ale M8 ma sporo wolnego miejsca a zyskujemy przejrzystość.
  • #11
    marion
    Level 12  
    NIestety żadna z powyższych kwestii nie działa odpowiednio, może ktos ma ine pomysły??
    Będę wdzięczny za pomoc.