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

Atmega8 - Bascom - reset przy wywołaniu funkcji w przerwaniach, jak to naprawić?

flyoe 10 Lis 2012 13:00 1998 10
  • #1 11511501
    flyoe
    Poziom 10  
    Kilka pytań - bo kto pyta nie błądzi :-)
    Niby wszystko ładnie liczyło w przerwaniach - ale tylko do momentu kiedy zacząłem wywoływać Sub lub funkcję - wtedy zaczyna się resetować i zaczyna program od początku co sekundę ?? O co chodzi

    Teraz przestało mi nawet liczyć w przerwaniach. Wchodzi tylko raz i potem lcd się czyści.

    Zamieszczam kod, w którym staram się przetestować wszystkie układy na płytce i działanie timera, zanim zabiorę się za właściwy program.

    Pewnie coś namieszałem ale nie widzę gdzie.

    Tu mam jeszcze pytanie - czy mogę wykorzystać timer, do odpytania co kilka sekund o czas z rtc, co kilkadziesiąt ms o stany przycisków, co kilka sekund o temperatury?
    Z tym ostatnim wiąże się oczekiwanie 750ms po każdym dallasie.
    Jak to rozwiązać?


    Dodam jeszcze , ze w pętli do loop te funkcje działały.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #2 11511864
    Mol
    Poziom 30  
    Nie jestem pewny czy procesor zdąży wykonać to co masz w tym przerwaniu , zanim przyjdzie następne (mam na myśli wszystko ).Program w przerwaniu ma być krótki , chyba że pierwsza linijka jest taka " Disable timer0 " , ale w twoim programie taka instrukcja raczej odpada. I jeszcze jedno , co się dzieje jeżeli podczas transmisji po i2c lub 1Wire przyjdzie przerwanie od timera , bo nie miałem okazji tego testować .
  • #3 11511937
    flyoe
    Poziom 10  
    Ja też nie jestem pewny, ale nie wyobrażam sobie pisania programu obsługującego i2c, 1wire, rs232, rtc, 4094 i 74165 w pętli do loop...?
    Być może do tego jednak dojdzie - jak tak dalej pójdzie jak idzie. :-(
  • #4 11512023
    Mol
    Poziom 30  
    Napisz je w podprogramach , wtedy w każdym miejscu w programie będziesz mógł do nich skoczyć , jeżeli będzie taka potrzeba i program będzie bardziej przejrzysty .
  • #5 11512140
    flyoe
    Poziom 10  
    Doszedłem, że funkcja Getrtctime() resetuje mi układ.
    Wcześniej działała. Jaki może mieć związek z deklaracją timera?
  • #6 11512206
    Mol
    Poziom 30  
    Spróbuj jej na początku dać disable timer0 , a na końcu enable timer0.
  • #7 11512246
    flyoe
    Poziom 10  
    disable czy raczej stop?

    Dodano po 10 [minuty]:

    Niestety - nie pomogło.
    Czy może to mieć związek z tym, że podpiąłem sda i scl (od rtc IN1307)
    do AIN1 i ICP1? (piny 14 i 13 atmegi8)

    Dodano po 18 [minuty]:

    Chyba mam to coś:

    w funkcji Getrtctime()
    zamiast
    Stime = "GODZINA " + Hours + ":" + Minutes + ":" + Seconds
    Getrtctime = Stime
    zrobiłem:
    Getrtctime = "12:00"
    i jest ok

    chyba jakiś problem z typem zmiennej, ale już chyba jestem w domu.
  • #8 11514559
    tehaceole

    Poziom 28  
    flyoe napisał:
    Tu mam jeszcze pytanie - czy mogę wykorzystać timer, do odpytania co kilka sekund o czas z rtc, co kilkadziesiąt ms o stany przycisków, co kilka sekund o temperatury?
    Użyj techniki opisanej tutaj. Co prawda kody są w C, ale z opisu bez problemu wyciągniesz odpowiednie wnioski.
  • #10 11521577
    SylwekK
    Poziom 32  
    Wykonywanie tak długich zadań jak choćby operacje na LCD w przerwaniach aż się prosi o kłopoty. Zrób sobie w przerwaniach kilka timerów programowych i ich zawartość badaj w pętli głównej Do...Loop i to od tych timerów uzależniaj kolejność wykonywania odpowiednich sekwencji (fragmentów) programu.
  • #11 11521769
    flyoe
    Poziom 10  
    Tak - właśnie tak zrobiłem. Dzięki wszystkim za uwagi. Timer działa.
    Teraz mam problem z 4094 - ale to w innym poście.
    Ten wątek uważam za zamknięty.
REKLAMA