logo elektroda
logo elektroda
X
logo elektroda
ADVERTISEMENT
ADVERTISEMENT
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Opóźnienie 30 min z możliwością anulacji w 89C2051, Bascom, kwarc 11.059MHz

tengu 03 Nov 2006 07:28 1675 4
ADVERTISEMENT
  • #1 3182194
    tengu
    Level 21  
    Posts: 661
    Help: 20
    Rate: 102
    Jak zrobić opóźnienie ok 30min z którego można zrezygnować (anulować) w każdej chwili? Nie znam asm zupełnie i tylko trochę znam Bascom'a (chodzi mi o przykład oczywiście w tym drugim). Oczywiście można wydać polecenie "Wait" kilkakrotnie, ale to sprawy nie załatwia ponieważ nie można tego anulowac - chyba ze ja o czymś nie wiem. Kwarc który użuwam w moim urządzeniu to 11.059MHz i niestety taki musi zostać. Z góry dziękuję za pomoc.

    P.S. Wiem, że temat wałkowany wielokrotnie, ale jakoś niebardzo mogłem zrozumieć o co w timerach chodzi...
  • ADVERTISEMENT
  • #2 3182241
    szymtro
    Level 30  
    Posts: 1421
    Help: 101
    Rate: 59
    Ktoś tu zaraz wstawi pewnie gotowy kod ale.

    Napisałęś około wiec dokładność chyba nie gra roli. Zrobić tak aby tajmer przepełniał sie sam (config timerx timer, start timerx, enable timerx, enable interrupts). W procedurze obsługi tajmera (on timerx przerwanie_tajmerx, przerwanie_tajmerx:) zrób zwiększanie (if jakas_zmienna>0 then decr jakas_zmienna). Coś takiego samo będzie sobie odliczało jak tylko wartość bedzie wieksza od zera. Do tego potrzebujesz dwie pętle (jedna stan oczekiwania druga odliczanie). W momencie zależnym od ciebie wysyłasz program do drugiej pętli z wcześniejszym wpisaniem wartości do jakaś_zmienna. Druga petla ma sprawdzać czy jakaś_zmienna juz sie do zera odliczyła i do tego warunek cancel.
    dim jakas_zmienna as word
    config timer0 timer
    on timer0 przerwanie_tajmer0
    enable timer0
    enable interrupts
    
    petla_oczekiwanie:
     if [warunek do startu odliczania] then goto petla_odliczanie_pc
    goto petla_oczekiwanie
    
    petla_odliczanie_pc:
     jakas_zmienna=25313 'tyle mi wyszlo dla 1800 sekund i 11059200 i przy 65536 impulsach przepelnienia timer0
    petla_odliczanie:
     if jakas_zmienna=0 then goto petla_oczekiwanie
     if [warunek do cancel'owania] then goto petla_oczekiwanie
    goto petla_odliczanie
    
    przerwanie_tajmer0:
     if jakas_zmienna>0 then decr jakas_zmienna
    return

    Oczywiście to jest tylko jedna z możliwości zrobienia czegoś takiego. Nie ma optymalizacji prędkosci ani obliczeń.

    W ASM schemat podobny ale trzeba będzie samemu sobie przygotowac odejmowanie 16 bitowe i warunki.
  • ADVERTISEMENT
  • #3 3195451
    ekspert100
    Level 18  
    Posts: 541
    Help: 32
    Rate: 73
    witam!!!

    Przesyłam plik asm zawierający generator ze zmienną f
    na port P3.7 w zakresie akustycznym
    oparty na zasadzie jw. częstotliwość wyjściowa
    zleży od zmiennej w komórce ram.
    Do zmian służy P3.4 i P3.5 góra /dół.

    procesor 89c2051 12mhz program testowany
    pozmieniaj wartości w pętlach czasowych
    aby wydłużyć czas .posiadam jeszcze plik po kompilacji
    i chyba płytkę jak co to mogę podesłac


    pozdrawiam!!!
    Attachments:
    • gen_klaw_2_OK.rar (3.32 KB) You must be logged in to download this attachment.
  • ADVERTISEMENT
  • #4 3196295
    cyberdar
    Level 31  
    Posts: 1465
    Help: 161
    Rate: 73
    Witam

    Zadeklaruj sobie - skonfiguruj TIMER, żeby odmierzał jakieś równe odcinki czasowe np. 0.1 sekundy. W chwili wystąpienia przerwania zliczaj sobie jakąś zmienną. Po zliczeniu przez ten licznik 18000 przerwań będziesz miał odliczone pół godziny. W chwili kiedy TIMER sobie liczy procesor ma wolne czyli nic nie stoi, żeby w programie głównym napisać co chcesz. Jeśli odmierzysz dokładnie 0.1 sekundy to czas 30 minut też będziesz miał dokładnie odmierzony. Jak wiesz wait itp. nie są zbyt dokładne do odmierzania czasów a w szczególności takich.

    --
    pozdrawiam
  • #5 3196380
    tengu
    Level 21  
    Posts: 661
    Help: 20
    Rate: 102
    Dziękuję wszystkim za pomoc. Wzorowałem się na "listingu" zegara AVT-2488 i jakoś to działa. Jeszcze raz dzięki.
ADVERTISEMENT