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

Ustawianie Timerow/licznikow w AT89CXXXX jako generator 50Hz

DarekMich 23 Mar 2006 12:51 1968 12
REKLAMA
  • #1 2447546
    DarekMich
    Poziom 15  
    Posty: 323
    Pomógł: 4
    Ocena: 44
    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.
  • REKLAMA
  • #2 2447786
    submariner
    Poziom 32  
    Posty: 2319
    Pomógł: 51
    Ocena: 268
    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)
  • REKLAMA
  • #3 2448037
    DarekMich
    Poziom 15  
    Posty: 323
    Pomógł: 4
    Ocena: 44
    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)
  • Pomocny post
    #4 2449865
    simonel
    Poziom 12  
    Posty: 52
    Pomógł: 3
    Ocena: 1
    ; 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
  • REKLAMA
  • #5 2450987
    DarekMich
    Poziom 15  
    Posty: 323
    Pomógł: 4
    Ocena: 44
    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?
  • REKLAMA
  • #6 2451106
    submariner
    Poziom 32  
    Posty: 2319
    Pomógł: 51
    Ocena: 268
    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 2454121
    DarekMich
    Poziom 15  
    Posty: 323
    Pomógł: 4
    Ocena: 44
    simonel napisał:
    ; 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.
    Załączniki:
    • Project1.exe (302.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 2455837
    DarekMich
    Poziom 15  
    Posty: 323
    Pomógł: 4
    Ocena: 44
    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 2456231
    simonel
    Poziom 12  
    Posty: 52
    Pomógł: 3
    Ocena: 1
    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 2456334
    DarekMich
    Poziom 15  
    Posty: 323
    Pomógł: 4
    Ocena: 44
    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 2456425
    simonel
    Poziom 12  
    Posty: 52
    Pomógł: 3
    Ocena: 1
    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 2457662
    DarekMich
    Poziom 15  
    Posty: 323
    Pomógł: 4
    Ocena: 44
    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
  • Pomocny post
    #13 2459677
    simonel
    Poziom 12  
    Posty: 52
    Pomógł: 3
    Ocena: 1
    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.

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji generatora sygnału prostokątnego o częstotliwości 50 Hz na mikrokontrolerze AT89C2051 (lub ogólnie AT89Cxxxx) z kwarcem 11,059 MHz. Celem jest uzyskanie stabilnego sygnału o wypełnieniu 50%, który będzie sterował tranzystorami w przetwornicy napięcia typu on-line, jednocześnie umożliwiając komunikację z PC przez RS232 oraz monitorowanie stanu akumulatora. Omówiono sposób konfiguracji timerów/liczników (głównie Timer0) w trybie 16-bitowym, z wykorzystaniem przerwań do zmiany stanu wyjścia co połowę okresu sygnału (10 ms). Przedstawiono przykładowy kod asemblerowy ustawiający rejestry TH0 i TL0 na wartości umożliwiające generację przerwań z częstotliwością około 100 Hz, co pozwala na uzyskanie 50 Hz sygnału prostokątnego o 50% wypełnieniu. Wyjaśniono metodę obliczania wartości początkowej licznika: od liczby 65536 odejmuje się liczbę taktów odpowiadającą połowie okresu sygnału (około 10851 taktów dla 11,0592 MHz/12), co daje wartość 54685 do załadowania do rejestrów TH0 i TL0. Poruszono również kwestie pracy timera niezależnie od długości wykonywanego programu oraz wpływu częstotliwości kwarcu na dokładność generowanego sygnału. Wskazano, że przerwania timera działają niezależnie od głównej pętli programu, co pozwala na stabilne generowanie sygnału 50 Hz podczas wykonywania innych zadań mikrokontrolera.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA