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

ATmega32, Bascom – start i stop licznika Timer1 zboczem narastającym i opadającym

maniio 15 Maj 2006 23:22 2125 11
REKLAMA
  • #1 2629491
    maniio
    Poziom 14  
    Posty: 149
    Pomógł: 3
    Ocena: 9
    Witam!

    mam pytanie czy da sie ustawic w bascom i w atmedze 32 zeby timer1 zliczal , ale od chwili gdy zostanie wywolany zboczem narastajacym, a przestal zliczac gdy bedzie zobocze opadajace?
    Jesli tak to prosilbym o krotkie napisanie jak to ma byc i dlaczego.

    z gory dziekuje
  • REKLAMA
  • #2 2630316
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Można np tak:

    $crystal = 1000000
    $regfile = "m32def.dat"
    
    Config Int0 = Rising
    Config Int1 = Falling
    Config Timer1 = Timer , Prescale = 64
    
    Stop Timer1
    On Int0 Irq_int0
    On Int1 Irq_int1
    Enable Int0
    Enable Int1
    Enable Interrupts
    Do
       Waitms 100
    Loop
    End
    
    Irq_int0:
       Start Timer1
    Return
    
    Irq_int1:
       Stop Timer1
    return


    Pozdrawiam...
  • #3 2632478
    maniio
    Poziom 14  
    Posty: 149
    Pomógł: 3
    Ocena: 9
    super jest, tylko w atmedze 32 mam 2 przerwania zewnerzne, ale korzystam juz z nich i nie moge tego zrobic w ten sposob :(

    jakies inne pomysly?
  • REKLAMA
  • #4 2633222
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    maniio napisał:
    super jest, tylko w atmedze 32 mam 2 przerwania zewnerzne, ale korzystam juz z nich i nie moge tego zrobic w ten sposob :(

    jakies inne pomysly?

    To zrób to na trzecim - jedno wystarczy.

    Piotrek
  • REKLAMA
  • #5 2633400
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    hmmm takie kombinacje.... przacierz można rejestr odpowiadający za przerwanie ustawaiać w czasie wykonywania programu... raz ustawiasz go na zbocze narastające, a potem w obsłudze przerwania na zbocze opadające.
  • REKLAMA
  • #6 2633901
    greg_matrix
    Poziom 17  
    Posty: 163
    Pomógł: 28
    Ocena: 3
    Może to co napiszę jest trochę prymitywne ale działa, sprawdziłem :-) No więc można też tak:
    Start Timer0
    Do 
    Loop Until  We=1
    Timer0=0
    
    Do
    Loop Until We=0
    Wynik=Timer0

    We to dowolny pin. Prescaler timera trzeba ustawić tak żeby mierzony impuls zmieścił się w zakresie 0 - Tmax (zależy ile masz bitowy Timer).

    Nie potrzeba tu żadnych przerwań. Wada jest taka, że program zawiesi się jeśli nie będzie impulsu na We, dodatkowo w czasie jego trwania nić innego nie może robić. W tej kwestii przerwania oczywiście górą... No ale to już zależy do czego ma być program- w wielu zastosowaniach takie rozwiązanie może wystarczyć.

    Pozdrawiam!
  • #7 2634247
    maniio
    Poziom 14  
    Posty: 149
    Pomógł: 3
    Ocena: 9
    ma to sluzyc do pomiaru czasu otwarcia wtryskiwaczy, chodzi o to ze chcialem zeby zbocze narastajace wlaczylo zlicznie impulsow a zbocze opadajace przestalo zliczac, drugi timer mierzy sobie czas ktory potrzebny mi jest do okreslenia ile itrwa czas otwarcia wtryskiwaczy i jaka jest predkosc samochodu....
  • #9 2636974
    greg_matrix
    Poziom 17  
    Posty: 163
    Pomógł: 28
    Ocena: 3
    Więc pewnie chcesz to zrobić na przerwaniach. Podpowiedź juz dostałeś jak to zorganizować na jednym pinie.
    crazy_phisic:
    Cytat:
    można rejestr odpowiadający za przerwanie ustawaiać w czasie wykonywania programu... raz ustawiasz go na zbocze narastające, a potem w obsłudze przerwania na zbocze opadające.
  • #10 2763995
    maniio
    Poziom 14  
    Posty: 149
    Pomógł: 3
    Ocena: 9
    juz to robie w inny sposob, ale teraz mecze sie nad czyms innym... chce zrobic licznik impulsow zewnetrznych, na timerze 1 ale nie za bardzo chce mi to wyjsc... po prostu program nie chce wejsc mi w przerwanie :(

    czy moglby mi ktos napisac co powinienem ustawic poza:
    
    config Timer1 = timer, prescale = 1
    set (pin tam gdzie jest t1)
    (pin gdfzie jest t1) = input
    enable interrupts
    enable timer1
    
    on timer1 zliczanie
    
    zliczanie:
    'cos tam bedzie zliczac
    return
    


    o czym zapomnialem w tym "programie"? bo nie chce mi weujsc w przerwanie od licznika
  • #11 2764227
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    A kolega rozumie różnice pomiędzy pracą w trybie timer i counter ??? ;)
  • #12 2764339
    maniio
    Poziom 14  
    Posty: 149
    Pomógł: 3
    Ocena: 9
    tak, przepraszam za literowke, oczywiscie mam w programie napisane tak:

    config timer1=counter

    reszta jak wyzej

Podsumowanie tematu

✨ Dyskusja dotyczy konfiguracji licznika Timer1 w mikrokontrolerze ATmega32 programowanym w Bascom, tak aby licznik rozpoczynał zliczanie na zboczu narastającym sygnału i zatrzymywał na zboczu opadającym. Zaproponowano rozwiązanie wykorzystujące przerwania zewnętrzne INT0 i INT1 skonfigurowane odpowiednio na zbocze narastające i opadające, które sterują startem i stopem Timer1. Problemem jest ograniczona liczba przerwań zewnętrznych w ATmega32, co wymusza poszukiwanie alternatywnych metod, np. dynamicznej zmiany konfiguracji przerwań w trakcie działania programu lub wykorzystania innego pinu przerwania. Zaproponowano także prostsze rozwiązanie bez przerwań, polegające na monitorowaniu stanu pinu i ręcznym sterowaniu licznikiem, jednak z ograniczeniami w wielozadaniowości programu. Autor planuje zastosowanie do pomiaru czasu otwarcia wtryskiwaczy i prędkości samochodu. W dalszej części dyskusji pojawiły się pytania o konfigurację licznika jako licznika impulsów zewnętrznych (tryb counter) i problemy z wywołaniem przerwania od licznika Timer1, podkreślając konieczność poprawnej konfiguracji trybu pracy i przerwań w Bascom.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA