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

Przenoszenie kodu z Bascom do AVR GCC - obsługa EEPROM i timera

stożek 04 Sty 2024 20:23 261 3
  • #1 20891656
    stożek
    Poziom 11  
    Mam mały problem - nie potrafię przenieśc kodu z bascoma do avr c (eclipse).
    Tzn, wiem ze nie przeniosą go 1:1 chodzi mi raczej o ogólne zasady, szkielet:
    chodzi o zapis do pamięci eeprom stanu licznika - licznik sie zmienia przy pomocy przycisków góra/dół - przy wyłaczeniu zasilania oczywiście jego zawartośc jest kasowana. Oczywiście zapis przy każdej zmianie nie ma sensu - zbyt szybko "zajechałbym" pamieę. Wymuśliłem wiec taką procedurę aby przy użyciu timera dodać zwłokę minuty na zapis - jeżeli w ciągu minuty stan licznika sie nie zmieni to następuje zapis - tutaj wykrywanie zmiany było ponowne naciśnięcie przycisków.
    W bascomie to działało bardzo dobrze, w c nie chce.
    Tu kod BS:
    Flaga:
    Incr Us
    If Us = 117 Then
    Us = 0
    Incr Ms
    If Ms = 60 Then
    Ms = 0
    Writeeeprom Liczba , 1
    Stop Timer0
    End If
    End If
    Return
    "Flaga" to podprogram wyzwalany od timera 0 z preskalerem 256 - zegar 8MHz.
    Zmienne Ms i Us są zerowane przy wciśnięciu przycisku, potem jest załaczany timer poleceniem Start Timer0

    Problem mam z c - jest inna struktura programu, kiedy umieściłem fukcję start_timer(); w pętli if(button_press) itd to przestało mi działać zliczanie, wyśwetlanie wyniku etc.
    Potrzebuje tylko nakierowania jak to rozmieścić w programie - inicjację timera, właczenie przerwań właczenie timera odliczenie czasu zapis wyłaczenie timera w pętli while(1) mam tylko obsługę klawiszy i wyświetlacza. Zapis eepromu musi sie odbywać niejako w tle pracy głównej pętli.
  • #2 20891727
    tmf
    VIP Zasłużony dla elektroda
    Jeśli masz do dyspozycji timer to zmień podejście do rozwiązania problemu. Ustaw timer tak, aby przepełniał się np. po minucie. To bezpośrednio zapewne nie jest możliwe (długość licznika), ale np. ustaw tak, aby przerwanie ovf występowało np. co 1s, 100 ms, obojętnie. W handlerze tego przerwania umieść dodatkową zmienną zliczającą te przepełnienia, tak, aby po osiągnięciu zadanego czasu następował zapis do EPROM. Czyli przenosisz to co zrobiłeś z pętli do ISR. Z kolei w programie, po każdej modyfikacji licznika, zerujesz zmienną liczącą tyknięcia timera w ISR, w ten sposób restartujesz czas zliczania. Wrzuć swój kod (w znacznikach syntax, bo tak jest to nieczytelne) i będzie można coś więcej powiedzieć.
  • #3 20891728
    gps79
    Poziom 35  
    Błąd jest po stronie programisty, ale nic więcej nie można powiedzieć ze względu na to, że nie mamy wglądu w kod źródłowy programu, a program, który zacytowałeś nie będzie działał z kompilatorem C, ze względu na to, że jest napisany w Basicu.
    Ogólna podpowiedź jest taka, że jeśli zrobisz tak samo w C, jak było w działającym kodzie Basica, to też będzie działać. Nie obejdzie się bez przeczytania odpowiedniego rozdziału z datasheet mikrokontrolera dotyczącego timera, którego chcesz użyć.
  • #4 20893704
    bart-projects
    Poziom 29  
    @stożek - normalnie w Bascom nie jest potrzebna komenda Start Timer0 bo jest on uruchamiany od razu podczas konfiguracji. Używa się tej komendy tylko jeśli poprzednio zatrzymałeś Timer poprzez Stop Timer0. Rozumiem, że zatrzymujesz timer.
    Tak więc zatrzymywanie timera to zabranie mu źródła taktowania.
    Bascomowe komendy moża wiec rozumieć tak:
    Start Timer0 -> TCCR0 = &B0000_0100 'Timer tryb Normal z preskalerem 256
    Stop Timer0 -> TCCR0 = &B0000_0000 'brak taktowania to timer stoi.

    Nie napisałeś jaki to mikrokontroler więc podałem dla Atmega32.
    Zapis w C jest nieomal identyczny 0b00000100. Można robić te wygibasy na bitach (<<CS2) i tak dalej ale tutaj to przerost formy nad treścią.

    Przerwanie od przepełnienia timera włacza się bitem 0 w TIMSK
    Przenoszenie kodu z Bascom do AVR GCC - obsługa EEPROM i timera

    Więc znów TIMSK = &B0000_0001 'i gotowe
    Nie zapomnij włączyć przerwań SEI.
REKLAMA