Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Timer na Atmelku 2051 - jak???

fox525 10 Mar 2004 21:08 1821 16
  • #1 10 Mar 2004 21:08
    fox525
    Poziom 13  

    Witam!
    Może zawracam głowę ale siedze już drugi dzień i zwariowałem od natłoku informacji, które czytam i czytam...
    Potrzebuję zrobić timer który odliczałby czas w zależności od tego ile razy nacisnąłem przycisk... Powiedzmy naciskam 5 razy - zapala diodę i odmierza 5 sekund po czym gasi diodę. Ale jak w czasie odmierzania nacisne jeszcze klawisz to doliczy mi ten czas a nie zacznie liczyć go od nowa...
    Próbuje to cały czas robic na Timer0 w BASCOMIE... Ale za nic nie działa...
    Za każdą pomoc serdecznie z góry dziękuję bo już nie mam siły...
    Jak ktoś by mogł przedstawić chociaż podstawowy zarys tego programiku bylbym ogromnie wdzieczny... Wchodze dopiero w swiat timerow i licznikow w BASCOMIE a przeczytalem juz tyle roznych wypowiedzi ze mam w glowie totalny mętlik...
    Dzieki za ewentualna pomoc i POZDRAWIAM!!!

    0 16
  • #3 10 Mar 2004 22:08
    nojmi
    Poziom 20  

    Napisalem ci taki programik:

    $

    Code:
    crystal 12000000                                             'dla 11059200
    
    Config Timer0 = Timer , Mode = 2 , Gate = Internal
    Load Timer0 , 250                                                      '260
    Enable Interrupts
    Enable Timer0

    On Int0 P3_2_int
    Enable Int0

    Start Timer0

    Dim 1s As word
    Dim Ilosc_sek As Byte
    Dim Sek As Byte
    Ilosc_sek = 1

    Do

    Loop

    On Timer0 Timer0_int

    Timer0_int:
       Incr 1s
       If 1s = 4000 Then                                                     '3860
          1s = 0
          Incr Sek
       End If
       If Sek = Ilosc_sek Then
          Sek = 0
          'cos tam
       End If
    Return

    P3_2_int:
       Incr Ilosc_sek
       1s = 0
       Sek = 0
    Return


    W symulatorze dziala dobrze. Musisz tylko dopisac zapalanie i gaszenie diody. Zamiast stosowania zmienej 1s typu word (dla mnie bylo to szybciej) mozesz zastosowac 2 zmienne typu byte.
    Jak nie bedziesz wiedzial dlaczego cos jest tak lub tak to pytaj.

    0
  • #4 11 Mar 2004 14:09
    fox525
    Poziom 13  

    Serdeczne dzieki za zainteresowanie...
    Juz montuje ukladzik i bede testowal programik... W koncu zajarze o co tu chodzi. Jak bede mail jakies pytamnka to na pewno sie zglosze..
    Jeszcze raz serdeczne dzieki
    POZDRAWIAM

    0
  • #5 11 Mar 2004 14:45
    diag
    Spec od samochodów

    Nie zapomnij zrobić układ eliminujący podskakiwanie styków, inaczej bedzie dziwnie ci liczył.

    0
  • #6 11 Mar 2004 17:09
    Jaco2002
    Poziom 20  

    Nojmi - gdybys mogl opisac mi krok po kroku co robi Twoj program... PLEASE!!! Wpisuje obsluge diody ale cos dziwnie mi to dziala... To znaczy jak nacisne 5 razy przycisk powinien zapalic diode na 5 sekund i potem ja zgasic... A on jak naciskam kolejne razy tak jakby liczyl od poczatku...
    Acha! I dlaczego dla przerwania 1 sekunda i przy kwearcu 12M jest Load.... 250.. Nie powinno byc 20? Chyba wtedy przerwanie byloby co 1s???
    Dzieki za pomoc i Pozdrawiam... :?

    0
  • #7 11 Mar 2004 20:33
    nojmi
    Poziom 20  

    fox525 przepraszam bardzo, ale zle przeczytalem. Bylem swiecie przekonany ze nacisniecie ma rozpoczac zliczanie od nowa. Ups. Wielka pmylka. W takim razie w miejscu przerwania powinno byc tylko:

    Code:
    P3_2_int: 
    
       Incr Ilosc_sek
    Return


    Co do Load timer to mi sie wydaje ze ma byc 250. Czestotliwosc 12000000Hz dzielona jest sprzetowo na 12 co daje wynik 1000000Hz. W liczniku T0 dzielona jest nastepnie przez te nasze 250 co powoduje wywolanie przerwania co 250us. Takich przerwan nalezy zliczyc 4000 aby uzyskac czas rowny 1s:
    Code:
    Timer0_int: 
    
       Incr 1s
       If 1s = 4000 Then                                                     '3860
          1s = 0
          Incr Sek
       End If
       ...


    Instrukcja Incr Sek powoduje zwiekszenie zliczanego czasu.
    Jezeli zliczany czas rowny bedzie czasowi okreslonemu przez ilosc przycisniec to wykona cosik. W twoim przypadku ma gasic diode:
    Code:
    If Sek = Ilosc_sek Then 
    
          Sek = 0
          P?.? = 0       
       End If


    W miedzyczasie moze wystapic zewnętrzne przerwanie niezalezne od zliczanego czasu, powodujac zwiekszenie czasu, po ktorym nastapic ma zgaszenie LED. Jezeli nacisniecie przycisku ma zapalac diode to musisz w instrukcji przerwania umiescic dodatkowo:
    Code:
    P3_2_int: 
    
       Incr Ilosc_sek
       P?.? = 1
    Return


    Aha. Jesli po okreslonym czasie wykonywane ma byc cos, ktore wymaga wiekszego czasu obrabiania przez procka to zamiast umieszczania tego duzego cos w procedurze przerwania, musisz wladowac to w petle glowna programu za pomocą dodatkowej zmiennej bitowej:
    Code:
    Do
    
       If Kod = 1 Then
          Kod = 0
          'cos
       End If
    Loop

    On Timer0 Timer0_int

    Timer0_int:
       Incr 1s
       If 1s = 4000 Then                                         
          1s = 0
          Incr Sek
       End If
       If Sek = Ilosc_sek Then
          Sek = 0
          Kod = 1
       End If
    Return

    0
  • #8 12 Mar 2004 18:24
    fox525
    Poziom 13  

    No wiec tak NOJMI...
    Wszystko dziala mi OK - no moze prawie OK!
    Program po przerobkach (nie wiem niestety czy nie walnalem w nim jakiejs glupoty - ale jesli tak to wybacz - to moje poczatki...) wyglada tak:

    $sim
    Dim Kod As Byte , Wysw As Byte
    Kod = 0
    Wysw = 0
    P1 = 191
    Przekaznik Alias P3.5
    Dioda Alias P3.4
    Reset Przekaznik
    Reset Dioda
    $crystal 12000000 'dla 11059200
    Config Timer0 = Timer , Mode = 2 , Gate = Internal
    Load Timer0 , 250 '260
    Enable Interrupts
    Enable Timer0

    On Int0 P3_2_int
    Enable Int0

    Start Timer0

    Dim 1s As Word
    Dim Ilosc_sek As Byte
    Dim Sek As Byte
    Ilosc_sek = 1

    Do
    If Kod = 1 Then
    Kod = 0
    Select Case Ilosc_sek:
    If Wysw = 0 Then
    P1 = 191
    Else
    If Wysw = 1 Then
    P1 = 6
    Else
    If Wysw = 2 Then
    P1 = 91
    Else
    If Wysw = 3 Then
    P1 = 79
    Else
    If Wysw = 4 Then
    P1 = 102
    Else
    If Wysw = 5 Then
    P1 = 109
    Else
    If Wysw = 6 Then
    P1 = 125
    Else
    If Wysw = 7 Then
    P1 = 7
    Else
    If Wysw = 8 Then
    P1 = 127
    Else
    If Wysw = 9 Then
    P1 = 111
    Else
    P1 = 241
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    Loop

    On Timer0 Timer0_int

    Timer0_int:
    Incr 1s
    If 1s = 5 Then '3860
    1s = 0
    If Wysw <> 0 Then
    Decr Wysw
    Kod = 1
    End If
    Incr Sek
    If Wysw = 0 Then
    P1 = 191
    Else
    If Wysw <> 0 Then
    Kod = 1
    End If
    End If
    End If
    If Sek = Ilosc_sek Then
    Sek = 0
    Ilosc_sek = 0
    Wysw = 0
    'cos tam
    Reset Przekaznik
    Reset Dioda
    End If

    Return

    P3_2_int:
    Incr Ilosc_sek
    Incr Wysw
    Set Przekaznik
    Set Dioda
    Kod = 1
    Return

    Pozmienialem troszke przerwania bo te oryginalne w czasie rzeczywistym dzialaly strasznie dlugo... Jest tylko taki problem... Nie wiem dlaczego ale nie zawsze zalicza mi dobrze impulsy, tzn. impulsow na 1 sekunde jest okolo 3-4, wiec powinien powiedzmy po 20 impulsach odliczyc 20 sekund i wylaczyc diode (i przekaznik - ale mniejsza z nim). A on dziala roznie. Raz policzy mi te 20 impulsow i po 20 sekundach wylaczy diode, ale czesciej jest tak ze dostanie np. 20 impulsow odliczy 5 na krotko wylaczy diode, szybko ja znowu zapali i odliczy powiedzmy jeszcze 8 sekund - czyli razem 13 a nie 20... Dlaczego tak jest? Dodam tylko ze zamiast przycisku mam 12Voltowe impulsy podlaczone zaporowo przez diode prostownicza do INT0.. I jak mowie raz dziala dobrze, ale niestety czesciej zle.. Masz moze jakis pomysl dlaczego tak jest?
    Dzieki i pozdrawiam... :roll:

    0
  • #9 12 Mar 2004 21:01
    nojmi
    Poziom 20  

    Zapis twojego programu jest strasznie nieczytelny. Nie jest to jakas krytka, czy czepianie sie z mojej stony. Poprostu w pszyszlosci kiedy powrocisz do tego programu to za nic nie polapiesz sie o co chodzi.

    Oto gotowy program po przerobce:

    Code:
    $crystal 11059200                                             '12000000
    
    Config Timer0 = Timer , Mode = 2 , Gate = Internal
    Load Timer0 , 240                                             '250
    set tcon.0
    On Int0 P3_2_int
    Enable Int0
    Enable Interrupts
    Enable Timer0
    Stop Timer0

    Dioda Alias P3.4

    Dim 1s As word
    Dim Ilosc_sek As Byte
    Dim Sek As Byte
    Dim kod as bit

    Dioda = 0
    Ilosc_sek = 0
    sek = 0
    kod = 1

    Do
       if kod = 1 then
          kod = 0
          If Ilosc_sek = 0 Then
             P1 = 191
          Elseif Ilosc_sek = 1 Then
             P1 = 6
          Elseif Ilosc_sek = 2 Then
             P1 = 91
          Elseif Ilosc_sek = 3 Then
             P1 = 79
          Elseif Ilosc_sek = 4 Then
             P1 = 102
          Elseif Ilosc_sek = 5 Then
             P1 = 109
          Elseif Ilosc_sek = 6 Then
             P1 = 125
          Elseif Ilosc_sek = 7 Then
             P1 = 7
          Elseif Ilosc_sek = 8 Then
             P1 = 127
          Elseif Ilosc_sek = 9 Then
             P1 = 111
          Else
             P1 = 241
          End If
       end if
    Loop

    On Timer0 Timer0_int

    Timer0_int:
       Incr 1s
       If 1s = 3840 Then                                          '4000
          1s = 0
          Incr Sek
       end if
       If Sek = Ilosc_sek then
          Ilosc_sek = 0
          1s = 0
          Sek = 0
          kod = 1
          Dioda = 0
          stop timer0
       End If
    Return

    P3_2_int:
       Incr Ilosc_sek
       Kod = 1
       Dioda = 1
       start timer0
    Return


    Spawdzilem go, dziala w praktyce. I tak jak wczesniej. Jak nie kapujesz czegos to pytaj.
    Aha, jeszcze jedno. Pamietaj o skasowaniu $sim przed kompilacja do programowania.

    0
  • #10 13 Mar 2004 01:15
    fox525
    Poziom 13  

    Nojmi JESTEŚ WIELKI!
    Powiedz mi gdzie mam wysłać jakieś piwo albo skrzynkę wódki zapomoc!?
    Dorobiłem tam jeszcze dekrementacje cyfry na wyswietlaczu i dziala swietnie. Ale mam jeszcze jedno pytanko jeśli można :)
    To wyjście które generuje mi te 12 voltowe impulsy na licznik mojego układu steruje jeszcze jakims chyba przekaznikiem. Jak odłącze ten przekaznik i impulsy ida tylko do mojego ukladu to liczy co do grama. Ale jak podlącze jeszcze ten układzik ktory byl wczesniej dolaczony to sa przeklamania w odliczaniu... Czy styki tego przekaznika moga wprowadzac jakies zaklucenia? Ja to mam wpiete do mojego ukladu zaporowo przez diode. Moze cos jeszcze wpiac co filtrowaloby sygnal???
    Poza tym uklad dziala bez zarzutu! Jeszcze raz bardzo Ci dziekuje za pomoc... Widze ze siedzisz w Atmelkach nie od dzis - wiec zapytam Ci czy nie spotkales sie moze z jakims ukladem na atmelku ktory zliczalby mi 16kHz impulsy telefoniczne. Chodziloby mi o cos w rodzaju licznika impulsow naliczania jednostek w telefonie w domku...
    Dziękuję i pozdrawiam!

    :D

    0
  • #11 14 Mar 2004 00:27
    24298
    Użytkownik usunął konto  
  • #12 14 Mar 2004 00:39
    fox525
    Poziom 13  

    Dzieki Arcu za pomoc. Ale moj przerobiony program tez dziala, wyswietlajac ilosc impulsow, itp., tyle ze pracuje na 89c2051 i uklad dziala mi dobrze (no prawie dobrze... :o ), tzn. do INT0 mam podlaczone generowane 12voltowe impulsy z jakiegos tam ukladu, ktore ida tez na jakis przekaznik. I o ile odlacze ten przekaznik to moj uklad zlicza impulsy idealnie, ale jak podlacze do tego wszystkiego ten nieszczesny przekaznik to uklad mi glupieje i nalicza wiecej impulsow... Czytalem ze moze jest to zwiazane z tym ze ten dolaczony przekaznik dodatkowo generuje mi harmoniczne impulsy ktore moj uklad odbiera jako pelne impulsy i po prostu je nalicza. i problem w tym jak mam je wyeliminowac??? Ale przetestuje Twoj pomysl!
    Dziekuje Ci za zainteresowanie i pozdrawiam!

    0
  • #13 14 Mar 2004 00:49
    24298
    Użytkownik usunął konto  
  • #14 14 Mar 2004 01:05
    fox525
    Poziom 13  

    tzn. nie zapodaje 12V impulsow na INT0 (no nie do konca). Sa one podlaczone przez diode prostownicza zaporowo na wejscie INT0. I kiedy sie pojawiaja uklad odbiera je jako stan niski i zlicza impuls... Zapewniam ze dziala bezblednie - jezeli impulsy sa podawane tylko na moje wejscie INT0, bo jak wspomnialem wysterowuja one jeszcze jakis przekaznik albo cewke, ktora jak podlacze to wprowadza mi na wejscie jakies harmoniczne i uklad rejestruje mi je jako dodatkowe stany "0" i nalicza mi wiecej impulsow niz jest ich w rzeczywistosci...

    0
  • #15 14 Mar 2004 01:13
    24298
    Użytkownik usunął konto  
  • #16 14 Mar 2004 01:22
    fox525
    Poziom 13  

    mozesz Arcu blizej z tym wyliczeniem stalej czasowej? juz dawno nie siedzialem glebiej w elektronice i troszku sie pozapominalo... jak ja dobrac? A na napiecie zasilajace chyba dam 33mH dla ewentualnego odfiltrowania i jakies kondziorki 100uF bo jak na razie ciagne z zasilacza - ale wydaje mi sie ze ma filtrowane dosc dobrze napiecie bo steruje jeszcze jakimis procesorami... i jak wspomnialem jak odepne ten nieszczesny przekaznik podlaczony dodatkowo do tych impulsow 12V to liczy mi wszystko bez bledow... Dzieki!

    0
  • #17 14 Mar 2004 07:38
    nojmi
    Poziom 20  

    Sprawdz jeszcze czy na tym dodatkowym przekazniku czy cewke jest wlaczona zaporowo dioda. Jesli nie to wlacz ja.

    0