Elektroda.pl
Elektroda.pl
X

Search our partners

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

ATmega8535 Bascom i czasówka:)

kikada 13 Feb 2007 22:33 1944 9
  • #1
    kikada
    Level 11  
    Zrobiłem sterownik na 8535 i teraz chcę w bascomie napisać program do jego obsługi :)
    opis działania :
    po nacisnieciu przycisku S1,S2,,,S16 ma sie załaczyć się przekaźnik PK1,PK2,,,PK16 na 15 min , po tym czasie wyłaczyć i znów po 15 min załaczyć . i tak co 15 min. po 4 godzinach ma się wyłaczyć . oczywiście przekazniki maja przełaczać sie nieżależnie .
    O ile z PCB nie mam problemu to programowania się dopiero uczę
    napisałem sobie już procedurę załaczania
    nie wiem jak zabrać się do procedury timera
    moja procerura..... może długa ale działa :):):):)
    $crystal = 8000000
    $regfile = "m8535.dat"

    Config Debounce = 1000


    Config Pina.0 = Input
    Config Pina.1 = Input
    Config Pina.2 = Input
    Config Pina.3 = Input
    Config Pina.4 = Input
    Config Pina.5 = Input
    Config Pina.6 = Input
    Config Pina.7 = Input

    Config Pinb.0 = Output
    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 Pinc.7 = Input
    Config Pinc.6 = Input
    Config Pinc.5 = Input
    Config Pinc.4 = Input
    Config Pinc.3 = Input
    Config Pinc.2 = Input
    Config Pinc.1 = Input
    Config Pinc.0 = Input

    Config Pind.0 = Output
    Config Pind.1 = Output
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    Config Pind.7 = Output

    S1 Alias Pina.0
    S2 Alias Pina.1
    S3 Alias Pina.2
    S4 Alias Pina.3
    S5 Alias Pina.4
    S6 Alias Pina.5
    S7 Alias Pina.6
    S8 Alias Pina.7

    S9 Alias Pinc.7
    S10 Alias Pinc.6
    S11 Alias Pinc.5
    S12 Alias Pinc.4
    S13 Alias Pinc.3
    S14 Alias Pinc.2
    S15 Alias Pinc.1
    S16 Alias Pinc.0


    Pk1 Alias Portb.0
    Pk2 Alias Portb.1
    Pk3 Alias Portb.2
    Pk4 Alias Portb.3
    Pk5 Alias Portb.4
    Pk6 Alias Portb.5
    Pk7 Alias Portb.6
    Pk8 Alias Portb.7


    Pk9 Alias Portd.0
    Pk10 Alias Portd.1
    Pk11 Alias Portd.2
    Pk12 Alias Portd.3
    Pk13 Alias Portd.4
    Pk14 Alias Portd.5
    Pk15 Alias Portd.6
    Pk16 Alias Portd.7

    Set Porta.0
    Set Porta.1
    Set Porta.2
    Set Porta.3
    Set Porta.4
    Set Porta.5
    Set Porta.6
    Set Porta.7

    Set Portc.7
    Set Portc.6
    Set Portc.5
    Set Portc.4
    Set Portc.3
    Set Portc.2
    Set Portc.1
    Set Portc.0

    Do
    Debounce S1 , 0 , Pr1 , Sub
    Debounce S2 , 0 , Pr2 , Sub
    Debounce S3 , 0 , Pr3 , Sub
    Debounce S4 , 0 , Pr4 , Sub
    Debounce S5 , 0 , Pr5 , Sub
    Debounce S6 , 0 , Pr6 , Sub
    Debounce S7 , 0 , Pr7 , Sub
    Debounce S8 , 0 , Pr8 , Sub
    Debounce S9 , 0 , Pr9 , Sub
    Debounce S10 , 0 , Pr10 , Sub
    Debounce S11 , 0 , Pr11 , Sub
    Debounce S12 , 0 , Pr12 , Sub
    Debounce S13 , 0 , Pr13 , Sub
    Debounce S14 , 0 , Pr14 , Sub
    Debounce S15 , 0 , Pr15 , Sub
    Debounce S16 , 0 , Pr16 , Sub
    Loop
    End

    Pr1:



    Return

    Pr2:
    Toggle Pk2
    Return

    Pr3:
    Toggle Pk3
    Return

    Pr4:
    Toggle Pk4
    Return

    Pr5:
    Toggle Pk5
    Return

    Pr6:
    Toggle Pk6
    Return

    Pr7:
    Toggle Pk7
    Return

    Pr8:
    Toggle Pk8
    Return

    Pr9:
    Toggle Pk9
    Return

    Pr10:
    Toggle Pk10
    Return

    Pr11:
    Toggle Pk11
    Return

    Pr12:
    Toggle Pk12
    Return

    Pr13:
    Toggle Pk13
    Return

    Pr14:
    Toggle Pk14
    Return

    Pr15:
    Toggle Pk15
    Return

    Pr16:
    Toggle Pk16
    Return
  • #2
    cyberdar
    Level 31  
    Witam

    Trochę zamieszałeś z tym działaniem. Trudno coś z tego zrozumieć. Zrozumiałem, że po naciśnięciu klawisza włącza się dany przekaźnik na 15 minut. Po 15 minutach ma się wyłączyć na 15 minut czy tylko na chwilę bo trochę to dla mnie niejasne. Drugie pytanie jakie mi się nasuwa to czy w trakcie kiedy przekaźnik jest włączony/wyłączony ma być możliwość jego recznego wyłączenia/włączenia. Potem coś napisałeś o 4 godzinach ?!?!?!?!.

    Wyjaśnij dokładniej. Chętnie pomogę.

    --
    pozdrawiam
  • #3
    kundzios
    Level 19  
    ja za dobry nie jestem w tym ale cos podpowiem
    ustaw sobie timer zeby mial przerwanie co 1 s a pozniej kazda czesc obslugi przekaznika niech liczy sobie do 900s(15min) i po tym czasie niech zmieni stan wyjscia (toggle) a jak policzy do 14400s(4h) to wylaczy calkiem

    wedlug mnie powinno dzialac

    Dodano po 20 [minuty]:

    tak ustaw timer 16 bitowy tak:

    Config timer? = timer , prescale= 256

    on timer? odmierz_1s

    enable interrupts
    enable timer?

    counter? = 34286

    juz masz ustawiony timer do dzialania(w miejscach ? masz wstawic numer licznika 16 bitowego)

    teraz to:

    Odmierz_1s:

    counter? = counter? + 34286

    IF (jakas zmienna ktora pokazuje ze przekaznik ma dzialac) = 1 then
    incr (zmienna ktora liczy do 900s)
    incr (zmienna ktora liczy do 14400s)
    end if

    i tak dla wszystkich przyciskow i przekaznikow

    return

    przy obsudze kazdego rzekaznika trzeba dodac obsluge tego co licza, jak dojdzie do 900 ma zmienic stan przekaznika, wyzreowac licznik, a jak doliczy do 14400 to ma wyzerowac zmienna ktora liczy do 900 i zmienna ktora liczy do 14400 i zmienna ktora pokazuje ze przekaznik ma dzialac i wylaczyc przekaznik

    a jak nacisniesz ktorys z przyciskow to zmienna ktora pokazuje ze przekaznik ma dzialac ma wtedy ustawic sie na 1

    do tego jeszcze trzeba dodac troche ale idee juz masz

    ponoc nie umiem tlumaczyc ale to sie okaze :)

    regulka obslugi przycisku

    If s1 = 0 then
    waitms25
    if s1 = 0 then
    if (zmienna ktora pokazuje ze przekaznik ma dzialac) = 0 then
    set (zmienna ktora pokazuje ze przekaznik ma dzialac)
    else
    reset (zmienna ktora pokazuje ze przekaznik ma dzialac)
    (zmienna ktora liczy do 900s) = 0
    (zmienna ktora liczy do 14400s) = 0
    set przekaznik1
    end if
    end if
    end if
  • #4
    kikada
    Level 11  
    Fakt , trochę zamotałem :) byłó późno
    wyjaśniam , po naciśnięciu przycisku przekaźnik się załącza i wyłacza co 15 min, a całkowite wyłaczenie nastepuje po 4 godzinach

    zgodnie z zasadą 1 rysunek tysiąc słów
    pozdrawiam:):):)

    ATmega8535 Bascom i czasówka:)
  • #6
    cyberdar
    Level 31  
    Witam

    Żeby uzyskać 1 sekundę albo skonfiguruj sobie timer albo wykorzystaj fakt, że układ ma dodatkowe wyprowadzenia do podpięcia dodatkowego kwarca a np. Bascom w prosty sposób pozwala Ci zrobić zegar. Skonfigurowanie zegar umożliwia skonstruowanie podprogramu (musi nazywać się sectic, więcej o tym w pliku pomocy), do którego procesor będzie wchodził właśnie co sekundę. Umieszczanie najważniejszej części programu w obsłudze przerwania nie jest może najlepszym, czy eleganckim rozwiązaniem ale w tym wypadku nie grozi to żadnymi konsekwencjami bo przerwanie jest wywoływane co sekundę a w programie głównym program właściwie nic nie robi.
    Co do programu. Moim zdaniem najprościej byłoby gdybyś w pętli głównej zrobił tylko obsługę 16-tu klawiszy natomiast w przerwaniu wywoływanym co 1 sekundę porobiłbyś sobie liczniki czasu (sekund), które zliczałyby tylko w momencie kiedy dane wyjście byłoby uaktywnione. Po 8 pełnych cyklach dane wyjście byłoby wyłączane i wskaźnik od danego wejścia były zerowany.

    --
    pozdrawiam
  • #7
    kikada
    Level 11  
    napisałem jak podałes , program skompilował sie ale nie działa :(:(:(
    mógłbys to sprawdzić czy cos nie pomyliłem :)
    do testów wystarczy by przełaczał sie co 2 sek i wyłaczał po 10 sek




    $crystal = 8000000
    $regfile = "m8535.dat"

    Dim T1 As Integer ` czas zał /wył w sek
    Dim T2 As Integer ` czas całk w sek
    T1 = 2 ` zmienna zał/wył w sek
    T2 = 10` zmienna całk w sek

    Config Pina.0 = Input
    Config Pinb.0 = Output
    S1 Alias Pina.0






    Config Timer0 = Timer , Prescale = 256
    On Timer0 Odmierz_1s
    Enable Interrupts
    Enable Timer0

    Odmierz_1s:
    Counter0 = Counter0 + 34286


    If Pk1 = 1 Then
    Incr T1
    Incr T2
    End If

    Return

    If S1 = 0 Then
    Waitms 25
    If S1 = 0 Then
    If Pk1 = 0 Then
    Set Pk1
    Else
    Reset Pk1
    T1 = 0
    T2 = 0
    Set Pk1
    End If
    End If
    End If
  • #8
    kundzios
    Level 19  
    mi sie wydaje ze timer0 to timer 8 bitowy
    a timer1 to timer 16 bitowy

    sprobuje to napisac w domu ale na amega8 bo nie mam ATmega8535 i podam ci jak mi wyjdze

    wlasnie zabieram sie do pisania :) trzymaj kciuki
  • Helpful post
    #9
    cyberdar
    Level 31  
    Witam

    Jako jedno z możliwych rozwiązań podaję kod poniżej. Oczywiście należałoby go traktować jako szkielet i dopracować.

    Code:


    $regfile="m8535.dat"
    $crystal=8000000

    Config Timer1=Timer, Prescale=1024

    Config Portc.0 = Input : K1 Alias Pinc.0
    Config Portd.0 = Output : Wy_1 Alias Portd.0
    Config Portc.1 = Input : K1 Alias Pinc.1
    Config Portd.1 = Output : Wy_2 Alias Portd.1

    Dim Wsk_1 As Bit
    Dim Licznik_1 As Word
    Dim Cykl_1 As Byte
    Dim Wsk_2 As Bit
    Dim Licznik_2 As Word
    Dim Cykl_2 As Byte

    Load Timer1, 7812
    On Timer1 1_sekunda
    Enable Timer1
    Enable Interrupts
    Start Timer1

    Licznik_1=0: Licznik_2=0
    Wsk_1=0 : Wsk_2=0

    Do {program główny}
    If K1 = 0 then wsk_1=1
    If K2 = 0 then wsk_2=1
    Loop {koniec programu głównego}
    End

    1_sekunda:
    Load Timer1, 7812
    If Wsk_1=1 Then Incr Licznik_1
    If Licznik_1>5 then
     Wy_1 = not Wy_1 : Licznik_1=0 : Incr Cykl_1
       End If
    If Cykl_1=8 then
     Cykl_1 = 0 : Wsk_1 = 0
      End If

    If Wsk_2=1 Then Incr Licznik_2
    If Licznik_2>5 then
     Wy_2 = not Wy_2 : Licznik_2=0 : Incr Cykl_2
       End If
    If Cykl_2=8 then
     Cykl_2 = 0 : Wsk_2 = 0
      End If

    Return



    --
    pozdrawiam
  • Helpful post
    #10
    kundzios
    Level 19  
    kurcze mi nie wychodzi :| timer chodzi co 1s ale reszta do kitu

    Dodano po 25 [minuty]:

    program chodzi :)

    oczywiscie musisz go przerobic na wlasne potrzeby dodac tyle ile chcesz przekaznikow i zmienic czasy w programie bo tam jest 10s i 40s

    ten program jest przygotowany pod ATmega8 i kwarc 8MHz

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000

    Config Pind.0 = Output
    Config Pinb.0 = Input

    Config Timer1 = Timer , Prescale = 256

    Dim Pk1_on As Bit
    Dim Pk1_a As Integer
    Dim Pk1_b As Integer

    Enable Interrupts
    Enable Timer1
    Counter1 = 34286

    Pk1_on = 0
    Pk1_a = 0
    Pk1_b = 0

    On Timer1 Odmierz_1s

    Set Portb.0 'podlaczenie do pinu B.0 rezystora podciagajacego(bez tego program wariuje)
    Set Portd.0

    Do

    If Pinb.0 = 0 Then
       Waitms 25
       If Pinb.0 = 0 Then
          If Pk1_on = 1 Then
             Reset Pk1_on
             Pk1_a = 0
             Pk1_b = 0
             Set Portd.0
          Else
             Set Pk1_on
             Reset Portd.0
          End If
       Waitms 150
       End If
    End If

    If Pk1_on = 1 Then
       If Pk1_a >= 10 Then
          Pk1_a = 0
          Toggle Portd.0
       End If
       If Pk1_b >= 40 Then
          Reset Pk1_on
          Pk1_b = 0
          Pk1_a = 0
          Set Portd.0
       End If
    End If

    Loop
    End

    Odmierz_1s:

    Counter1 = Counter1 + 34286

    If Pk1_on = 1 Then
       Incr Pk1_a
       Incr Pk1_b
    End If

    Return