logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[BASCOM] Pomoc przy prostym programie

Flavo89 10 Lut 2010 11:37 2045 17
REKLAMA
  • #1 7672252
    Flavo89
    Poziom 10  
    Witam,

    moj projekt jest dosc prosty, 15 ledow i przycisk, ktorym sterujemy zmianami kombinacji mrugania diod. napisalem program w bascomie, ale nie jestem pewny czy mozna w ten sposob napisac obsluge przycisku, wiec prosze o pomoc, na pewno poprawienie bledow nie zajmie dlugo. program jest troche przydlugawy, ale glownie chodzi mi w nim o zapalanie diod, wiec dlatego tak wyglada. nie uzywalem zbyt czesto bascoma, wiec nie wiem czy mozna to jakos skrocic :)

    $regfile "m8def.dat"
    $crystal = 1000000
    Config Portb = Output
    Config Portc = Output
    Config Portd = Output
    Config Pind.0 = Input                                       'przycisk
    Config Pind.1 = Input                                       'przycisk
    
    S1 Alias Pind.0
    S2 Alias Pind.1
    
    Set Portd.0
    Set Portd.1
    
    Dim A As Byte
    A = 1
    If S1 = 0 And S2 = 0 Then                                   'zwiekszenie zmiennej zliczajacej
    A = A + 1
    
    For A = 1 To 3
    Do
    If A = 1 Then
    Portb.0 = 1
    Waitms 250
    Portb.0 = 0
    Waitms 250
    Portb.1 = 1
    Waitms 250
    Portb.1 = 0
    Waitms 250
    Portb.2 = 1
    Waitms 250
    Portb.2 = 0
    Waitms 250
    Portb.3 = 1
    Waitms 250
    Portb.3 = 0
    Waitms 250
    Portb.4 = 1
    Waitms 250
    Portb.4 = 0
    Waitms 250
    Portb.5 = 1
    Waitms 250
    Portb.5 = 0
    Waitms 250
    Portc.0 = 1
    Waitms 250
    Portc.0 = 0
    Waitms 250
    Portc.1 = 1
    Waitms 250
    Portc.1 = 0
    Waitms 250
    Portc.2 = 1
    Waitms 250
    Portc.2 = 0
    Waitms 250
    Portc.3 = 1
    Waitms 250
    Portc.3 = 0
    Waitms 250
    Portc.4 = 1
    Waitms 250
    Portc.4 = 0
    Waitms 250
    Portc.5 = 1
    Waitms 250
    Portc.5 = 0
    Waitms 250
    Portd.4 = 1
    Waitms 250
    Portd.4 = 0
    Waitms 250
    Portd.3 = 1
    Waitms 250
    Portd.3 = 0
    Waitms 250
    Portd.2 = 1
    Waitms 250
    Portd.2 = 0
    Waitms 250
    End If
    Next A
    Loop
    
    Do
    If A = 2 Then
    Portc.1 = 1
    Waitms 250
    Portc.0 = 1
    Portc.2 = 1
    Waitms 250
    Portb.5 = 1
    Portc.3 = 1
    Waitms 250
    Portb.4 = 1
    Portc.4 = 1
    Waitms 250
    Portb.3 = 1
    Portc.5 = 1
    Waitms 250
    Portb.2 = 1
    Portd.4 = 1
    Waitms 250
    Portb.1 = 1
    Portd.3 = 1
    Waitms 250
    Portb.0 = 1
    Portc.2 = 1
    Waitms 250
    Portb = 0
    Portc = 0
    Portd = 0
    End If
    Next A
    Loop
    
    If A = 3 Then
    A = 1
    End If


    chcialem jeszcze dodac, ze nie moge go na razie przetestowac z powodow ode mnie nie zaleznych, dlatego prosze o pomoc, pozdrawiam :)
  • REKLAMA
  • #2 7672368
    august_a
    Poziom 21  
    Ten program jest totalnie źle napisany. Zajrzyj do helpu Bascoma i po pierwsze poczytaj o pętlach FOR, DO itd..
    Zwiększasz licznik "A" poza pętlą?? Ciekawe...
  • #3 7672394
    leon1313
    Poziom 15  
    obsługa przycisku:
    
    If s1 = 0 Then
       Waitms 50
       Incr A
       Bitwait s1 , Set
     End If
    

    Poza tym należy uczyć case i jakiegoś timera- ze względu na dużą ilość Wait-ów
  • REKLAMA
  • #4 7672627
    ewsd75
    Poziom 13  
    Kolego Flavo 89 proponuje troszkę inne rozwiązanie zapisu:

    if A=1 Then

    portb=1
    waitms 250
    portb=0
    waitms 250
    portb=2
    waitms 250
    portb=0
    waitms 250
    portb=4
    waitms 250
    portb=0
    waitms 250
    portb=8
    waitms 250
    portb=0
    waitms 250
    portb=16
    waitms 250
    portb=0
    waitms 250
    portb=32
    waitms 250
    portc=0


    portc=1
    waitms 250
    portc=0
    waitms 250
    portc=2
    waitms 250
    portc=0
    waitms 250
    portc=4
    waitms 250
    portc=0
    waitms 250
    portc=8
    waitms 250
    portc=0
    waitms 250
    portc=16
    waitms 250
    portc=0
    waitms 250
    portc=32
    waitms 250
    portc=0

    portc=16
    waitms 250
    portc=0
    waitms 250
    portc=8
    waitms 250
    portc=4
    waitms 250
    portc=0

    End if

    Myślę że taki zapis jest przyjemniejszy niż ustawianie poszczególnych pinów na 1 czy 0. Trzeba jedynie przeliczyć wartość jaką chcemy wysłać na port mikrokontrolera.
  • #5 7672833
    xury
    Specjalista automatyka domowa
    august_a napisał:
    Ten program jest totalnie źle napisany. Zajrzyj do helpu Bascoma i po pierwsze poczytaj o pętlach FOR, DO itd..
    Zwiększasz licznik "A" poza pętlą?? Ciekawe...

    To samo chciałem napisać.
    Najciekawsza jest "kombinacja alpejska":
    For A = 1 To 3 
    Do
    ...
    Next A
    Loop
    

    A potem druga pętla Do...Loop,która nigdy się nie wykona itd.
  • #6 7673163
    mirekk36
    Poziom 42  
    ewsd75 --> oj to nie jest żadne przyjemniejsze rozwiązanie, jest tak samo niestety mało efektywne delikatnie mówiąc i w ten sposób nie pisze się programów, także poczytaj o zastosowaniu pętli typu FOR i co to daje
  • #7 7675230
    leon1313
    Poziom 15  
    Ok 24 wait-ów ćwierć sekundowych = raz na 6 sek jest sprawdzany przycisk...
    Nie kole w oczy?
  • REKLAMA
  • #9 7675423
    Flavo89
    Poziom 10  
    Witam,

    dziekuje za wszystkie odpowiedzi, wiem, ze program jest zle napisany, ale staralem sie cos zrobic sam ;)

    moze moglibyscie powiedziec, czy to jest juz lepsze, a jesli nie to co i w jaki sposob moge zmienic ?

    $regfile "m8def.dat"
    $crystal = 1000000
    Config Portb = Output
    Config Portc = Output
    Config Portd = Output
    Config Pind.0 = Input                                       'przycisk
    
    
    S1 Alias Pind.0
    
    Dim A As Integer
    A = 0
    
    Do
    If S1 = 0 Then
       Waitms 50
       Incr A
       Bitwait S1 , Set
     End If
    
    If A = 1 Then
    Portc.1 = 1
    Waitms 250
    Portc.0 = 1
    Portc.2 = 1
    Waitms 250
    Portb.5 = 1
    Portc.3 = 1
    Waitms 250
    Portb.4 = 1
    Portc.4 = 1
    Waitms 250
    Portb.3 = 1
    Portc.5 = 1
    Waitms 250
    Portb.2 = 1
    Portd.4 = 1
    Waitms 250
    Portb.1 = 1
    Portd.3 = 1
    Waitms 250
    Portb.0 = 1
    Portc.2 = 1
    Waitms 250
    Portb = 0
    Portc = 0
    Portd = 0
    End If
    
    Loop
  • #10 7675486
    mirekk36
    Poziom 42  
    Można to skrócić do kilku linijek - poważnie. Tylko trzeba sobie rozplanować hmmm jakby to powiedzieć matematycznie - co chcesz robić i jak zapalać te LEDy - wypuszczając na port cały bajt z już obliczonymi bitami które będą sterowały diodami. Dzięki temu wystarczy dodać instrukcję Debounce i do tego będzie ci jeszcze klawiszologia pięknie śmigać.

    To co robisz to czyste programowanie liniowe - tak się nie robi bo gdyby tak pisać programy to miganie np 40diodami LED czy sterowanie wyświetlaczem matrycowym składającym się z kilkused diod - zabrałoby pamięć nawet największego procka ATmega128 nie mówiąc już o tym, że tak się nawet nie da zrobić większości rzeczy. Więc jak najszybciej trzeba zmienić podejście. Jak???
    Podpatrywać jak inni to robią albo jakiś dobry kurs ;)
  • #11 7675578
    Flavo89
    Poziom 10  
    mirekk36 napisał:
    Można to skrócić do kilku linijek - poważnie. Tylko trzeba sobie rozplanować hmmm jakby to powiedzieć matematycznie - co chcesz robić i jak zapalać te LEDy - wypuszczając na port cały bajt z już obliczonymi bitami które będą sterowały diodami. Dzięki temu wystarczy dodać instrukcję Debounce i do tego będzie ci jeszcze klawiszologia pięknie śmigać.


    wlasnie to jest ten problem, ze ja nie czuje do tego pociagu, zostalem zmuszony do zrobienia takiego projektu :) na zajeciach nie korzystalismy z Debounce i tez nie wpuszczalismy od razu bajtow z obliczonymi bitami na porty, tylko robilismy to tak liniowo, bo w sumie uzywalismy 2 diod zwykle. w piatek musze oddac ten projekt i nie wiem czy zdolam to ogarnac :D


    ogoolnie to ten projekt mial wygladac tak, ze przyciskiem zmieniam te kombinacje, np od lewej do prawej, od srodka na boki, ale nie wiem jak to wszystko zawrzec w skroconej formie :P

    to nie byl moj konik, ja lubie bazy danych :D
  • #12 7675609
    leon1313
    Poziom 15  
    Mirekk36 - co racja to racja - choć przy tak małym projekcie lookup byłby boski. Ile wykorzysta na to pamięci? 1-2k ?
  • REKLAMA
  • #13 7675740
    mirekk36
    Poziom 42  
    leon1313 napisał:
    Mirekk36 - co racja to racja - choć przy tak małym projekcie lookup byłby boski. Ile wykorzysta na to pamięci? 1-2k ?


    No, lookup to jak najbardziej prawidłowe rozwiązanie. W ogóle rozwiązań jest tyle ilu programistów ;) na świecie.
  • #14 7675746
    Flavo89
    Poziom 10  
    a moze ktos z was zlitowalby sie nade mna i pokazal mi jak taki program mozna napisac? jakas najprostsza wersje, zebym mogl zrozumiec o co chodzi i dopisac reszte ? bylbym bardzo wdzieczny:)
  • #15 7675785
    xury
    Specjalista automatyka domowa
    no przecież koledzy podają Ci rozwiązania jak na talerzu.
    Teraz tylko lektura helpa i analiza przykładów w nim zawartych.
    Przede wszystkim:
    Lookup
    For...Next
    Debounce

    No i masz symulator w Bascomie, który sobie poradzi z tak prostym programem

    no i jeszcze nieśmiertelne
    Rotate
    Shift
  • #16 7675857
    morson
    Poziom 14  
    Poczytaj sobie o SHIFT, bo np taki kawałek kodu będzie przesuwał w jedną stronę

    
    Dim I As Byte
    Dim A As Word ' 16 bitowa zmienna (chyba)
    
    A = 1
    For I = 1 To 15
     Portb = Low(a) ' pierwszy port
     Portc = High(a) ' drugi port
     Shift A , Right , 1
     Waitms 250
    Next I
    


    podobnie dzieląc to na 2 części i stosując dla jednej Shift Left, a dla drugiej Shift Right zrobisz "pływanie" od środka i do środka, wpleć poza tym sprawdzanie przycisku gdzieś w środek
  • #17 7729057
    Flavo89
    Poziom 10  
    Co jest zle w tym programie, ze czesc diodek miga w jeden sposob, czesc w inny, a przycisniecie przycisku zatrzymuje miganie i swieci ciagle jedna dioda? dodatkowo na poczatku jedna dioda miga rozna ilosc razy za kazdym razem i dopiero po chwili przechodzi do tego migania opisanego wyzej.

    $regfile "m8def.dat" 
    $crystal = 1000000 
    Config Portb = Output 
    Config Portc = Output 
    Config Portd = Output 
    Config Pind.0 = Output 
    Config Pind.1 = Input 'przycisk 
    
    S1 Alias Pind.1 
    
    Dim A As Byte 
    Dim I As Byte 
    Dim B As Word                                               ' 16 bitowa zmienna (chyba) 
    
    A = 0 
    
    Do 
    
    If S1 = 0 Then 
    Waitms 50 
    Incr A 
    Bitwait S1 , Set 
    End If 
    
    Select Case A 
    Case 1: 
    B = 1 
    For I = 1 To 15 
    Portb = Low(b)                                              ' pierwszy port 
    Portc = High(b)                                             ' drugi port 
    Shift B , Right , 1 
    Waitms 250 
    Next I 
    Case 2: 
    cos tam 
    End Select 
    Loop 
    Return
REKLAMA