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

[Bascom Tinny44] - Instrukcja Load na Timer1 nie działa poprawnie

nouki 09 Lut 2015 17:32 1605 25
REKLAMA
  • #1 14421521
    nouki
    Poziom 25  
    Witam.

    Panowie walczę jakiś czas i nie mogę poradzić sobie z dość prostą sprawą.
    Nie działa mi instrukcja Load na timer1
    Wyczytałem że wartość jaką podaję czyli 250 zostanie odliczona do 0 i ma nastąpić przerwanie i tak w koło.
    Czyli licząc
    Q=8Mhz
    250 impulsów daje - 0,000032s czyli 31250 Hz
    31250 / 100 =~310Hz

    Natomiast dioda Toggle Ledd1 zmienia się prawie co sekundę.

    Czyli wygląda że polecenie load jest ignorowane licząc.
    przerwanie co 0,00819200s czyli 122Hz/100 =1.2s.

    Nie istotne jest co wpiszę w:
    Load Timer1 , 250 czy też Load Timer1 , 65000
    liczy tak samo.

    Proszę o rady :).
    Pozdrawiam.


    Kod: text
    Zaloguj się, aby zobaczyć kod

    $regfile = "ATTINY44.dat"

    $crystal = 8000000


    Config Timer1 = Timer , Prescale = 1
    Load Timer1 , 250
    On Timer1 Prztimer1
    Enable Timer1
    Enable Interrupts




    Config Portb.2 = Output
    Ledd1 Alias Portb.2
    Reset Portb.2


    Config Portb.0 = Output
    Wyj1 Alias Portb.0
    Reset Portb.0



    Dim Flaga1 As Byte
    Dim Licznik As Byte
    Dim Led1 As Byte


    Flaga1 = 1




    Do

    Led1 = 50
    Wait 1
    Led1 = 80
    Wait 1
    Led1 = 10
    Wait 1

    Loop




    Prztimer1:

    Incr Licznik
    If Licznik > 100 Then
    Licznik = 0
    Toggle Ledd1
    End If



    If Flaga1 = 1 Then
    If Licznik < Led1 Then
    Set Wyj1
    Else
    Reset Wyj1
    End If
    End If

    Return

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 14421927
    kisoft
    Poziom 14  
    ustaw sobie może inny podział preskalera na 8,64,256 bo te na 1 i 1024 mogą powodować jakieś problemy. Skorzystaj z programu do wyliczania czasu wystąpienia przerwań np kalk . Wyślij mi emaila to ci podeślę prosty programik.

    Według tego co zadeklarowałeś w programie przerwanie wystąpi co
    0,00816075 s
  • #3 14422119
    nouki
    Poziom 25  
    Witam.

    Nie istotne jest co wpiszę w:
    Load Timer1 , 250 czy też Load Timer1 , 65000
    liczy tak samo.

    Dodatkowo stosując prescaler nawet 8 uzyskam częstotliwość blisko 20Hz czyli chyba nie bardzo jak pracę diody.

    P.s proponuje zerknąć do helpa:)
    Opis:
    Instrukcja powoduje wpisanie do licznika określonej liczby zliczanych impulsów. Przed załadowaniem wartości do licznika, instrukcja dokonuje niezbędnego przeliczenia w postaci: 256- wartość. Tak więc instrukcja:
    Load Timer0, 10
    spowoduje, że do licznika trafi liczba 246, więc licznik przepełni się właśnie po 10 impulsach.

    Pozdrawiam.
  • #4 14422181
    kisoft
    Poziom 14  
    Napisz może co ty chcesz .
    W kursie Bascoma z EP. napisano kiedyś że podział przez 1 i 1024 może powodować problemy ale dokładnie nie pamiętam o co chodziło .
    A poza tym Timer1 jest 16 bitowy czyli liczy do 65 536

    może usuń polecenie load timer PRESKALER NA 8 a wstaw takie
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Przerwanie wystąpi dokładnie co 0,05s
  • REKLAMA
  • #5 14422320
    nouki
    Poziom 25  
    Wszytko jest napisane.

    Jest to programowy Pwm.

    Q=8Mhz
    250 impulsów daje - 0,000032s czyli 31250 Hz
    31250 / 100 =~310Hz

    Częstotliwość Pwm w tym przypadku ma być 310Hz.

    Oczywiście na Timer0 działa bez kombinowania, niestety jest on już zajęty czymś innym.

    Czyli warunek z przerwania powinien być wykonany około 310Hz.
    Prztimer1:

    Incr Licznik
    If Licznik > 100 Then
    Licznik = 0
    End If
  • #6 14422371
    kisoft
    Poziom 14  
    wyliczenia zastosowałeś do timer0 a pracujesz na timer1
  • REKLAMA
  • #7 14422392
    nouki
    Poziom 25  
    Widzę że chyba Kolega wczorajszy.
    Skoro ładuje 250 wartość to co zmienia czy to timer0 czy timer1.
    Do tego jest instrukcja "load"

    Wkleiłem opis instrukcji z helpa a Kolega dalej swoje.
    Pozdrawiam

    P.s Proponuje poczytać nim się wypowie w jakimś temacie.
  • #8 14422492
    kisoft
    Poziom 14  
    to ty raczej poczytaj o timerach
    skoro nie ma różnicy to czemu na timerze 0 chodzi jak to napiałes bez kombinowania a na t1 nie chce chodzić.
  • #9 14422633
    Konto nie istnieje
    Konto nie istnieje  
  • #10 14422760
    nouki
    Poziom 25  
    niveasoft napisał:
    Dla mnie 8MHz to osiem milionów Herców

    8 000 000 / 310 = 25806 tyle musi być pomiędzy przerwaniami
    Wiec albo Load Timer 25806 albo
    65535 - 25806 = 39729
    wiec iw przerwaniu Timer1 = Timer1 + 39729


    I jak z tych obliczeń uzyskasz pwm .

    Zakladajac że pwm ma 100 kroków ( 0 nie świeci 100 pełna moc).
    gdzie to Twoje 310 Hz.
  • REKLAMA
  • #11 14422764
    kisoft
    Poziom 14  
    Dokładnie kolego niveasoft .
    Przy preskalerze ustawionym na 1 i w przerwaniu
    timer1=39729 przerwanie wystąpi co 0,00819200 s czyli tyle ile wyliczył sobie dla timera0 w pierwszym poście ( urzywając polecenia load)
  • #12 14422791
    nouki
    Poziom 25  
    0,000032s czyli 31250 Hz 
    kisoft napisał:
    Dokładnie kolego niveasoft .
    Przy preskalerze ustawionym na 1 i w przerwaniu
    timer1=39729 przerwanie wystąpi co 0,00819200 s czyli tyle ile wyliczył sobie dla timera0 w pierwszym poście ( urzywając polecenia load)


    czyli skoro przerwanie bedzie co 0,008 to przy pwm 100 krokow daje .. czestotliwosc 1Hz. Sami nie wiecie co piszecie.
    Napiszcie własny kod.
    Ciagle zapominacie ze liczy sie 100 przerwan ktore wplywa na wypełnienie sygnału.
    czyli przy 8Mhz przerwanie wystepuje przy 31250hz( przerwanie co 0,000032s) i 100 krokach pwm czyli 310Hz.
  • Pomocny post
    #13 14422841
    zumek
    Poziom 39  
    nouki napisał:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Przerwanie miałbyś z częstotliwością 32000Hz(8000000/250), gdybyś tylko
    przeładowywał Timer w przerwaniu.
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #14 14422842
    kisoft
    Poziom 14  
    kolego wstawiłeś kawałek kodu gdzie używasz przerwań a w pętli głównej stosujesz aż cztery waity . Jeżeli stosujesz przerwania to unikaj waitów . Napisz co ile ma wystąpić przerwanie a będzie prościej.
  • #15 14422843
    Konto nie istnieje
    Konto nie istnieje  
  • #16 14422857
    nouki
    Poziom 25  
    kisoft napisał:
    kolego wstawiłeś kawałek kodu gdzie używasz przerwań a w pętli głównej stosujesz aż cztery waity . Jeżeli stosujesz przerwania to unikaj waitów . Napisz co ile ma wystąpić przerwanie a będzie prościej.


    A niby gdzie w petli głównej?

    Kolego Zumek. Nie robilem tego tak jak piszesz bo znalazlem wiele postów w których jest tak jak napisałem zrobione. Nawet w helpie.
    sprawdzę jutro.
    Pozdrawiam
  • #17 14422991
    kisoft
    Poziom 14  
    Przepraszam 3 waity pomiędzy Do a Loop.

    P.S Najpierw sprawdź co zapodajesz na forum zanim będziesz kwestionował to co sam wstawiłeś.
  • #18 14423053
    nouki
    Poziom 25  
    kisoft napisał:
    Przepraszam 3 waity pomiędzy Do a Loop.

    P.S Najpierw sprawdź co zapodajesz na forum zanim będziesz kwestionował to co sam wstawiłeś.


    Nie kwestionuje tego co wstawiłem ale najwyraźniej Sam nie wiesz na czym polega program i o czym piszesz. Jest on jak najbardziej poprawny.
    Problem polega na tym że nie jest wykonane polecenie load timer1,250 jak pisałem. Nigdzie nie doczytałem że ma być wykonywane cyklicznie, zawsze pojawiało się na początku programów i nie występowało więcej i może tu jest błąd.
    A nie coś wyliczacie, kombinujecie i mieszacie.
    Program z timera0 nie różni się niczym brak tylko polecenia load i działa jak chce.
    Więc odliczając timerem1 250 cykli zamiast 65536 w koło robię z niego też niejako timer 8 bitowy.

    Pozdrawiam.

    P.s

    niveasoft napisał:
    Ja wiem jak się robi programowy PWM..i mój kod działa.
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Musisz sobie tylko dobrać odpowiednią predkość testowane na ~7,8kHz.
    Pulse Width to wartość PWM od 0 do 100%
    Co ciekawsze możesz tam tych diod mieć dużo więcej i każdą z inna wartoscia PWM.


    A u siebie nie mogę mieć więcej?

    Skoro liczysz tak :

    Dla mnie 8MHz to osiem milionów Herców

    8 000 000 / 310 = 25806 tyle musi być pomiędzy przerwaniami
    Wiec albo Load Timer 25806 albo
    65535 - 25806 = 39729
    wiec w przerwaniu Timer1 = Timer1 + 39729 i uzyskujesz przerwanie co 310Hz :) jak piszesz, to przy Swoich coint=100 masz jaką czestotliwość Pwm?
  • #19 14423393
    kisoft
    Poziom 14  
    Witam
    winien Ci jestem przeprosiny

    jeżeli do timer1=39729 załadujesz taką wartość początkową ( nie load tylko timer1=39729)
    to przerwanie wykona się co 0,00322587s

    TIMER1=0 to przerwanie wykona się co 0,00819200 ( tak jak napisałem parę postów wyżej)
  • #20 14424330
    kisoft
    Poziom 14  
    Pisałeś że twój programowy PWM pracuje poprawnie na Timer0, napisz może jakich użyłeś ustawień dla tego timera.
  • #21 14424469
    Konto nie istnieje
    Konto nie istnieje  
  • #22 14424897
    Konto nie istnieje
    Poziom 1  
  • #23 14424917
    Konto nie istnieje
    Konto nie istnieje  
  • #24 14425407
    nouki
    Poziom 25  
    Więc Kolego czym to się różni od mojego?

    Timer0 wygląda tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    $regfile = "ATTINY44.dat"

    $crystal = 8000000

    Config Timer0 = Timer , Prescale = 1
    Enable Timer0
    On Timer0 Prztimer0
    Enable Interrupts


    Do
    Led1 = 10
    Led2 = 20
    Led3 = 30

    Loop



    Prztimer0:

    Incr Licznik
    If Licznik > 100 Then
    Licznik = 0
    End If



    If Flaga1 = 1 Then
    If Licznik < Led1 Then 'pwm led 1
    Set Wyj1
    Else
    Reset Wyj1
    End If
    End If


    If Flaga2 = 1 Then
    If Licznik < Led2 Then 'pwm led 2
    Set Wyj2
    Else
    Reset Wyj2
    End If
    End If

    If Flaga3 = 1 Then
    If Licznik < Led3 Then 'pwm led 3
    Set Wyj3
    Else
    Reset Wyj3
    End If
    End If

    Return

    Kod: text
    Zaloguj się, aby zobaczyć kod


    A timer1 tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    $regfile = "ATTINY44.dat"

    $crystal = 8000000

    Config Timer1 = Timer , Prescale = 1
    Enable Timer1
    On Timer1 Prztimer1
    Enable Interrupts


    Do
    Led1 = 10
    Led2 = 20
    Led3 = 30

    Loop





    Prztimer1:
    Load Timer1 , 250
    Incr Licznik
    If Licznik > 100 Then
    Licznik = 0
    End If



    If Flaga1 = 1 Then
    If Licznik < Led1 Then 'pwm led 1
    Set Wyj1
    Else
    Reset Wyj1
    End If
    End If


    If Flaga2 = 1 Then
    If Licznik < Led2 Then 'pwm led 2
    Set Wyj2
    Else
    Reset Wyj2
    End If
    End If

    If Flaga3 = 1 Then
    If Licznik < Led3 Then 'pwm led 3
    Set Wyj3
    Else
    Reset Wyj3
    End If
    End If

    Return

    Kod: text
    Zaloguj się, aby zobaczyć kod


    W przerwaniu dostawiam X wyjść a w pętli programu określam wartości.
    Używam 3 kanałów pwm w tym konkretnym projekcie + pilot rc5, wszystkie nogi włącznie z resetem są zajęte.

    Problem polegał na tym że polecenie "load" miało być zawsze ponawiane. Widocznie źle zrozumiałem je. Po poprawce Kolegi Zumek wszystko działa jak miało.
  • #25 14425899
    kisoft
    Poziom 14  
    <ciach>

    Moderowany przez dondu:

    Nie odniosłem takiego wrażenia więc zbędne uwagi wyciąłem. Następnym razem proszę używać raportów.



    Rozumiem że wykorzystując podpowiedź zumka załadowałeś w przerwaniu
    Load Timer1, 250 .
REKLAMA