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 mierzyć impuls na ATMEGA32 bez blokowania procesora?

PiotrLotnik 16 Maj 2007 22:17 3420 23
REKLAMA
  • #1 3892164
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Witam,

    Chce mierzyć długość trwania impulsu (stan niski) przy użyciu ATMEGA32.
    Napisałem poprawnie działający programik, problem w tym, że w czasie pomiaru impulsu procesor nie może robić nic innego.
    Do wykrycia stanu niskiego użyłem przerwań z INT1 a do odmierzania czasu trwania impulsu użyłem Timer2.

    Czy jest jakiś sposób, żeby mierzyć czas trwania impulsu bez wstrzymywania pracy uC?

    On Int1 Pomiar_impulsu
    Config Timer2 = Timer , Prescale = 2


    Pomiar_impulsu:
    Disable Int1

    Start Timer2
    Do
    Loop Until Pind.3 = 1
    Stop Timer2

    Enable Int1
    Return

    Próbowałem znaleść jakieś inne rozwiązanie ale nic nie moge wymyśleć, od amatorek ze mnie :)
    Pozdrawiam
    Piotr
  • REKLAMA
  • #2 3892187
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    PiotrLotnik napisał:
    Do wykrycia stanu niskiego użyłem przerwań z INT1 a do odmierzania czasu trwania impulsu użyłem Timer2.
    Piotr
    a do wykrycia zbocza narastającego zastosuj INT0 i po kłopocie.
  • #3 3892850
    Ch.M.
    Poziom 27  
    Posty: 1009
    Pomógł: 62
    Ocena: 15
    Użyj przerwań a nie robisz je programowo
  • #4 3894407
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Ch.M. fajno, dzieki za rade.
    Problem w tym, że to co spłodziłem do tej pory to wszystko na co mnie stać. Od taki amatorek ze mnie :)

    Zrób to na przerwaniach!!! tylko jak?? Prosiłbym o jakiś konkret, przykład, wskazówkę jak to zrobić.

    Pozdrawiam
  • #5 3894936
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    PiotrLotnik napisał:
    Ch.M.
    Zrób to na przerwaniach!!! tylko jak?? Prosiłbym o jakiś konkret, przykład, wskazówkę jak to zrobić.
    Pozdrawiam
    Czegoś tu nie rozumiem mówisz że używasz przerwań na INT1 a jak jest mowa o przerwaniach, to pisze że nie wiesz jak !!! coś kręcisz :cunning:
  • REKLAMA
  • #6 3895003
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Ch.M. napisał:
    Użyj przerwań a nie robisz je programowo


    Kolega Ch.M. napisał ze mam użyć przerwań, no wiec sie pytam jak to zrobić?
    W układach AVR Mega wyzwalanie przerwania linii INT0-INT3 odbywa się na skutek stwierdzenia niskiego poziomu (LOW LEVEL) i nie jest on konfigurowalny.
    Wiec jak mam wykryć stan wysoki żeby zatrzymać zliczanie TIMERa?

    Piotr
  • #7 3905400
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    PiotrLotnik napisał:
    W układach AVR Mega wyzwalanie przerwania linii INT0-INT3 odbywa się na skutek stwierdzenia niskiego poziomu (LOW Piotr
    A gdzie takich bzdur się naczytałeś ? Zerknij na stronę 64,65 do "External Interrups" dla ATMega32. INT0 i INT1 są na pewno w pełni konfigurowane.
  • #8 3905471
    251mz
    Poziom 18  
    Posty: 384
    Pomógł: 8
    Ocena: 8
    przerwania moga byc wyzwalane zmianą stanu lub poziomem.........

    apropo mam pytanie ze swojej beczki bo jakos nie moge do tego doleciec w dataszicie.
    czy jesli amega bedzie miała wyłaczone głobalne zezwolenie na przerwania i wystapi wtedy żadanie przerwania to czy zostanie ono gdzies odnotowane aby mozna było je wykonac po właczeniu globalnego zezwolenia?
    mowa o żądaniu przerwania z zewnatrz INTx
  • REKLAMA
  • #9 3905693
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    flaga powinna sie ustawić, ale procek nie pownien skoczyć do jej obsługi.
    Trzeba by to było empirycznie badać
  • #10 3906364
    251mz
    Poziom 18  
    Posty: 384
    Pomógł: 8
    Ocena: 8
    no własnie tylko o to mi chodziło .....
    zawsze po odblokowaniu przerwan mozna sprawdzic flagi i wtedy wykonac to co mialo wykonac przerwanie ,
  • #11 3906396
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    hmmm i tu wychodzi dziwna sprawa. Tak na chłopski rozum to jesli po odblokowaniu przerwania jakaś flaga będzie ustawiona to powinna zostać wykonana procedura jego obslugi, a tak sie chyba nie dzieje. Nic tylko sprawdzić :)
  • REKLAMA
  • #12 3906473
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    Jeśli wyłączona jest globalna flaga przerwań nie zostanie nigdzie zapisana informacja o zajściu przerwania, istnieje prosta relacja AND między tymi rejestrami i tylko gdy jest spełniona, ustawiane są odpowiednie bity konkretnych przerwań.

    Cytat:

    The Global Interrupt Enable bit must be set for the interrupts to be enabled. The individual
    interrupt enable control is then performed in separate control registers. If the Global
    Interrupt Enable Register is cleared, none of the interrupts are enabled independent of
    the individual interrupt enable settings. The I-bit is cleared by hardware after an interrupt
    has occurred, and is set by the RETI instruction to enable subsequent interrupts. The Ibit
    can also be set and cleared by the application with the SEI and CLI instructions, as
    described in the Instruction Set Reference
  • #13 3906936
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    GienekS napisał:
    PiotrLotnik napisał:
    W układach AVR Mega wyzwalanie przerwania linii INT0-INT3 odbywa się na skutek stwierdzenia niskiego poziomu (LOW Piotr
    A gdzie takich bzdur się naczytałeś ? Zerknij na stronę 64,65 do "External Interrups" dla ATMega32. INT0 i INT1 są na pewno w pełni konfigurowane.


    Wyczytałem w Helpie BASCOMa

    Uwaga! W układach AVR Mega wyzwalanie przerwania linii INT0-INT3 odbywa się na skutek stwierdzenia niskiego poziomu (LOW LEVEL) i nie jest on konfigurowalny.

    (c) Zbigniew Gibek, 2002-2005 (c) MCS Electronics, 1999-2005


    A wpisanie Config INT1 = CHANGE wywala błąd.
    Piotr
  • #14 3907005
    251mz
    Poziom 18  
    Posty: 384
    Pomógł: 8
    Ocena: 8
    to jak zrobic aby wykryc czy nastpaiło żądanie przerwania na INTn jesli w tym czasie kiedy ono nadejdzie procek nie moze go wykonac??
  • #15 3907061
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    PiotrLotnik napisał:
    GienekS napisał:
    PiotrLotnik napisał:
    W układach AVR Mega wyzwalanie przerwania linii INT0-INT3 odbywa się na skutek stwierdzenia niskiego poziomu (LOW Piotr
    A gdzie takich bzdur się naczytałeś ? Zerknij na stronę 64,65 do "External Interrups" dla ATMega32. INT0 i INT1 są na pewno w pełni konfigurowane.


    Wyczytałem w Helpie BASCOMa

    Uwaga! W układach AVR Mega wyzwalanie przerwania linii INT0-INT3 odbywa się na skutek stwierdzenia niskiego poziomu (LOW LEVEL) i nie jest on konfigurowalny.

    (c) Zbigniew Gibek, 2002-2005 (c) MCS Electronics, 1999-2005


    A wpisanie Config INT1 = CHANGE wywala błąd.
    Piotr


    Nie wprowadzaj w błąd, jeśli czegoś nie wiesz to sprawdź w dokumentracji producenta a nie w "przedrukach".
    Jak mierzyć impuls na ATMEGA32 bez blokowania procesora?

    A w BascomieAVR polecenie Config nie ma parametru Change tylko opcje "LOW LEVEL ", "FALLING" i "RISING".
  • #16 3907116
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Witam,
    Nie mam zamiaru wykłucać się co jest w HELP BASCOMA a czego nie.

    W błąd zostałem wprowadzony właśnie przez bascom więc i nie sprawdzałem w nocie producenta (mój błąd).
    No ale po to jest to forum, żeby ludzi małodoświadczonych (jak ja) wyprowadzać z błędu.

    Dzięki
    Piotr
  • #17 3907242
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    PiotrLotnik napisał:
    Witam,
    Nie mam zamiaru wykłucać się co jest w HELP BASCOMA a czego nie.

    W błąd zostałem wprowadzony właśnie przez bascom więc i nie sprawdzałem w nocie producenta (mój błąd).
    No ale po to jest to forum, żeby ludzi małodoświadczonych (jak ja) wyprowadzać z błędu.

    Dzięki
    Piotr

    Takich "kwiatków" w Bascomie jest dużo więcej :(
    Np.
    crazy_phisic napisał:

    A w BascomieAVR polecenie Config nie ma parametru Change tylko opcje "LOW LEVEL ", "FALLING" i "RISING".

    To też nie jest prawdą , bo już w Bascom v1.11.7.4 można użyć opcji Change przy konfiguracji przerwań zewnętrznych , mimo że manual twierdzi co innego.Można to oczywiście sprawdzić w kodzie , ale ja wolę przyglądać się takim kwiatkom "bliżej" , czyli jak na obrazku ;)
    Jak mierzyć impuls na ATMEGA32 bez blokowania procesora?

    Piotrek
    PS
    crazy_phisic napisał:

    Jeśli wyłączona jest globalna flaga przerwań nie zostanie nigdzie zapisana informacja o zajściu przerwania, istnieje prosta relacja AND między tymi rejestrami i tylko gdy jest spełniona, ustawiane są odpowiednie bity konkretnych przerwań.

    Z powyższym twierdzeniem , również nie mogę sie zgodzić :(
  • #18 3908683
    251mz
    Poziom 18  
    Posty: 384
    Pomógł: 8
    Ocena: 8
    to jak zrobic aby wykryc czy nastpaiło żądanie przerwania na INTn jesli w tym czasie kiedy ono nadejdzie procek nie moze go wykonac??
  • #19 3908699
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    :arrow:zumek
    Cytat:
    Z powyższym twierdzeniem , również nie mogę sie zgodzić

    I bardzo dobrze ;) tylko proszę o informację które potwierdzą moją "herezję".

    Pozdrawiam
    Jarek
  • #20 3908700
    Ch.M.
    Poziom 27  
    Posty: 1009
    Pomógł: 62
    Ocena: 15
    badasz stan rejestru GICR a konkretniej trzech najbardziej znaczących bitów.
    Zainstaluj sobie AVR studio tam wszystko widzisz jak na dłoni (nie wiem jak bascom) i nie ma tylu błedów, zmieniasz to co chcesz a nie to co ktoś kiedyś wymyślił. Datasheet nie gryzie też
    Pozdrawiam :)
  • #21 3908781
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    Napewno GICR? Służy on tylko do włączenia konkretnego przerwania. W rejestrze GIFR znajdują się flagi zgłoszenia przerwania.
  • #22 3908786
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Ok, wracając do tematu to spłodziłem coś takiego i wygląda na to, że działa.

    Mcucr = &B00000100
    On Int1 Pomiar_impulsu

    Pomiar_impulsu:
    If Pind.3 = 0 Then
    Start Timer2
    Else
    Stop Timer2
    Czas_impulsu = Timer2
    Timer2 = 0
    End If
    Return

    Dzięki za pomoc

    Piotr
  • #23 3908826
    Ch.M.
    Poziom 27  
    Posty: 1009
    Pomógł: 62
    Ocena: 15
    Oj przepraszam masz rację, GIFR odpytujesz
    Pamiętaj, ze przy pollingu musisz pozniej ręcznie wyzerowac flagę :)
  • #24 3911167
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    crazy_phisic napisał:
    ...I bardzo dobrze ;) tylko proszę o informację które potwierdzą moją "herezję".

    Pozdrawiam
    Jarek

    Proszę bardzo ;)
    • Bit 7 – INTF1: External Interrupt Flag 1
    When an edge or logic change on the INT1 pin triggers an interrupt request, INTF1
    becomes set (one). If the I-bit in SREG and the INT1 bit in GICR are set (one), the MCU
    will jump to the corresponding Interrupt Vector. The flag is cleared when the interrupt
    routine is executed. Alternatively, the flag can be cleared by writing a logical one to it.
    This flag is always cleared when INT1 is configured as a level interrupt.


    Jeśli na pinie INT1 wystąpi zdarzenie przewidziane w ustawieniach bitów ISC10 ISC11 , to flaga INTF1 zostanie ustawiona , bez względu na stan INT1 i I . Żeby procesor wykonał procedurę przewidzianą dla tego przerwania , to musi być spełniony warunek , o którym byłeś łaskaw wspomnieć . Jeśli więc INTF1 AND INT1 AND I = 1 , to procek:
    a)zapamięta na stosie adres następnej instrukcji po aktualnie wykonywanej
    b)załaduje do licznika PC adres wektora INT1
    c)skasuje flagę INTF1 i flagę I.
    d)kontynuuje pobieranie i wykonywanie rozkazów.

    Piotrek

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy pomiaru długości impulsu (stanu niskiego) na mikrokontrolerze ATMEGA32 bez blokowania procesora. Autor używa przerwania INT1 do wykrywania stanu niskiego oraz Timer2 do odmierzania czasu trwania impulsu, jednak obecna implementacja wymaga zatrzymania pracy procesora podczas pomiaru. Wskazano, że przerwania zewnętrzne INT0 i INT1 w ATMEGA32 są w pełni konfigurowalne i mogą być wyzwalane na zbocze narastające, opadające lub zmianę stanu, co pozwala na pomiar impulsu bez blokowania CPU. Omówiono również kwestie związane z flagami przerwań w rejestrach GIFR i GICR oraz ich obsługą, podkreślając, że przerwania mogą być wykrywane i obsługiwane asynchronicznie bez konieczności zatrzymywania głównej pętli programu. Przykładowy kod pokazuje konfigurację rejestru MCUCR do wykrywania zbocza oraz obsługę przerwania INT1, które uruchamia i zatrzymuje Timer2 w zależności od stanu pinu, umożliwiając pomiar czasu trwania impulsu bez blokowania procesora. Dyskusja zawiera także uwagi dotyczące nieścisłości w dokumentacji i środowisku BASCOM oraz zalecenia korzystania z dokumentacji producenta i AVR Studio do dokładnej konfiguracji i debugowania.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA