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

Jak zaprojektować układ generujący impulsy na '51 z timerem T0?

baksio 18 Gru 2004 02:14 1410 5
REKLAMA
  • #1 1069204
    baksio
    Poziom 1  
    Posty: 1
    Witam potrzebuje pomocy ponieważ musze wykonać mikroprocesorowy układ generujący impulsy o regulowanym czasie trwania od 1ms do 100ms z rozdzielczością 0.01ms. Jest to wykonywane na '51 i chce do tego wykorzystać timer T0 tylko potrzebowałbym jakiś pomysł na rozwiazanie układu blokowego potrzebnego do napisania algorytmu programu. Dodatkowo mogły by być jakieś ciekawe linki o tej tematyce. Dzięki:)
  • REKLAMA
  • Pomocny post
    #2 1069339
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Można by tak: zegar 12 MHz i wtedy cykl maszyny trwa 1 us, timer T0 ustawiasz w tryb 2 (autoreload) wpisując do jego rejestrów TH0 i TL0 wartości takie by przerwanie od niego było co 10us (problem kroku załatwiony). Tworzysz licznik programowy w którym będziesz odliczał potrzebną ilość wcześniej ustalonych przerwań. Po przekręceniu licznika reakcja na wyjściach w sensie wytwarzanie impulsu. Dalsza modyfikacja - dwa liczniki, jeden dla stanu HI drugi dla LOW i masz powtarzalne impulsy o regulowanym wypełnieniu.
    Tutaj fragment kodu dla ustawienia timera T0

    init_timer0:
    anl TMOD, #0F0H ;zeruj Timer 0
    orl TMOD, #02h ;
    mov TL0, #00h ;wartość ustawiana przez użytkownika
    mov TH0, #00h ;j.w.
    setb IE.1 ;będzie generowane przerwanie
    setb TR0 ;TCON.4 start timer
    ret
    gdzieś w programie głównym musi być:

    call init_timer0

    i obsługa przerwania
  • REKLAMA
  • Pomocny post
    #3 1069496
    Dexter77
    Poziom 28  
    Posty: 889
    Pomógł: 134
    Ocena: 19
    Tylko ze sam czas wejscia do przerwania w najgorszym przypadku moze trwac 9 cykli czyli w tym przypadku 9 us. Jak sobie wyobrazasz ze procesor zrobi cos wiecej oprocz wchodzenia i wychodzenia z przerwania ?? Trzeba wczesniej wyliczac wartosci potrzebne do wpisania w licznik i generowac tylko jedne przerwanie zmieniajace stan nozki na przeciwny. Trzeba tez uwzglednic typowa zwloke uC na wejscie do przerwania ktora typowo wynosi 4 cykle. Dla kroku 10us dawaloby to blad 40% ;)
    Pozdro
    Dexter
  • REKLAMA
  • Pomocny post
    #4 1076947
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Fakt - przy takim zegarze i takim ziarnie czasu trochę go brakuje. Jeszcze wszystko raz przemyślę i może jakaś koncepcja sie wykluje.
  • REKLAMA
  • Pomocny post
    #5 1081378
    aristot
    Poziom 14  
    Posty: 149
    Pomógł: 10
    Ocena: 4
    mam podobny programik tylko napisz mi na majla aristot(_at_)poczta.onet.pl to ci prześle mam pytanie tylko czym chcesz zmieniać szerokość impulsów ja mam to zorganizowane za pomocą klawiszy tzn jeden klawisz zwiększa o krok w góre a drugi o krok w dół
    wartości do załadowania licznika sąwczesniej policzone w excelu i zapamietane w tablicach w programie przez co odpuszczamy sobie zmudne obliczenia procesora szczególnie jesli chodzi o liczby większe od 256 w trakcie działania programu odpowiednie pozycje tablicy są odczytywane i zapamietywane w rejestrach w momencie wywołania przerwania ładujemy te rejestry do licznika i zmieniamy stan wyjscia na przeciwny.
    działa to świetnie (sprawdzone na oscyloskopie)
  • Pomocny post
    #6 1081577
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Po namyśle dochodzę do wniosku, że trochę trzeba zmienić koncepcję, a i tak nie wszystko się załatwi. Pomysł jest taki: 1) zegar i wszystkie sprawy jego bez zmian i cykl maszyny 1 us. 2) ponieważ impulsy mają być nie częściej niż co 1 ms to czasu trochę jest 3) do odmierzania okresu między impulsami użyj timera2 ustawionego jako licznik w trybie auto-reload i generującego przerwanie - cienkość jest taka, że masz maksymalny czas powtarzania impulsu 65,535 ms a to trochę mało w stosunku do założeń 4) w tym przerwaniu ustawiasz bit nogi wyjściowej i wyzwalasz start timera np. timer1 do odmierzenia czasu impulsu i nic więcej 5) timer1 odmierza czas po którym generuje przerwanie w którym tylko zerujesz bit nogi wyjściowej
    Błędy w niestabilności impulsu to kilka us w zależności od czasu potrzebnego na przejęcie przerwania, co przy minimalnym czasie 1 ms jest do przyjęcia.
REKLAMA