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

Moj pierwszy program i mały problem [Attiny2313][Bascom]

dreslak 10 Gru 2009 09:35 3879 32
  • #1 7369256
    dreslak
    Poziom 17  
    Witam
    Niedawno postanowiłem że warto nauczyć się czegoś pożytecznego. Niewątpliwie taką rzeczą jest programowanie mikroprocesorów. Poczytałem co nieco tu i tam, szperałem na forum, no i w końcu przyszedł czas na pierwszy własny program. Założenia programu są następujące:
    -Sterowanie 5 diodami oznaczonymi jako K1, K2, K3, K4, K5 pod wpływem impulsu na PB0.
    -po długim naciśnięciu przycisku >lub = 2s układ ma zacząć działać a po krótkim naciśnięciu poniżej 2s mają się zmieniać efekty migania. Po kolejnym naciśnięciu przycisku >lub= 2s układ ma się wyłączyć(czyt. nie ma świecić żadna dioda)

    Napisałem pewien "zarys" programu, bo do w pełni funkcjonalnego i sprawnego to jeszcze daleko, ale podczas kompilacji wyskakują 3 błędy. Nie jestem w stanie ich zlokalizować;/ Być może zbyt zawile i niezrozumiale napisałem program. Będe wdzięczny za wszelkie sugestie i poprawki.

    Oto wynik mojej pracy:
    $regfile = "ATtiny2313.dat"
    $crystal = 16000000                                         'Kwarc w Hz
    
    
    
    Config Timer1 = Timer , Prescale = 1024
    Load Timer1 , 15625
    On Timer1 Sekunda
    
    Config Pinb.0 = Input
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Pinb.6 = Output
    Config Pinb.7 = Output
    Config Portd = Output
    
    Portb = 100000000
    Portd = 00000000
    
    Dim Licznik_1 As Byte                                       'Licznik czasu
    Licznik_1 = 0
    Dim Impuls As Byte                                          'Zmienna Impuls wejsciowy
    Impuls = Portb.0
    Dim Czas As Integer                                         'Zmienna Czas
    Czas = 270
    Dim Efekt As Byte                                           'Zmienna Efekt
    Efekt = 1
    Dim K1 As Bit                                               'Kanał pierwszy
    K1 = Portb.7
    Dim K2 As Bit                                               'Kanał drugi
    K2 = Portb.6
    Dim K3 As Bit                                               'Kanał trzeci
    K3 = Portb.5
    Dim K4 As Bit                                               'Kanał czwarty
    K4 = Portb.4
    Dim K5 As Bit                                               'Kanał piaty
    K5 = Portb.0
    Dim Dioda As Bit
    Dioda = 0
    Dim Licz As Byte                                            'zmienna zliczająca sekundy
    Licz = 0
    
    
    
    Enable Timer1
    Enable Interrupts
    
    
    
    
    
    
    Do
       If Pinb.0 = 0 And Efekt > 1 Then                         'Zmiana efektu
          Efekt = Efekt + 1 And Start Timer1
         End If
    
       If Pinb.0 = 0 And Licz = 1 And Efekt = 1 Then Efekt = 2 And Stop Timer1
         End If
    
       If Pinb.0 = 0 And Licz = 1 And Efekt > 1 Then Efekt = 1 And Stop Timer1
         End If
    
    
    If Efekt = 1 Then                                           'Układ wyłączony
       Portb = 00000000
       Portd = 00000000
    End If
    
    If Efekt = 2 Then                                           'Efekt pierwszy
       Set K1 , K2 , K3 , K4 , K5
    End If
    
    If Efekt = 3 Then
       Set K1 , K2                                              'Efekt drugi
    End If
    
    
    
    
    
    
    
     
    
    Loop
    
    Sekunda:
     Load Timer1 , 15625
     Incr Licznik_1
    
     If Licznik_1 = 2 Then
      Licz = 1
       Licznik_1 = 0
     End If
     Return
  • #2 7369297
    sp3ots
    Poziom 38  
    Witam !
    W tych liniach masz błędy:
    Set K1 , K2 , K3 , K4 , K5
    Set K1 , K2 tak się nie da trzeba rozdzielić
    Set K1
    Set K2
    itp.
    End if na końcu tego warunku jest zbyteczny
    If Pinb.0 = 0 And Licz = 1 And Efekt = 1 Then Efekt = 2 And Stop Timer1
    End If
    ale prócz tego coś nie tak jest w tym warunku !
    Ale to za wysokie progi na moje nogi.
    Pozdrawiam. Stefan amator

    Dodano po 6 [minuty]:

    Pozmieniałem trochę i się kompiluje.
    
    Do
       If Pinb.0 = 0 And Efekt > 1 Then                         'Zmiana efektu
       Efekt = Efekt + 1
       Start Timer1
       End If
    
       If Pinb.0 = 0 And Licz = 1 And Efekt = 1 Then
       Efekt = 2
       Stop Timer1
       End If
    
       If Pinb.0 = 0 And Licz = 1 And Efekt > 1 Then
       Efekt = 1
       Stop Timer1
       End If
    
    
    If Efekt = 1 Then                                           'Układ wyłączony
       Portb = 00000000
       Portd = 00000000
    End If
    
    If Efekt = 2 Then                                           'Efekt pierwszy
       Set K1
       Set K2
       Set K3
       Set K4
       Set K5
    End If
    
    If Efekt = 3 Then
       Set K1
       Set K2       'Efekt drugi
    End If
    [code/]
    Czy będzie działać nie wiem ?
  • #3 7369397
    dreslak
    Poziom 17  
    Wina leży gdzieś tu
     If Pinb.0 = 0 And Efekt > 1 Then                         'Zmiana efektu
          Efekt = Efekt + 1 Start Timer1
         End If
    
       If Pinb.0 = 0 And Licz = 1 And Efekt = 1 Then Efekt = 2 And Stop Timer1
         End If
    
       If Pinb.0 = 0 And Licz = 1 And Efekt > 1 Then Efekt = 1 And Stop Timer1
         End If
    

    wstawiłem twoje warunki program sie kompiluje ale nie działa jak należy. Pewnie źle go sformułowałem. Diody święcą się światłem ciągłym a po podaniu zera na pb0 gasną. pozostają zgaszone tak długo jak dłlugo jest zero na pb0 a nie o to chodzi.
  • #4 7369476
    sp3ots
    Poziom 38  
    Tu masz błędy, chciałeś chyba wpisać binarnie ?
    Portb = 100000000
    Portd = 00000000
    trzeba tak:
    Portb = &B10000000
    Portd = &B00000000
    Na timerach ja się nie znam.
  • #5 7371220
    dreslak
    Poziom 17  
    Nadal program nie działa tak jak bym tego chciał. Musze jeszcze raz prześledzić co i jak.
  • #6 7372675
    grysek
    Poziom 19  
    Po pierwsze:
    Dim K1 As Bit                                               'Kanał pierwszy 
    K1 = Portb.7 
    Dim K2 As Bit                                               'Kanał drugi 
    K2 = Portb.6 
    Dim K3 As Bit                                               'Kanał trzeci 
    K3 = Portb.5 
    Dim K4 As Bit                                               'Kanał czwarty 
    K4 = Portb.4 
    Dim K5 As Bit                                               'Kanał piaty 
    K5 = Portb.0 
    Dim Dioda As Bit 
    Dioda = 0 
    


    coś takiego raczej nie przejdzie. Na samym początku tworzysz zmienne, potem wpisujesz do nich zawartość bitów portu B co nie ma zadnego sensu. A polecenia SET K1.. itd w dalszej części programu w rzeczywistości ustawiają te zmienne a nie piny portu. Jeśli chcesz przypisać nowe nazwy dla pinów to używaj polecenia alias np. K1 alias portb.7

    Po drugie:
    Jeśli konfigurujesz dany pin jako wyjście to powinieneś pisać:
    Config portb.7 = output
    Jeśli jako wyjście to:
    Config pinb.7 = output

    Po trzecie żeby timer zaczął zliczać to należy użyć polecenia Start Timer1

    P.S Masz podłączony zewnętrzny rezonator? Zmieniałeś fusebity?
    pozdrawiam :D
  • #7 7372902
    xury
    Specjalista automatyka domowa
    Z tym "po drugie" to trochę się zdublowało, a poprawna składnia to:
    Config pinb.7 = output

    Chociaż kompilator Bascom "lyka" też nieporawną konstrukcję:
    Confg portb.7 = Output
    A w helpie mamy:
    CONFIG PORTx = state - dla całego portu

    CONFIG PINx.y = state - dla poszczególnych pinów

    Z tym po trzecie to zupełnie nieprawda, bo timer zlicza od chwili kiedy zostanie aktywowany wraz z całym systemem przerwań.
     Enable Timer1
    Enable Interrupts

    A Start timer1 używamy kiedy go przedtem zatrzymaliśmy.
  • #8 7372953
    grysek
    Poziom 19  
    xury napisał:

    Z tym po trzecie to zupełnie nieprawda, bo timer zlicza od chwili kiedy zostanie aktywowany wraz z całym systemem przerwań.
     Enable Timer1
    Enable Interrupts

    A Start timer1 używamy kiedy go przedtem zatrzymaliśmy.


    Czy aby napewno? Zapraszam do datasheetu i helpu. Polecenie Enable Timer1 włącza zgłaszanie przerwań od Tmiera czyli ustawia bit TOIE1 w rejestrze TIMSK. Natomiast polecenie Enable interrupts włącza obsługę przerwań w mikrokontrolerze, poprzez ustawienie wskaźnika I w rejestrze SREG. Zadne z tych polecen nie uruchamia Timera1 do pracy
  • #10 7376157
    dreslak
    Poziom 17  
    Witam
    Przepraszam za moją nieobecność. Odpowiadając na wasze pytania:
    grysek napisał:
    Masz podłączony zewnętrzny rezonator? Zmieniałeś fusebity?

    Tak mam zewnętrzny rezonator 16MHz. Fuse przestawiałem, lecz nie wiem czy są poprawne. W każdym bądź razie poprzedni"program" który migał diodami działał poprawnie na tych ustawieniach i z tym rezonatorem.

    xury napisał:
    Z tym "po drugie" to trochę się zdublowało, a poprawna składnia to:
    Kod:
    Config pinb.7 = output


    xury napisał:
    Chociaż kompilator Bascom "lyka" też nieporawną konstrukcję:
    Confg portb.7 = Output
    A w helpie mamy:
    CONFIG PORTx = state - dla całego portu

    CONFIG PINx.y = state - dla poszczególnych pinów

    Być może coś przeoczyłem ale chyba to jest poprawne akurat.


    A co do Timera1 t ozauważcie że ma on wystartować w określonych warunkach jakimi są
    If Pinb.0 = 0 And Efekt > 1 Then                         'Zmiana efektu
          Efekt = Efekt + 1 And Start Timer1
         End If 


    Jednak nadal nie uzyskałem odpowiedzi na trapiące mnie pytania:

    1. Czy dobrze sformułowane są warunki ?
    2. Czy w moim programie Timer1 ma prawo zadziałać ?



    oto poprawiony według wskazówek kod
    $regfile = "ATtiny2313.dat"
    $crystal = 16000000                                         'Kwarc w Hz
    
    
    
    Config Timer1 = Timer , Prescale = 1024
    Load Timer1 , 15625
    On Timer1 Sekunda
    
    Config Pinb.0 = Input
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Pinb.6 = Output
    Config Pinb.7 = Output
    Config Portd = Output
    
    Portb = 10000000
    Portd = 00000000
    
    Dim Licznik_1 As Byte                                       'Licznik czasu
    Dim Impuls As Byte                                          'Zmienna Impuls wejsciowy
    Dim Czas As Integer                                         'Zmienna Czas
    Dim Efekt As Byte                                           'Zmienna Efekt
    Dim K1 As Bit                                               'Kanał pierwszy
    Dim K2 As Bit                                               'Kanał drugi
    Dim K3 As Bit                                               'Kanał trzeci
    Dim K4 As Bit                                               'Kanał czwarty
    Dim K5 As Bit                                               'Kanał piaty
    Dim Dioda As Bit
    Dim Licz As Byte                                            'zmienna zliczająca sekundy
    
    
    
    
    
    
    Licz = 0
    Efekt = 1
    Czas = 270
    Licznik_1 = 0
    Dioda = 0
    Impuls Alias Portb.0
    K1 Alias Portb.7
    K2 Alias Portb.6
    K3 Alias Portb.5
    K4 Alias Portb.4
    K5 Alias Portb.0
    
    
    
    Enable Timer1
    Enable Interrupts
    
    
    
    
    
    
    Do
    If Pinb.0 = 0 And Efekt > 1 Then                            'Zmiana efektu
    Efekt = Efekt + 1
    Start Timer1
    End If
    
    If Pinb.0 = 0 And Licz = 1 And Efekt = 1 Then
    Efekt = 2
    Stop Timer1
    End If
    
    If Pinb.0 = 0 And Licz = 1 And Efekt > 1 Then
    Efekt = 1
    Stop Timer1
    End If
    
    If Efekt = 1 Then                                           'Układ wyłączony
       Portb = 00000000
       Portd = 00000000
    End If
    
    If Efekt = 2 Then                                           'Efekt pierwszy
       Set K1
       Set K2
       Set K3
       Set K4
       Set K5
    End If
    
    If Efekt = 3 Then
       Set K1
       Set K2                                                   'Efekt drugi
    End If
    
    
    Loop
    
    Sekunda:
     Load Timer1 , 15625
     Incr Licznik_1
    
     If Licznik_1 = 2 Then
      Licz = 1
       Licznik_1 = 0
     End If
     Return
  • #12 7376490
    grysek
    Poziom 19  
    1. W warunkach w których masz Stop Timer to zaraz po stopwaniau Tmiera powinieneś jeszcze zerować zmienną licz, ponieważ po pierwszym wywołaniu licz bedzie zawsze ustawione na 1.

    2. Tak, timer ma prawo działać z tym że jeśli chcesz odliczyć dwie sekundy do do Timera powinieneś wpisac wartość 65536 - 15625 = 49911, ponieważ Tmier zgłasza przerwanie po przepełnieniu

    A tak to jeśli definiujesz nazwy w poleceniu alias to nie musisz ich deklarować jako zmienne tak więc wyrzuć:
    Dim K1 As Bit                                               'Kanał pierwszy 
    Dim K2 As Bit                                               'Kanał drugi 
    Dim K3 As Bit                                               'Kanał trzeci 
    Dim K4 As Bit                                               'Kanał czwarty 
    Dim K5 As Bit     


    oraz
    Dim Impuls As Byte


    oprocz tego to błędy w składni
    Portb = 00000000 
       Portd = 00000000

    ma wyglądać tak:
    Portb = &b00000000 
       Portd = &b00000000

    a wogóle to najlepiej napisac portd = 0.
  • #13 7377293
    Konto nie istnieje
    Poziom 1  
  • #14 7378198
    dreslak
    Poziom 17  
    Poprawiłem timer. Usunąłem deklaracje zmiennych dla K1-K5. Ale nadal problem leży w warunkach, bynajmniej tak wskazuje kompilator BASCOM a. Wskazuje również że wszystkie 3 błędy leżą w 61 linii kodu. Jak bym nie liczył nie mogę dopatrzyć się tych błędów.

    Poprawiony kod:
    $regfile = "ATtiny2313.dat"
    $crystal = 16000000                                         'Kwarc w Hz
    
    
    
    Config Timer1 = Timer , Prescale = 1024
    Load Timer1 , 49911
    On Timer1 Sekunda
    
    Config Pinb.0 = Input
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Pinb.6 = Output
    Config Pinb.7 = Output
    Config Portd = Output
    
    Portb = &B10000000
    Portd = &B00000000
    
    Dim Licznik_1 As Byte                                       'Licznik czasu
    Dim Impuls As Byte                                          'Zmienna Impuls wejsciowy
    Dim Czas As Integer                                         'Zmienna Czas
    Dim Efekt As Byte                                           'Zmienna Efekt
    Dim Dioda As Bit
    Dim Licz As Byte                                            'zmienna zliczająca sekundy
    
    
    
    
    
    
    Licz = 0
    Efekt = 1
    Czas = 270
    Licznik_1 = 0
    Dioda = 0
    I1 Alias Pinb.0
    K1 Alias Portb.7
    K2 Alias Portb.6
    K3 Alias Portb.5
    K4 Alias Portb.4
    K5 Alias Portb.0
    
    
    
    Enable Timer1
    Enable Interrupts
    
    
    
    
    
    
    Do
    
       If I1 = 0 Then Start Timer1                              'Start Timera
    
    End If
    
       If I1 = 0 And Efekt > 1 Then                             'Zmiana efektu
       Efekt = Efekt + 1
    
       Stop Timer1
       Reset Licz
    
    End If
    
       If I1 And Licz = 1 And Efekt = 1 Then
       Efekt = 2 And
    
       Stop Timer1
       Reset Licz
    
    End If
    
       If I1 = 0 And Licz = 1 And Efekt > 1 Then
       Efekt = 1
    
       Stop Timer1
       Reset Licz
    
    End If
    
    If Efekt = 1 Then                                           'Układ wyłączony
       Portb = &B00000000
       Portd = &B00000000
    End If
    
    If Efekt = 2 Then                                           'Efekt pierwszy
       Set K1
       Set K2
       Set K3
       Set K4
       Set K5
    End If
    
    If Efekt = 3 Then
       Set K1
       Set K2                                                   'Efekt drugi
    End If
    
    
    Loop
    
    Sekunda:
     Load Timer1 , 49911
     Incr Licznik_1
    
     If Licznik_1 = 2 Then
      Licz = 1
       Licznik_1 = 0
     End If
     Return


    Moją uwagę zwrócił jeszcze Timer. W konfiguracji jest
    On Timer1 Sekunda

    Jest to tylko odwołanie do tego co jest na samym dole ? Bo muszę się przyznać że już się sam zgubiłem. Czy przypadkiem własnie w tym momencie uruchamia się timer czego bym nie chciał. Timer ma sie włączać równocześnie ze stanem niskim na I1 tj. PINB.0
  • #15 7378418
    xury
    Specjalista automatyka domowa
    emarcus napisał:
    xury napisał:
    Początkową wartość Timera1 liczymy:
    Częstotliwość / preskaler i wynik odejmujemy od 65536 (bo timer1 liczy do tylu) czyli
    16000000 / 1024 daje 15625
    65536 - 15625 = 49911
    I tą wartość ładujemy do timera1


    A gdzie ty to wynalazles ze Timer1 "liczy do tylu" ?
    e marcus

    Tam nie jest napisane "do tyłu" tylko "do tylu" czyli do 65536.
    A swoją drogą dokładniejszy wynik daje:
    Countner1 = Countner1 + 49911

    Bo dodaje to co już Timer zliczył, ale nie chciało mi się pisać więcej.

    Co do "On Timer1 Sekunda" to nie znaczy, że go uruchamiasz w tym miejscu. Jest to jedynie deklaracja,co ma być wykonane po przepełnieniu.
    I jeszcze ten fragment:
    If I1 And Licz = 1 And Efekt = 1 Then 
       Efekt = 2 And
    

    Powinno być tak:
    If I1 = 1 and Licz = 1 and efekt = 1 Then Efekt = 2

    A w związku,że Bascom ma czasem jakieś odchyły to proponowałbym tak:

    If I1 = 1 Then
       If Licz = 1 Then
          If Efekt = 1 then
             Efekt = 2
          end if
       end if
    end if
    

    Piszę, bo z doświadczenia wiem, że instrukcje warunkowe z więcej niż jednym operatorem AND lub OR w ciele instrukcji If Bascom może zainterpretować jako operacje na bitach.

    A i jeszcze jedno proponowałbym jednak dać Stop Timer1 przed pętlą główną, bo ja jednak nadal twierdzę, że Timer startuje sam.
    Po zatrzymaniu określić jego wartość.
  • #16 7378797
    dreslak
    Poziom 17  
    Robię tak jak mi sugerujecie ale z tymi warunkami jest coś nie halo.
    Nadal sie nie kompiluje.
    
       If I1 = 0 Then Start Timer1                              'Start Timera
    
    End If
    
       If I1 = 0 Then
          If Efekt > 1 Then                                     'Zmiana efektu
              Efekt = Efekt + 1
          End If
    
       Stop Timer1
       Reset Licz
       End If
    
    End If                                                      'Włączanie układu
    
       If I1 = 0 Then
          If Licz >= 1 Then
             If Efekt = 1 Then
                Efekt = 2
              End If
          End If
       Stop Timer1
       Reset Licz
       End If
    
    End If                                                      'Wyłączanie układu
    
       If I1 = 0 Then
          If Licz >= 1 Then
             If Efekt > 1 Then
                Efekt = 1
             End If
          End If
    
       Stop Timer1
       Reset Licz
       End If


    może trzeba to zrobić w jakiś inny sposób ? Nie da się jakoś ominąć takiej składni warunków ?
    A może problem jest w tym
       Stop Timer1
       Reset Licz
    i nie może ono być ot tak wstawione do warunku
  • #18 7382890
    dreslak
    Poziom 17  
     If I1 = 0 Then Start Timer1                              'Start Timera
    
       End If
    
       If I1 = 0 Then
          If Efekt > 1 Then                                     'Zmiana efektu
              Efekt = Efekt + 1
          End If
    
       Stop Timer1
       Reset Licz
       End If
    
                                                                'Włączanie układu
    
       If I1 = 0 Then
          If Licz >= 1 Then
             If Efekt = 1 Then
                Efekt = 2
              End If
          End If
       Stop Timer1
       Reset Licz
       End If
    
                                                                'Wyłączanie układu
    
       If I1 = 0 Then
          If Licz >= 1 Then
             If Efekt > 1 Then
                Efekt = 1
             End If
          End If
    
       Stop Timer1
       Reset Licz
       End If
    

    znowu sypią błędy. Chciałem to jakoś ominąć i uprościć te warunki, wiec stworzyłem takie coś:
     If
          I1 = 0 Then Start Timer1                              'Start Timera
    
       End If
    
       If
          I1 = 0 And Licz >= 1 Then Switch = 1
    
       End If
    
       If I1 = 0 Then
          If Efekt > 1 Then                                     'Zmiana efektu
              Call Zmien
          End If
       End If
    
                                                                'Włączanie układu
    
       If Switch = 1 Than
           If Efekt = 1 Then
               Call Wlacz
           End If
       End If
    
    
                                                                'Wyłączanie układu
    
       If Switch = 1 Then
           If Efekt > 1 Then
               Call Wylacz
           End If
       End If

    ale dalej tylko ta część sypie błędami. Może ktoś spróbuje to skompilować u siebie to będzie mu łatwiej zlokalizować błędy.
  • #19 7383072
    sp3ots
    Poziom 38  
    Witam !
    Kod pierwszy:
    Druga linia end if skasuj
    Kod drugi:
    linia 1, 3, 4, 6 if end if skasuj

    Powodzenia. Stefan
  • #20 7383217
    dreslak
    Poziom 17  
    Dzięki sp3ots Kod pierwszy już jest ok

    natomiast drugi zmieniłem tak:
     If I1 = 0 Then
              Start Timer1
         End If
                                      'Start Timera
    
    
    
    
         If I1 = 0 Then
             If Licz >= 1 Then
                 Switch = 1
             End If
         End If
    
    
    
       If I1 = 0 Then
          If Efekt > 1 Then                                     'Zmiana efektu
              Call Zmien
          End If
       End If
    
                                                                'Włączanie układu
    
       If Switch = 1 Then
           If Efekt = 1 Then
               Call Wlacz
           End If
       End If
    
    
                                                                'Wyłączanie układu
    
       If Switch = 1 Then
           If Efekt > 1 Then
               Call Wylacz
           End If
       End If
    


    teraz muszę tylko sprawdzić czy będzie działała tak jak bym tego chciał

    Dodano po 3 [godziny] 28 [minuty]:

    Najgorszy moment dla konstruktora.. Niestety układ nie działa jak powinien.
    Po podaniu "0" na I1 nic sie nie dzieje. Wszystkie diody są cały c zas wygaszone. Gdzie może tkwić przyczyna? Może wina Fuse bitów ?
    Oto cały kod:
    $regfile = "ATtiny2313.dat"
    $crystal = 16000000                                         'Kwarc w Hz
    
    
    
    Config Timer1 = Timer , Prescale = 1024                     'Kofiguracja Timera
    Stop Timer1                                                 'Zatrzymanie Timera
    Load Timer1 , 49911                                         'Załadowanie Timera
    On Timer1 Gosub Sekunda                                     'Instrukcja po przepelnieniu
    
    Config Pinb.0 = Input
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Pinb.6 = Output
    Config Pinb.7 = Output
    Config Portd = Output
    
    Portb = &B00000000
    Portd = &B00000000
    
    Dim Licznik_1 As Byte                                       'Licznik czasu
    Dim Impuls As Byte                                          'Zmienna Impuls wejsciowy
    Dim Czas As Integer                                         'Zmienna Czas
    Dim Efekt As Byte                                           'Zmienna Efekt
    Dim Licz As Byte                                            'zmienna zliczająca sekundy
    Dim Dioda As Bit                                            'Dioda
    Dim Switch As Bit                                           'Zmienna pomocnicza Switch
    Licznik_1 = 0
    
    Czas = 270
    Efekt = 1
    Licz = 0
    Dioda = 0
    Switch = 0
    
    
    
    
    I1 Alias Pinb.0
    K1 Alias Portb.7
    K2 Alias Portb.6
    K3 Alias Portb.5
    K4 Alias Portb.4
    K5 Alias Portb.0
    
    
    Enable Interrupts                                           'Odblokowanie Przerwan
    Enable Timer1                                               'Odblokowanie Timera
    
    Declare Sub Wlacz
    Declare Sub Wylacz
    Declare Sub Zmien
    
    
    
    
    
    
    
    Do
    
    
    
         If I1 = 0 Then                                         'start Timera
              Start Timer1
         End If
    
    
    
    
    
         If I1 = 0 Then                                         'Warunek dla zmiennej Switch
             If Licz >= 1 Then
                 Switch = 1
             End If
         End If
    
    
    
    
                                                                 'Zmiana efektu
       If I1 = 0 Then
          If Efekt > 1 Then
              Call Zmien
          End If
       End If
    
    
       If Efekt = 5 Then Efekt = 2                              'Zapetlenie efektow
    
    
       If Switch = 1 Then                                       'Włączanie układu
           If Efekt = 1 Then
               Call Wlacz
           End If
       End If
    
    
                                                                'Wyłączanie układu
    
       If Switch = 1 Then
           If Efekt > 1 Then
               Call Wylacz
           End If
       End If
    
    
    
    
    If Efekt = 1 Then                                           'Układ wyłączony
       Portb = &B00000000
       Portd = &B00000000
    End If
    
    If Efekt = 2 Then                                           'Efekt pierwszy
      K1 = 1
      K2 = 1
      K3 = 1
      K4 = 1
      K5 = 1
    End If
    
    If Efekt = 3 Then                                           'Efekt drugi
      K1 = 1
      K2 = 1
      K3 = 1
      K4 = 0
      K5 = 0
    End If
                                                                'Efekt rzeci
    If Efekt = 4 Then
      K1 = 0
      K2 = 1
      K3 = 1
      K4 = 1
      K5 = 0
    End If
    
    
    Loop
    
    Sekunda:                                                    'Definicja Sekundy
     Load Timer1 , 49911
     Incr Licznik_1
    
     If Licznik_1 = 2 Then
      Licz = 1
       Licznik_1 = 0
     End If
     Return
    
    
    Sub Wlacz                                                   'Odwołanie Wlacz
    
       Stop Timer1
       Licz = 0
       Efekt = 2
       Dioda = 1
    
    End Sub
    
    
    
    
    
    Sub Wylacz                                                  'Odewolanie Wylacz
    
       Stop Timer1
       Licz = 0
       Efekt = 1
       Dioda = 0
    
    End Sub
    
    
    
    
    
    Sub Zmien                                                   'Odwolanie Zmien
    
       Stop Timer1
       Licz = 0
       Efekt = Efekt + 1
       Dioda = 1
    
    End Sub
  • #21 7387030
    xury
    Specjalista automatyka domowa
    Z tego co widzę to masz cały czas 0 na pinb.0
    "Portb = &B00000000" - masz 0 na całym porcie
    Podciągnij pinb.0 "set pinb.0"
    I1 i K5 to ten sam pinb.0. Nie wiem tylko czemu raz robisz alias jako "pin" a drugi jako "port". Skoro to jest wejście to odczytujesz stan przez "pinb.0" ,a ustawiasz przez "portb.0"
    Nie mam też pojęcia "co robi" cały portd ? oprócz tego ,że ma ustawione 0.
    If Efekt = 1 Then 'Układ wyłączony
    Portb = &B00000000
    Portd = &B00000000
    End If
    W dodatku przy okazji ustawienia całego portu B na 0 dajesz stan niski na wejście pb.0
    Masz przecież symulator w Bascomie, to popatrz co się dzieje.
  • #22 7387694
    grysek
    Poziom 19  
    Ogólnie cały algorytm powinien wyglądać tak:

    uC uruchamia się i czeka na 2s przytrzymanie przycisku jeśli zostanie puszczony wcześniej to wraca do początku, jeśli przytrzymano 2s to uruchamia podprogram włącz -> następnie wykonuje skok do pętli głównej gdzie oczekuje na wciśnięcie przycisku -> jeśli wciśnięto przycisk wtedy uruchamiamy Timer1 i czekamy na puszczenie i jeśli puszczono wcześniej niż po upływie dwóch sekund to skocz do podprogramu zmień, natomiast jeśli Timer1 zliczył wcześniej to wyłącz Timer i skocz do podprogramu wyłącz a po wykonaniu tego podprogramu wracamy na początek programu.
  • #23 7389118
    dreslak
    Poziom 17  
    Symulator zatrzymuje się zawsze na 9 wierszu w którym jest
    On Timer1 Gosub Sekunda  

    Być może wersja demo ma jakieś ograniczenia.
    Kompletny kod po zmianach to
    $regfile = "ATtiny2313.dat"
    $crystal = 16000000                                         'Kwarc w Hz
    
    
    
    Config Timer1 = Timer , Prescale = 1024                     'Kofiguracja Timera
    Stop Timer1                                                 'Zatrzymanie Timera
    Load Timer1 , 49911                                         'Załadowanie Timera
    On Timer1 Gosub Sekunda                                     'Instrukcja po przepelnieniu
    
    Config Pinb.0 = Input
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Pinb.6 = Output
    Config Pinb.7 = Output
    Config Portd = Output
    
    Portb = &B00000000
    Portd = &B00000000
    
    Dim Licznik_1 As Byte                                       'Licznik czasu
    Dim Impuls As Byte                                          'Zmienna Impuls wejsciowy
    Dim Czas As Integer                                         'Zmienna Czas
    Dim Efekt As Byte                                           'Zmienna Efekt
    Dim Licz As Byte                                            'zmienna zliczająca sekundy
    Dim Switch As Bit                                           'Zmienna pomocnicza Switch
    Licznik_1 = 0
    
    Czas = 270
    Efekt = 1
    Licz = 0
    Switch = 0
    
    
    K1 Alias Portb.7
    K2 Alias Portb.6
    K3 Alias Portb.5
    K4 Alias Portb.4
    K5 Alias Portb.3
    Dioda Alias Portb.2
    I1 Alias Pinb.0
    
    Set I1
    Reset Dioda
    
    
    
    Enable Interrupts                                           'Odblokowanie Przerwan
    Enable Timer1                                               'Odblokowanie Timera
    
    Declare Sub Wlacz
    Declare Sub Wylacz
    Declare Sub Zmien
    
    
    
    
    
    
    
    Do
    
    
    
         If I1 = 0 Then                                         'start Timera
              Start Timer1
         End If
    
    
    
    
    
         If I1 = 0 Then                                         'Warunek dla zmiennej Switch
             If Licz >= 1 Then
                 Switch = 1
             End If
         End If
    
    
    
    
                                                                 'Zmiana efektu
       If I1 = 0 Then
          If Efekt > 1 Then
              Call Zmien
          End If
       End If
    
    
       If Efekt = 5 Then Efekt = 2                              'Zapetlenie efektow
    
    
       If Switch = 1 Then                                       'Włączanie układu
           If Efekt = 1 Then
               Call Wlacz
           End If
       End If
    
    
                                                                'Wyłączanie układu
    
       If Switch = 1 Then
           If Efekt > 1 Then
               Call Wylacz
           End If
       End If
    
    
    
    
    If Efekt = 1 Then                                           'Układ wyłączony
      K1 = 0
      K2 = 0
      K3 = 0
      K4 = 0
      K5 = 0
    End If
    
    If Efekt = 2 Then                                           'Efekt pierwszy
      K1 = 1
      K2 = 1
      K3 = 1
      K4 = 1
      K5 = 1
    End If
    
    If Efekt = 3 Then                                           'Efekt drugi
      K1 = 1
      K2 = 1
      K3 = 1
      K4 = 0
      K5 = 0
    End If
                                                                'Efekt rzeci
    If Efekt = 4 Then
      K1 = 0
      K2 = 1
      K3 = 1
      K4 = 1
      K5 = 0
    End If
    
    
    Loop
    
    Sekunda:                                                    'Definicja Sekundy
     Load Timer1 , 49911
     Incr Licznik_1
    
     If Licznik_1 = 2 Then
      Licz = 1
       Licznik_1 = 0
     End If
     Return
    
    
    Sub Wlacz                                                   'Odwołanie Wlacz
    
       Stop Timer1
       Licz = 0
       Efekt = 2
       Dioda = 1
    
    End Sub
    
    
    
    
    
    Sub Wylacz                                                  'Odewolanie Wylacz
    
       Stop Timer1
       Licz = 0
       Efekt = 1
       Dioda = 0
    
    End Sub
    
    
    
    
    
    Sub Zmien                                                   'Odwolanie Zmien
    
       Stop Timer1
       Licz = 0
       Efekt = Efekt + 1
       Dioda = 1
    
    End Sub

    Musze jeszcze dużo poczytać literatury bo nauka w praktyce słabo mi idzie;/ Program nadal nie działa jak powienien
  • #25 7389951
    dreslak
    Poziom 17  
    Kombinuje już ze 3 godziny i nadal nie działa tzn:
    Jeżeli wgram program z Efekt=2 to po podłączeniu zasilania Diody świecą sie jak przy efekcie 2. Można zmieniać efekty przyciskiem, lecz jego przytrzymanie powoduje ciągłe zmienianie efektów a nie wyłączenie układu.

    Gdy wgram program z Efekt=1 wtedy po naciśnięciu i przytrzymaniu zapala się dioda informacyjna o działaniu układu ale efekt się nie zmienia choć jest w programie zaraz po Diodzie:
    Sub Wlacz                                                   'Odwołanie Wlacz
    
       Stop Timer1
       Licz = 0
       Efekt = 2
       Dioda = 1
       Return
    
    End Sub


    W Timerze chyba źle ustawiony prescaler albo coś schrzaniłem w fuse bitach, ponieważ na zapalenie powyższej diody trzeba czekać "około 6s"
    Oto screeen fuse bitów:
    Moj pierwszy program i mały problem [Attiny2313][Bascom]

    Oto cały kod
    $regfile = "ATtiny2313.dat"
    $crystal = 16000000                                         'Kwarc w Hz
    
    
    
    Config Timer1 = Timer , Prescale = 1024                     'Kofiguracja Timera
    Stop Timer1                                                 'Zatrzymanie Timera
    Load Timer1 , 49911                                         'Załadowanie Timera
    On Timer1 Sekunda                                           'Instrukcja po przepelnieniu
    
    Config Pinb.0 = Input
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Pinb.6 = Output
    Config Pinb.7 = Output
    Config Portd = Output
    
    Portb = &B00000000
    Portd = &B00000000
    
    Dim Licznik_1 As Byte                                       'Licznik czasu
    Dim Czas As Integer                                         'Zmienna Czas
    Dim Efekt As Byte                                           'Zmienna Efekt
    Dim Licz As Byte                                            'zmienna zliczająca sekundy
    Dim Switch As Bit                                           'Zmienna pomocnicza Switch
    
    
    Licznik_1 = 0
    Czas = 270
    Efekt = 1
    Licz = 0
    Switch = 0
    
    
    K1 Alias Portb.7
    K2 Alias Portb.6
    K3 Alias Portb.5
    K4 Alias Portb.4
    K5 Alias Portb.3
    Dioda Alias Portb.2
    I1 Alias Pinb.0
    
    Set I1
    Reset Dioda
    
    
    
    Enable Interrupts                                           'Odblokowanie Przerwan
    Enable Timer1                                               'Odblokowanie Timera
    
    Declare Sub Wlacz
    Declare Sub Wylacz
    Declare Sub Zmien
    
    
    
    
    
    
    
    Do
    
    
    
         If I1 = 0 Then                                         'start Timera
              Start Timer1
         End If
    
    
    
    
    
         If I1 = 0 Then                                         'Warunek dla zmiennej Switch
             If Licz >= 1 Then
                 Switch = 1
             End If
         End If
    
    
    
    
                                                                 'Zmiana efektu
       If I1 = 0 Then
          If Efekt > 1 Then
              Call Zmien
          End If
       End If
    
    
       If Efekt = 5 Then Efekt = 2                              'Zapetlenie efektow
    
    
       If Switch = 1 Then                                       'Włączanie układu
           If Efekt = 1 Then
               Call Wlacz
           End If
       End If
    
    
                                                                'Wyłączanie układu
    
       If Switch = 1 Then
           If Efekt > 1 Then
               Call Wylacz
           End If
       End If
    
    
    
    
    If Efekt = 1 Then                                           'Układ wyłączony
      K1 = 0
      K2 = 0
      K3 = 0
      K4 = 0
      K5 = 0
    End If
    
    If Efekt = 2 Then                                           'Efekt pierwszy
      K1 = 1
      K2 = 1
      K3 = 1
      K4 = 1
      K5 = 1
    End If
    
    If Efekt = 3 Then                                           'Efekt drugi
      K1 = 1
      K2 = 1
      K3 = 1
      K4 = 0
      K5 = 0
    End If
                                                                'Efekt rzeci
    If Efekt = 4 Then
      K1 = 0
      K2 = 1
      K3 = 1
      K4 = 1
      K5 = 0
    End If
    
    
    Loop
    
    Sekunda:                                                    'Definicja Sekundy
     Load Timer1 , 49911
     Incr Licznik_1
    
     If Licznik_1 = 2 Then
      Licz = 1
       Licznik_1 = 0
     End If
     Return
    
    
    Sub Wlacz                                                   'Odwołanie Wlacz
    
       Stop Timer1
       Licz = 0
       Efekt = 2
       Dioda = 1
       Return
    
    End Sub
    
    
    
    
    
    Sub Wylacz                                                  'Odewolanie Wylacz
    
       Stop Timer1
       Licz = 0
       Efekt = 1
       Dioda = 0
    
    
    End Sub
    
    
    
    
    
    Sub Zmien                                                   'Odwolanie Zmien
    
       Stop Timer1
       Licz = 0
       Efekt = Efekt + 1
       Dioda = 1
       Waitms 250
       Dioda = 0
       Waitms 250
       Dioda = 1
       Waitms 250
       Dioda = 0
       Waitms 250
       Dioda = 1
       Waitms 500
    
    
    End Sub
  • #26 7393001
    xury
    Specjalista automatyka domowa
    Ja tam nie widzę w kodzie by coś ten Timer1 robił oprócz liczenia do 2.
    I też wyłączyć się nie ma prawa, bo warunek do wyłączania jest taki sam jak do zmiany efektu. A jeśli nawet się wyłączy to za kilka mikrosekund się włączy po przejściu przez pętlę.
    Przydałoby się też jakieś zabezpieczenie przed drganiami przycisku.
    Zmienna Czas też nie wiem do czego ?
    Zmienna Licz nie może osiągnąć więcej niż 1 w tym kodzie.
    Zmienna Licznik_1 jak pisałem wyżej oprócz liczenia do 2 to nic nie wpływa na program główny.
    Działania zmiennej Switch nie rozumiem.
  • #27 7393121
    grysek
    Poziom 19  
    Radzę program napisać od nowa kierując się wskazówkami z mojego poprzedniego postu. Nie bardzo ma sens ten program. Niech inspiracją dla Ciebie bedzie ten fragment:

    
    Poczatek:
    Do
    If I0 = 0 Then
      Start Timer
      Set Timer_zlicza
      Do
       If Timer_zlicza = 0 Then
        Call Wlacz
        Goto Glowna_petla
       End If
       If I0 = 1 Then
        Reset Timer_zlicza
        Stop Timer
        Exit Do
       End If
      Loop
    End If
    Loop
    
    Glowna_petla:
    Do
    If I0 = 0 Then
      Start Timer
      Set Timer_zlicza
      Do
       If Timer_zlicza = 0 Then                                 'jeżeli timer skonczył liczyc
        Call Wylacz
        Goto Poczatek
       End If                                                   'jezeli wczesniej puszczono to wyjdz
       If I0 = 1 Then
        Reset Timer_zlicza
        Stop Timer
        Call Zmien
        Exit Do
       End If
      Loop
    End If
    Loop
    
    Sub Wlacz
    'bla bla bla
    End Sub
    
    Sub Wylacz
    'bla bla bla
    End Sub
    
    Sub Zmien
    'bla bla bla
    End Sub
    
    Sekunda:
    'ladowanie timera
    'zwiekszenie zmiennej okreslającej liczbę sekund
    'jeżeli liczba sekund = 2 to resetuj flage Timer_zlicza
    return


    Program pisałem w pośpiechu więc mogą być błędy. Chodzi o to abyś zrozumiał zasadę działania
  • #28 7403445
    dreslak
    Poziom 17  
    Przepraszam za moją nieobecność ale jestem zajęty. Jutro postaram się zająć na nowo tym programem wg wskazówek Gryska. Napisze o efektach.

    Pozdrawiam
  • #29 7406275
    dreslak
    Poziom 17  
    Grysek Wielkie dzięki za "rdzeń" programu. Dopisałem resztę teraz wygląda to tak:
    $regfile = "ATtiny2313.dat"
    $crystal = 16000000                                         'Kwarc w Hz
    
    
    Config Timer1 = Timer , Prescale = 1024                     'Kofiguracja Timera
    Stop Timer1                                                 'Zatrzymanie Timera
    Load Timer1 , 49911                                         'Załadowanie Timera
    On Timer1  Sekunda                                     'Instrukcja po przepelnieniu
    
    Config Pinb.0 = Input
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Pinb.6 = Output
    Config Pinb.7 = Output
    
    
    Dim Efekt As Byte                                           'Zmienna Efekt
    Dim Licz As Byte                                            'zmienna zliczająca sekundy
    Dim Timer_zlicza As Bit                                     'Flaga Timera
    Efekt = 1
    Licz = 0
    Timer_zlicza = 1
    
    K1 Alias Portb.7
    K2 Alias Portb.6
    K3 Alias Portb.5
    K4 Alias Portb.4
    K5 Alias Portb.3
    Dioda Alias Portb.2
    I1 Alias Pinb.0
    Reset K1
    Reset K2
    Reset K3
    Reset K4
    Reset K5
    Reset Dioda
    Set I1
    
    Enable Interrupts                                           'Odblokowanie Przerwan
    Enable Timer1                                               'Odblokowanie Timera
    
    Declare Sub Wlacz
    Declare Sub Wylacz
    Declare Sub Zmien
    
    
    
    
    Poczatek:                                                   'Petla Poczatkowa
    Do
    
    If I1 = 0 Then
      Start Timer1
      Set Timer_zlicza
      Do
    
        If Timer_zlicza = 0 Then
         Call Wlacz
         Goto Glowna_petla
        End If
    
        If I1 = 1 Then
         Reset Timer_zlicza
         Stop Timer1
         Exit Do
        End If
    
      Loop
    End If
    
    Loop
    
    Glowna_petla:                                               'Glowna Petla
    Do
    
    If I1 = 0 Then
      Start Timer1
      Set Timer_zlicza
      Do
    
       If Timer_zlicza = 0 Then                                 'jeżeli timer skonczył liczyc
        Call Wylacz
        Goto Poczatek
       End If                                                   'jezeli wczesniej puszczono to wyjdz
    
       If I1 = 1 Then
        Reset Timer_zlicza
        Stop Timer1
        Call Zmien
        Exit Do
       End If
    
      Loop
    End If
    
    Loop
    
    Petla_efekty:                                               'Petla z efektami
    Do
     If Efekt = 1 Then
       K1 = 0
       K2 = 0
       K3 = 0
       K4 = 0
       K5 = 0
     End If
    
     If Efekt = 2 Then
       K1 = 1
       K2 = 1
       K3 = 1
       K4 = 1
       K5 = 1
     End If
    
     If Efekt = 3 Then
       K1 = 1
       K2 = 1
       K3 = 1
       K4 = 0
       K5 = 0
     End If
    
     If Efekt = 4 Then
       K1 = 0
       K2 = 0
       K3 = 0
       K4 = 1
       K5 = 1
     End If
    
     If I1 = 0 Then
        Goto Glowna_petla                                       'Jezeli I1=0 skocz do Petli glownej
     End If
    Loop
    
    Sub Wlacz
       Stop Timer1
       Licz = 0
       Efekt = 2
       Dioda = 1
       Return
    End Sub
    
    Sub Wylacz
       Stop Timer1
       Licz = 0
       Efekt = 1
       Dioda = 0
       Return
    End Sub
    
    Sub Zmien
       Stop Timer1
       Licz = 0
    
       If Efekt > 1 Then
       Efekt = Efekt + 1
       End If
    
       If Efekt = 5 Then
          Efekt = 2
       End If
    
       Dioda = 1
       Goto Petla_efekty                                        'Skocz do petli z efektami
    End Sub
    
    Sekunda:
       Load Timer1 49911                                        'ladowanie timera
       Incr Licz                                                'zwiekszenie zmiennej okreslającej liczbę sekund
       If Licz = 2 Then
          Timer_zlicza = 0                                      'jeżeli liczba sekund = 2 to resetuj flage Timer_zlicza
          Licz = 0
       Return
    
    

    Początkowo nawyskakiwało mi kilka błędów, ale się z nimi uporałem. Pozostał tylko jeden:
     Error 7 Line: 0  IF THEN expected [178]
    Error 123 Line 0 END IF expected


    nie wiem gdzie jeszcze brakuje if albo end if a błąd wskazuje linie 0.
  • #30 7407139
    grysek
    Poziom 19  
    End if brakuje w podprogramie sekunda.
REKLAMA