Elektroda.pl
Elektroda.pl
X

Search our partners

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

Ustawianie Timerow/licznikow w AT89CXXXX jako generator 50Hz

DarekMich 23 Mar 2006 12:51 1821 12
  • #1
    DarekMich
    Level 15  
    Witam wszytsich chcialem sie zapytac jak mozna zrobic prosty generatoreg z popularnego procesorka AT89C2051(taki obecnie posiadam) o zadanej czestotliwosci, dodam, ze czestotliwosc ta bedzie niezmienna, raz ustawiona na etapie programowania az przez caly czas dzialania, chce zrobic generatorek o f=50hZ, mam kwarc 12MHz, ma to byc przebieg prostokatny ktory bedzie jednoczesnie negowany i podawany na wda tranzystory(w1/2T przewodzi jeden, a w drugiej polowce T przewodzi drugi tranzystor), ma to byc swego rodzaju przetwornica napiecia, robie to na procesorku, bo wystepowac bedzie jeszcze komunikacja z PC, poprzez RS232, procesor bedzie monitorowal akumulator, ladowanie itp, bedzie tez informowal PC kiedy ma nastapic rozladowanie itp, prosze o pomoc.
  • #2
    submariner
    Level 32  
    chyba najprosciej to bedzie zastosowac pare komplementarna tranzystorow npn-pnp poprzez opornik polaczona z pinem portu ustawionego jako wyjscie , drugie dwa piny innego portu zwarte opornikami ok 50k do masy i na te piny poprzez rezystory ok 100k i diody zenera ustawic poziomy napiec do jakich akumulator ma sie ladowac a do jakich rozladowac - jak na jednym pinie pojawi sie 1 (ten od ladowania) to przerwij ladowanie a jak na drugim 0 to zalacz przrtwornice,
    mysle ze tu spokojnie mozesz uzyc waitms 10 dla zalacz i waitms 10 dla wylaczania tranzystorow przetwornicy badanie pinow i sprawdzanie tych kilku warunkow tak niewiele zmieni wypelnienie impulsu przy zegarze 12mhz ze nie ma sie co tym przejmowac (kilka mikrosekund)
  • #3
    DarekMich
    Level 15  
    Widzisz ja zajmuje sie programowaniem w Assamblerze nie w c(BASCOM), moje pytanie bardziej brzmialo jak ustawic rejestry od licznika(np T0) zeby pracowal on jako generator, reszta ukladu(tj ladowanie itp, to juz wiem jak wykonac), otoz generator ten ma miec T=0.02s(czyli 50Hz), ma to byc przebieg prostokatny o wypelnieniu 50%, negacje tegozsygnalu bede wykonywal na innej nozce,

    Dodano po 1 [minuty]:

    acha kwarc najprawdopodobniej jaki zastosuje bedzie mial 11.059Mhz, ze wzgledu na unormowane predkości komunikacji szeregowej, a te sa potrzebne mi by skomunikowac sie z PC(podaje kwarc bo od niego rownierz zalezy i to bardzo w jaki sposob ustawic licznik/timer T0)

    Dodano po 2 [minuty]:

    acha i jeszcze jedno, bedzie to przetwornica typu ON - LINE, czyli, ze bedzie chodzila ona caly czas, pozbede sie dzieki temu jakij kolwieg przerwy w chwili braku napiecia zasilania z sieci.

    Dodano po 2 [minuty]:

    a tak pozatym chce(kurcze wciaz nie udaje mi sie wszystkiegouscislic za jednym razem) to nie chce wykonywac generacji(wujscia sygnalu) na drodze programowej, bo nie bedzie to juz przebieg o f=50Hz, przeciez bedzie sie wykonywal jeszcze dalsza czesc programu, dlatego hccialbym wykonac to na Timerku/Liczniku. Uff... to juz chyba wszystko(jak na razie)
  • Helpful post
    #4
    simonel
    Level 12  
    ; Generator 50 Hz
    ; na P3.0
    ; Q=11.059 Mhz
    ;********************************
    ORG 00h
    sjmp start

    ORG 0Bh
    ljmp T0FULL
    ;**************************************************
    ORG 30h
    start: mov tmod,#00000001b
    mov th0,#220
    mov tl0,#0
    setb ie.1 ;zezwolenie na przerwanie od T0
    setb ie.7 ;zezwolenie na przerwania
    setb tcon.4 ;uruchomienie licznika T0

    program: nop
    nop
    nop
    nop
    sjmp program
    ;**************************************************
    ;przerwanie od licznika T0

    T0FULL: cpl p3.0 ;
    mov th0,#220
    mov tl0,#0
    reti
  • #5
    DarekMich
    Level 15  
    mam jeszcze takie jedno pytanie, otoż, czy Timer bedzie "chodził" jednocześnie z programem(dajmy na to, ze wstawie cos innego niz same nop ktore sa pod etykieta program), moze inaczej czy niezaleznie od tego jak dluga bedzie tam tresc programu to czy czestotliwosc na P3.0 wciaz bedzie wynosila 50Hz?
  • #6
    submariner
    Level 32  
    jak zaduzo napchasz to zawsze mozesz uzyc innego kwarcu np 24 mhz i napiecia 6v

    Dodano po 1 [godziny] 5 [minuty]:

    hm timery nie beda pracowac razem zuartem bo je wykorzystuja do transmisji mysle ze lepszym rozwiazaniem choc mniej eleganckim bedzie uzycie calego programu w petli a ew opoznienia powkladasz sobie w odpowiednie miejsca
  • #7
    DarekMich
    Level 15  
    simonel wrote:
    ; Generator 50 Hz
    ; na P3.0
    ; Q=11.059 Mhz
    ;********************************
    ORG 00h
    sjmp start

    ORG 0Bh
    ljmp T0FULL
    ;**************************************************
    ORG 30h
    start: mov tmod,#00000001b
    mov th0,#220
    mov tl0,#0
    setb ie.1 ;zezwolenie na przerwanie od T0
    setb ie.7 ;zezwolenie na przerwania
    setb tcon.4 ;uruchomienie licznika T0

    program: nop
    nop
    nop
    nop
    sjmp program
    ;**************************************************
    ;przerwanie od licznika T0

    T0FULL: cpl p3.0 ;
    mov th0,#220
    mov tl0,#0
    reti



    co do twojego programu, to duzo sie nad nim zastanawialem i doszedlem do cegos takiego(niech mnie ktos poprawi jaksie myle. otoz zastanowil mnie fakt tego jak policzzyles i w jaki sposob ustawiles rejestry TH0 i TL0, skad wiedziales co wpisac i wpadlem na takie cos:

    dajmy na to XTAL - 11,059MHz
    fiadomo efektywna f jest 12 razy mniejsza a wiec 11059000 /12 co daje nam okolo 921583(nazwijmy to ilosc cykli maszynowych na 1s)

    teraz musimy miec czestotliwosc(niech bedzie te 50Hz)

    ty w rejestry TH0 i TL0 wpisales nastepujace dane

    TH0=220
    TL0-0

    co daje:
    liczba dziesietna 220=liczba binarna 11011100
    liczba dziesietna 0=liczba binarna 00000000

    po polaczeniu w cale slowo mamy: 1101 1100 0000 0000 a to wynosi dziesietnie: 56320

    maksymalna moze byc 65535, a wiec odejmijmy i otrzymujemy z roznicy 65535-56320 liczbe 9215

    teraz ciekawostka liczba 9215 jest od liczby 921583 mniejsza (zaokraglajac) 100 razy, a te wlasnie 100 jest dwa razy wieksze od naszej f jaka chcielismy uzyskac


    Teraz pytanie, duzo sie pomylilem?????????????

    jako zalacznik daje program zrobiony w delhi5(przezemnie) tak na szybkiego, ktory potrzebuje tylko danych XTAL, F, a w wyniku podaje co wpisac do TH0 i TL0 wg w/w zasady.
    Attachments:
  • #8
    DarekMich
    Level 15  
    to znowu ja, chcialem sie zapytac. skoro nie tak sie liczy zawartosc licznika(zeby uzyskac zadana czestotliwosc) to w jaki sposob sie tego dokonuje????????????
  • #9
    simonel
    Level 12  
    Okres fali liczymy od zbocza powiedzmy opadającego do drugiego zbocza opadajacego. Czyli gdzies po drodze musi być zbocze narastające, ( Kumasz ?) . Częstotliwość 50Hz ma okes 20ms ,czyli gdzieś między 0ms a 20ms musi nastąpić zmiana z np. 0 na 1 na porcie procesora .
    A ponieważ nastepuje to w połowie po 10ms , mamy falę prostokatną o wypełnieniu 50 % o czestotliwości 50 Hz.

    Można to bardzo dokładnie zobaczyć na oscyloskopie.

    Polecam !!!
  • #10
    DarekMich
    Level 15  
    ja dobrze wiem jak sie liczy okres czestotliwosci(T=1/f) dla 50Hz wynosi ona wlasnie 0,02s, na oscyloskopie ja juz to widzialem, i nic w tym ciekawegomoje pytanie brzmialo inaczej, polecam do ponownej lektory postow powyzej.

    Dodano po 4 [minuty]:

    uruchamialem ten programik w symulatorze, ale jako, ze jest on tylko sprzetowy(programowy na PC) to jakos tak chodzi duuzo wolniej niz w rzeczystosci, ale dobre jest w nim to, ze podaje dokladna predkosc BOUD RATE dla portu szeregowego.
  • #11
    simonel
    Level 12  
    Tak to jest jak sie program pisze poźno w nocy.

    z th=220 bedzie dokładnie 59Hz i cos tam.
    i tl=0


    z th=213
    i tl =157 bedzie 50 hz

    teraz się zgadza ?

    Poza tym podałem ci ogólny zarys programu jak moze wyglądać.
    Miałem nadzieję ze dokładne obliczenia wykonasz sobie sam.

    Pozdrawiam.
  • #12
    DarekMich
    Level 15  
    to teraz moze inaczej pomysle:

    otoz wiadomo ze program wykonywany jest w predkosci 921583 cykli maszynowych na sekunde przy kwarcu 11,059MHz

    potrzeba zmieniac stan jednego z wyjsc 100 razy(50 razy musi pojawic sie "1" i rownierz tyle tez trawc musi "0") na sekunde, czyli w ciagu tych 100 razy musza byc dwa stany "1" i "0" kazdy po rowno, co daje nam
    ze musimy zmieniac stan pinu dwa razy szybciej niz dana czestotliwosc(czyli sto razy)

    sygnal na wyjsciu --> -_-_-_-_-_-_-_-_-_-_-_-_-_-_-
    50Hz ---> -_
    to czyli jedynka badz zero trwa dwa razy szybciej a wiec 100Hz(czestotliwos negowania wyjscia) uzyskamy wtedy dzieki temu wypelnienie rowne 50%

    to tak jak by wczesniejsze rozumowanie wydaje sie byc poprawne wtedy wychodzila mi wlasnie liczba 100(tak sie ciekawilem czemu akurat dwa razy wieksza),

    idac dalej to przerwanie musi wystepowac 100 razy w ciagu sekundy, czyli skoro 921583/100 wynosi
    w przyblizeniu 9215(a raczej 9216) to co tyle cyki musi wystepowac przepelnienie, licznik przepelnia sie po przekroczeniu liczby 65535, a wiec musimy ustawic w nim liczbe o 9215 mniejsza, a wiec 65535-9215 co da nam 56320, w ten sposob zmiany beda wystepowac 100 razy na sekunte(a jedna zmiana to polowa okresu), czyli dwie zmiany to caly okres wiec 100/2 =50


    mecze to dlatego, ze nie mam pojecia jak inaczej moglbym to policzyc, prawde mowiac nie wiem jak to sie liczy, czy musle dobrze, jezeli nie to niech ktos mi wytlumaczy jak to sie liczy
  • Helpful post
    #13
    simonel
    Level 12  
    11.0592 / 12= 0.9216 tyle trwa okres zegara w mikrosekundach .

    Poniewaz F=50 hz okres 20ms / 2= 10ms =10000 mikrosekund

    10000 / 0.9216 = 10851- tyle taktow musi policzyc licznik timera,

    przerwanie wystapi gdy licznik doliczy do 65535 +1,

    poniewaz liczy od 0 do 65535 ,trzeba mu wpisac wartosc poczatkowa.

    zeby odliczył owe 10851 taktow , czyli 65536-10851 = 54685.

    54685 - ta wartosc ładujemy do timera .


    Trzeba było zapytac się wprost ze nie wiesz lub jak to się robi (liczy).

    Pozdrawiam.