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

Atmel/ATmega644PA-AU/BASCOM - [BASCOM] Wielokrotne wywołanie przewań

Hypno 27 Lis 2016 22:05 813 14
  • #1 16090350
    Hypno
    Poziom 10  
    Witam Forumowiczów,
    Mam problem z ogarnięciem tematu wywoływania przerwań. Nie jest to problem jak je wywołać ale jak je okiełznać ;-)
    Wygląda to tak:
    Jest układ na Mega644PA-AU. Po I2C współpracuje z zegarkiem PCF8583, oprócz tego linia przerwania z PCF podłączona jest do portu D6 procka. Klawiatura zrealizowana jest na przetworniku ADC (port A0) i drabince rezystorowej. Oczywiście układ robi coś tam nawet skomplikowanego ale nie to jest tematem. Otóż chcę maksymalnie oszczędzać energię akumulatora zasilającego i oczywiście chcę wybudzać układ przerwaniem z PCF o określonej godzinie, układ zrobi co ma zrobić ustawia kolejne budzenie i idzie spać. Jednak w tzw. międzyczasie użytkownik może zechcieć coś z nim zrobić. Zatem konieczne jest aby układ wybudzał się także po naciśnięciu klawisza. I w sumie to wszystko działa ale... właśnie jest jakieś ale. Mianowicie po włączeniu zasilania układ jakby głupiał na instrukcji poprzedzającej wyłączenie przerwań przed wyłączeniem procka "Power Powerdown". W tym przykładzie nie wyłącza podświetlenia "Reset LCDB". Po jego obsłużeniu i ponownym wejściu w uśpienie kolejne wybudzenie jest już OK. Za nic nie mogę dojść o co chodzi. Poniżej ta istotna część kodu realizująca obsługę przerwania.

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #2 16090429
    Konto nie istnieje
    Konto nie istnieje  
  • #3 16090445
    Hypno
    Poziom 10  
    Z rozpaczy do tej pory wypróbowałem chyba wszystkie możliwe konfiguracje PIN i PORT. Niestety teraz także jest tak że po uruchomieniu układu przy pierwszym wejściu w tryb uśpienia nie wyłącza LCDB ale przy każdym kolejnym już i owszem.
  • Pomocny post
    #4 16090465
    Konto nie istnieje
    Konto nie istnieje  
  • #5 16090492
    Hypno
    Poziom 10  
    Pierwszy pomysł nic nie dał.
    Za to drugi rewelacja :D

    Wstawiłem kasowanie flag przerwań tuż przed Enable Interrupts i działa jak należy.

    Czyli coś skopane w kompilatorze Bascoma...

    Wielkie dzięki.
  • #6 16090504
    Konto nie istnieje
    Konto nie istnieje  
  • #7 16090524
    Hypno
    Poziom 10  
    Sprzeczać się nie będę zwłaszcza patrząc od strony asemblera ... Czułem, że coś z tym jest nie tak i zacząłem szukać jak właśnie kasować wywołania przerwań ale z tego co widzę Bascom nie przewiduje tego z "wysokiego" poziomu a na naukę asemblera jestem za stary i leniwy i za dużo złych nawyków z bejzikopodobnych języków... Nawet rymowanka wyszła.
    Tak czy siak dziękuję za pomoc i dokładam dzięki temu kolejnych kilkaset linii kodu do tych paru tysięcy w projekcie :D
  • #8 16090552
    Konto nie istnieje
    Konto nie istnieje  
  • #9 16090617
    dasej
    Poziom 32  
    Witam.

    Pokaż schemat @Hypno.
    Uważam że powinieneś zrezygnować całkowicie z przerwań i zrobić to całkowicie inaczej.
    Na samych Timer-ach.
  • #10 16090635
    dondu
    Moderator na urlopie...
    dasej napisał:
    Uważam że powinieneś zrezygnować całkowicie z przerwań i zrobić to całkowicie inaczej.
    Na samych Timer-ach.

    Brał kolega pod uwagę ten fragment?:

    Hypno napisał:
    Otóż chcę maksymalnie oszczędzać energię akumulatora zasilającego i oczywiście chcę wybudzać układ przerwaniem z PCF o określonej godzinie, układ zrobi co ma zrobić ustawia kolejne budzenie i idzie spać.
  • #11 16090641
    Hypno
    Poziom 10  
    Ano właśnie nie wyobrażam sobie jak to zrobić prockiem bez zewnętrznego źródła przerwania. A co do schematu to wszystko jest jak w notach przykazane. A skoro już procek czai się na przerwanie z RTC to przy okazji może czaić się i na to z klawiatury. Tutaj chyba nawet uA żadnych nie oszczędzę.

    @niveasoft, jednak będę się upierał że jak na język wysokopoziomowy za dużo w Bascomie jest takich kwiatków "niskopoziomowych". Jeżeli muszę sięgać do rejestrów do jednak będę się upierał że coś jest "nieelegancko" delikatnie rzecz ujmując.
  • #12 16090770
    Konto nie istnieje
    Konto nie istnieje  
  • #13 16090832
    Hypno
    Poziom 10  
    Takich podpowiedzi to ja już nie potrzebuję ale dzięki za chęci.
    A tłumacząc umiejętności w ten sposób to zawsze można powiedzieć, że "mogłeś wstawić kawałek asm".... Będę się jednak upierał, że jeżeli język BTP obsługuje przerwania to ma je obsługiwać we własny natywny sposób bez konieczności wstawek asm... Oczywiście moje subiektywne zdanie, podparte kilkoma latami doświadczenia. Parę bugów w Bascomie znalazłem więc mam podstawy do takiego stwierdzenia oczywiście subiektywnego. A że nie jestem geniuszem programowania to także wiem, już obiektywnie ;-)
  • #14 16090897
    Konto nie istnieje
    Konto nie istnieje  
  • #15 16090918
    Hypno
    Poziom 10  
    Heh ... nie przekonacie mnie do końca ale przecież obowiązku nie ma.
    Przecież wszystko tu to operacje na rejestrach więc idąc tym tropem po co wymyślać konstrukcje "wysokopoziomowe".
    OK bo robi się z tego już niepotrzebna dyskusja. Dzięki za pomoc i zamykam.
REKLAMA