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

sterownik do naświetlarki na uC (problem z programem)

drox_x 10 Lis 2009 20:28 1209 2
REKLAMA
  • #1 7242305
    drox_x
    Poziom 11  
    Witam trochę raczkuje w programowaniu uC ale do rzeczy

    chce zrobić wyłącznik czasowy do mojej naświetlarki program napisałem ale nie spełnia moich oczekiwań a mianowicie

    założenia

    -dwa niezależne programy pierwszy 16 sekund drugi 2 min 25 sec (działa)

    -edycja czasu każdego programu (działa) ale nie zapamiętuje po przejściu do innego programu :(

    -odzyskanie trochę miejsca w pamięci bo program zajmuje 99% pamięci

    a chce jeszcze upchnąć termometr na 1-wire i trzeci program

    proszę o pomoc w poprawieniu programu /pewnie jest sporo błędów




    
    
    $regfile = "Attiny2313.dat"
    $crystal = 4000000
    
    Dim Sek As Byte
    Dim Mint As Byte                                            'deklaracja zmiennych
    Dim Przezutnik As Bit
    Dim Pp As Bit
    Dim Kto As Bit
    Dim P1 As Byte
    Dim P2 As Byte
    
    
    Config Portb = &B11111111
            Portb = &B11111100
    Config Portd = &B1000000
            Portd = &B1111111
     Cursor Off
    Enable Interrupts : Enable Timer1                           'konfiguracja tajmera
    Config Timer1 = Timer , Prescale = 64
    
    
    On Timer1 Czas                                              'wlaczenie tajmera
    
                 Cls
               Locate 1 , 1                                     'pozycja tekstu na wyswitlaczu
             Lcd "Naswietlarka UV"
               Locate 2 , 4                                     'pozycja tekstu na wyswitlaczu
             Lcd " by DroX"
    
             Wait 2
               Cls
              Mint = 0 : Sek = 0                                'stna poczatkowy zegara
    
              Stop Timer1                                       'zatrzymanie tajmera
    
        '    Cls
    
            Do
            Debounce Pind.0 , 0 , S , Sub                       'badanie przyciskow
            Debounce Pind.1 , 0 , G , Sub                       'badanie przyciskow
            Debounce Pind.1 , 0 , G , Sub                       'badanie przyciskow
            Debounce Pind.2 , 0 , Zwieksz , Sub                 'badanie przyciskow
            Debounce Pind.3 , 0 , Zmniejsz , Sub                'badanie przyciskow
            Debounce Pind.4 , 0 , Przelacznik , Sub             'badanie przyciskow
            Debounce Pind.5 , 0 , Programy , Sub
    
    
            Locate 1 , 7                                        'pozycja tekstu na wyswitlaczu
            Lcd Sek ; ":" ; Mint                                'wyswitlanie wartosci zmiennych sek , mint
            Waitms 100                                          'czekanie
          '  Cls
    
    
    
    
    
            Loop
            End
    
            Czas:
    
             Timer1 = Timer1 + 3036                             'co sekunde
    
             Sound Portd.6 , 50 , 500                              ' pikanie przy odliczaniu
             Decr Sek                                           'zmniejszanie ! wartosci zmiennej sek
    
    
             If Sek = 0 Then                                    'jesli sek 0 to idz dalej
             Sek = 60                                           ' i zmnien wartosc na 60
             Decr Mint                                          '  i zwiększ wartość licznika mint
             If Mint = 255 Then
    
    
    
             Toggle Portb.0                                     ' przelacznik rartosci 1 lub 0 dla pinu b0
             Stop Timer1
    
             Mint = 0 : Sek = 0                                 ' i jesli skonczy odliczanie to wyzeruj wartosci zmiennich mint i sek
    
             Lowerline
             Lcd "PIECZATKA Gotowa"
    
             Wait 2
    
             End If : End If                                    ': End If
             Return
    
    
    
    
    
    
    S:
             Cls                                                'etyketka  S
             Sek = 16
             Mint = 0
             P1 = 0
             Sound Portd.6 , 50 , 500
             Locate 2 , 4
             Lcd "PROGRAM 1"
             'Wait 2
             Return
    
    G:
             Cls                                                'etyketka G
             Sek = 25
             Mint = 2
             P2 = 0
             Sound Portd.6 , 50 , 500
             Locate 2 , 4
             Lcd "PROGRAM 2"
             'Wait 2
             Return
    
    
    
    Programy:                                                   'etyketka wybor programu
                                                                 ' wyznaczenie do kturego programu (1 lub 2 ) mamy dodac lub odjac wartosc
    
         Toggle Kto
    
         Toggle Pp
         If Pp = 1 Then
         Locate 1 , 1
         Lcd "2"
         Else
         Locate 1 , 1
         Lcd "1"
         End If
    
    
         Return
    
    
    
    
    Star:
             Start Timer1                                       'etykeita start tajmerka
             Set Portb.0
             Sound Portd.6 , 50 , 500
                   Return
    
    
    Sto:
             Stop Timer1                                        'etyketa stop tajmerka
             Reset Portb.0
             Sound Portd.6 , 50 , 500
    
                   Return
    
    
    Zwieksz:                                                    'etykieta zwikrzajaca wartoc zmiennych prsyciskiem
    
        Sound Portd.6 , 50 , 300
          If Pp = 1 Then
       Incr Sek
          If Sek = 60 Then
          Sek = 0
       Incr Mint
       If Mint = 60 Then
          Mint = 0
    End If : End If : End If
    
    Return
    
    
    
    
     Zmniejsz:
     Sound Portd.6 , 50 , 900                                   'etykieta zmniejszajaca wartoc zmiennych prsyciskiem
     If Pp = 1 Then
     Decr Sek
    If Sek = 0 Then
       Sek = 60
       Decr Mint
       If Mint = 60 Then
          Mint = 0
    
    End If : End If  : End If
    
     Return
    
    
    Przelacznik:                                                'etykieta przelaczanik start stop jednym przyciskiem
    
         Toggle Przezutnik
    
         If Przezutnik = 0 Then
         Gosub Star
         Else
         Gosub Sto
               End If
         Return
    
  • REKLAMA
  • #2 7242415
    sp3ots
    Poziom 38  
    Witam !
    Zauważyłem że w kilku miejscach używasz:
    
    Sound Portd.6 , 50 , 500
    

    Jeśli chcesz skrócić kod to:
    w każdym miejscu zamiast tej linii napisz np.
    
    Gosub dzwiek
    

    Napisz podprogram:
    
    Dzwiek:
    Sound Portd.6 , 50 , 500 
    return
    

    uzyskasz trochę pamięci.
    W sprawie działania programu się nie wypowiadam.
    Pozdrawiam. Stefan
  • #3 7242432
    m.bartczak
    Poziom 16  
    Troszkę ciężko będzie upchnąć znacznie więcej w 2kB w Bascomie, ale spróbujmy:

    a) zrób procedury ze zwieksz i zmniejsz, ten kod jest dość zbliżony.
    b) to samo ze star i sto
    c) wybieranie programu, S i G, spróbuj zrobić bardziej generycznie (też jako procedury)

    W sumie chyba niewiele wiecej można zyskać.

    Rozważ też przejście na czyste C albo na ASM'a, jeśli chcesz wklepać większy program.

    Albo rozważ zmianę uC.
REKLAMA