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

schizy w BASCOM na Atmega8

mdcs 23 Gru 2010 02:36 1824 13
  • #1 8903165
    mdcs
    VIP Zasłużony dla elektroda
    witam...
    Wykryłem błąd w kompilacji BASCOM-AVR.
    Procek Atmega8.
    Błąd polega na złym zinterpretowaniu instrukcji warunkowej.
    Mam dwie zmienne typu word - A oraz B. A jest ustalana na stałę (np.100) natomiast B rośnie od wartości 20 w górę).
    Warunek:
    if B>A then goto xxx

    i teraz rodzyneczek:
    - jeśli B rośnie od 20 w górę to skok do xxx następuje jak przekroczy wartość 100
    - jeśli B rośnie od 90 w górę to skok następuje od razu!

    Zmienne A oraz B wywalam na LCD tuż przed warunkiem i jak np. B=90, A=100 następuje skok!
    Może mi ktoś wyjaśnić na czym polega muka w kompilatorze?
    Używam wersji 1.11.9.5

    Nie umiem tego wyjaśnić. To jakaś dziura.
  • #2 8903262
    piotr5000
    Poziom 21  
    Pokaż program. Jakiego typu są zmienne A i B .
    Czy jeśli dasz warunek
    c = a-b
    if c > 0 then ....

    też jest źle.
  • #3 8903655
    mdcs
    VIP Zasłużony dla elektroda
    zmienne A oraz B są, jak już pisałem, typu Word.
    Cały algorytm wkleić? (ma z 10stron).

    aha, może to ważne - schizy zaczęły się dziać mniej więcej jak przekroczyłem 50-60% pojemności flasha. Czy to ma jakiś związek z tym, że wersja demo ma ograniczenie do 4kb kodu? Tylko, że ja mam pełną zarejestrowaną wersję, a kompilator pracuje normalnie przy długości kodu 6kb i nie wyświetla żadnej informacji o ograniczeniach.

    Poza tym jak zamienię w tym warunku na if B=A zawsze działa OK....czyli jak B zrówna się z A następuje skos....i nigdy wcześniej jak w poprzednim przypadku.
  • #4 8903727
    piotr5000
    Poziom 21  
    Miałem wcześniejszą wersje baskoma i był problem z porównaniem .
    Zachowywał się jakby ignorował część bitów przy porównaniu ,
    dlatego stosowałem zmienną pomocniczą C ( C = A-B) i sprawdzałem czy róznica
    A-B ( czyli C ) jest większa ( mniejsza ) od 0 wtedy było OK

    Spróbuj tą metodą:!:
  • #5 8903828
    Wojtek75
    Poziom 24  
    Dorzucę coś od siebie. W tiny24 PortB jest czterobitowy tymczasem kompilator w najnowszej wersji (2.0.2.1) u mnie bez problemu łyka coś takiego nie generując żadnego błędu.
    $regfile = "ATtiny24.DAT"
    $crystal = 1000000
    
    Config Pinb.7 = Input     '???
    P1 Alias Pinb.7           '???
    Set Portb.7               '???
    Config Porta.7 = Output
    Led_red Alias Porta.7
    Led_red = 0
    
    Do
       Debounce P1 , 0 , Tog , Sub
    Loop
    End                                                                             'end program
    
    Tog:
       Toggle Led_red
    Return

    Plik DAT wydaje się być poprawny. Jeżeli ktoś może to niech to sprawdzi u siebie na tej samej lub innej wersji kompilatora.
  • #6 8903862
    mdcs
    VIP Zasłużony dla elektroda
    Już kiedyś pisałem o błędach bascoma w obsłudze przerwań (raz wywołane jest potem cyklicznie generowane pomimo, że czynnik wywołujący przerwanie już zanikł, bo bascom zapomina przy kompilacji kodu o fladze w rejestrze przerwań). Błędów jest jak się okazuje więcej. Szkoda tylko, że siedzi się nad tym czasami kilka godzin...bo uznanie błędu kompilacji to zawsze ostateczność.
    Zainstaluję nowszą wersję i zobaczę czy poprawnie interpretuje porównanie w warunku oraz sprawdzę teorię kolegi piotr5000.
    Dzięki.
  • #7 8903934
    mirekk36
    Poziom 42  
    mdcs napisał:
    Już kiedyś pisałem o błędach bascoma w obsłudze przerwań (raz wywołane jest potem cyklicznie generowane pomimo, że czynnik wywołujący przerwanie już zanikł, bo bascom zapomina przy kompilacji kodu o fladze w rejestrze przerwań).


    Ale tu Bascom nie ma nic do rzeczy, flaga wystąpienia przerwania jest kasowana automatycznie przez procesor gdy włączona jest programowa obsługa przerwania. Zatem to raczej jakieś błędy we własnym programie chyba?

    mdcs napisał:
    Błędów jest jak się okazuje więcej. Szkoda tylko, że siedzi się nad tym czasami kilka godzin...bo uznanie błędu kompilacji to zawsze ostateczność.


    Nie mniej jednak Bascom rzeczywiście co i rusz w którejś wersji posiada jakieś drobne lub większe błędy, ale nie ma co się dziwić wciąż ewoluuje. Więc coś za coś.

    Ale czy przypadkiem zamiast wciąż walczyć z błędami Bascoma nie lepiej zacząć uczyć się pisać programy w C? ;)
  • #8 8904075
    mdcs
    VIP Zasłużony dla elektroda
    Bascom powinien po wywołaniu procedury obsługi przerwania skasować flagę a tego nie robi...i po obsłużeniu przerwania znów jest ono natychmiast wywoływane i program się zapętla. Trzeba ręcznie ustawić flagę w rejestrze GIFR.
    Wiem, że C jest dużo mniej problematyczny...sam kompilator ma też mnie roboty, bo to język niższego rzędu jak Basic Bascom, ale ja rzadko coś na uC robię i póki co Bascom mnie zadowalał.
    Zobaczę dziś jak sprawuje się najnowsza wersja kompilatora.
  • #9 8906109
    piotr5000
    Poziom 21  
    Ja korzystałem z przerwania INT0 ( najczęsciej ) i nie miałem problemu
    Nie miałem też problemu z Timer0 i Timer1 .
    Procesor który programuje to ATmega16 (lubię go).

    A jeśli chodzi o TINY 24 to Port B jest 4-ro bitowy ale DATA REGISTER jest 8-mio bitowy.
    Bity 4...7 są podane jako tylko odczyt.
    Podstawiając wartość portu Pod zmienną typu BYTE ( bo mniejszej nie ma )
    otrzymasz wartości 0...15 .
    Jest to pewne uproszczenie kompilatora i wydaje mi się że jak do portu
    podstawisz 16 to odczytasz 0

    Nie mogę tego sprawdzić , ale tak wynika z noty .
    Jeśli tak jest to czasami działanie programu może kogoś wprowadzić w zdumienie , bo zwiększając jakąś zmienną i podstawiając ją do portu nagle
    się wyzeruje ( stan portu oczywiście )

    Procesor zawsze wykona dokładnie to co My jemu każemy ( taki idealny niewolnik )
    A czy My każemy mu zrobić coś świadomie czy nie to już zupełnie inna bajka
  • #10 8906634
    Wojtek75
    Poziom 24  
    Piotr jak się spojrzy do noty to wszystko staje się jasne. Tylko ilu zaczynających przygodę z uC to robi?
    A przecież to:
    Config Pinb.7 = Input
    P1 Alias Pinb.7
    Set Portb.7

    w kodzie, który podałem wyżej jest w zasadzie bez sensu.
    A jak się przeanalizuje Hex'a to okazuje się, że też w nim ląduje:
    +0000002A:   98BF        CBI       0x17,7         Clear bit in I/O register
    +0000002B:   9AC7        SBI       0x18,7         Set bit in I/O register

    Dla mnie powinno być to sygnalizowane jako błąd lub, ostrzeżenie (wide GCC) żeby od razu zwrócić uwagę na to, że coś robimy nie tak.
    Zawodowo też jestem na zupełnie innym biegunie, elektronika to dla mnie hobby, ale gdyby trzeba było zająć się tym na poważnie to raczej nie ma innej drogi niż C.
  • #11 8906893
    mirekk36
    Poziom 42  
    mdcs napisał:
    Bascom powinien po wywołaniu procedury obsługi przerwania skasować flagę a tego nie robi...i po obsłużeniu przerwania znów jest ono natychmiast wywoływane i program się zapętla. Trzeba ręcznie ustawić flagę w rejestrze GIFR..


    Ale posłuchaj, Bascom nie wywołuje żadnej procedury obsługi przerwania. To ty piszesz ją w Bascomie i jest ona wywoływana automatycznie przez procesor gdy nastąpi przerwanie. Bascom nie ma tu nic do rzeczy.

    W związku z powyższym, również Bascom NIE MUSI kasować żadnej flagi tego przerwania. I tego nie robi. Bo rozkaz powrotu z przerwania RETI (a tak jest po kompilacji w asemblerze) powoduje, że procesor SAM kasuje tę flagę przerwania.

    Więc nie wiem skąd ci się akurat wzięło, że to niby Bascom ma kasować jakieś flagi przerwań. Nie piszę tego żeby się z tobą spierać, ale może przy okazji coś ci się wyjaśni na podstawie tej dyskusji.
  • #12 8908110
    Fredy
    Poziom 27  
    A wracając do początku dyskusji myślę że problem bierze sie ze zbyt małego zadeklarowanego stosu. Szczególnie jeśli problemy wystąpiły nagle po przekroczeniu pewnej ilości programu.

    Umieść na początku programu :
    $hwstack = 100
    $framesize = 100
    $swstack = 100

    i spróbuj jeszcze raz
  • #13 8977838
    mdcs
    VIP Zasłużony dla elektroda
    Umieszczenie dyrektyw powiększających stos na początku programu nic nie zmieniło.
    Skompilowanie najnowszą wersją Bascom-AVR też nic nie pomogło.
    Ręce opadają...
  • #14 9117979
    SylwekK
    Poziom 32  
    Pisałeś o tym do Marka Albertsa ? Myślę, że jeśli by wiedział o błędzie (i dokładnej sytuacji w jakiej on występuje) to by to chyba poprawił...
REKLAMA