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

[BASCOM] ATmega644PA-AU - dziwne zachowanie przy $crystal=12000000 w BASCOM

Hypno 13 Cze 2016 16:06 1047 29
  • #1 15739858
    Hypno
    Poziom 10  
    Witam,
    Mam taki przypadek. Układ zmontowany na ATmega644pa i pracujący na zegarze 12MHz. Problem polega na tym, że jak w dyrektywach BASCOMa ustawię $crystal=12000000 to układ zachowuje się dziwnie (jakby mu się stos przepełniał) natomiast jak ustawię coś innego np (10 lub 16MHz) a wlutowany jest dalej zegar 12MHz to układ działa poprawnie.... (fusy Low=FF, High=DF, Extended=FF)

    Spotkał się ktoś z Was z czymś takim?
  • #2 15741830
    Konto nie istnieje
    Poziom 1  
  • #3 15741844
    Hypno
    Poziom 10  
    Na szczęście dla mnie w tym projekcie nie jest istotne czy wpiszę 12 czy 16MHz bo z opóźnień procka praktycznie nie korzystam, więc czy wait 1 będzie trwał 1 sekundę czy 1,2 jest mało ważny, a wszystko co związane z czasem robię na PCF8583 i przerwaniach alarmu. Znaczy pracuję na godzinach i minutach a nie na ms czy us.
    Projekt dość (zegar PCF8583, EEPROM 2MBit AT24cm02, ADC HX711, GSM modem M590E, karta SD) spory łącznie ok. 10k lini kodu. Wiem, że następny taki lub większy projekt będzie już nie na AVR tylko na ARMie i oczywiście nie na BASCOM. Polecam tym którzy nie znają dobrze C i nie chcą tygodni poświęcać na rozgryzanie konfiguracji, i tym co chcą się przesiąść z BASCOMa, do skorzystania z platformy MBED.
  • #4 15742243
    Konto nie istnieje
    Konto nie istnieje  
  • #5 15742860
    Hypno
    Poziom 10  
    Wersja to 2.0.2.1 ale kodu nie udostępnię bo to kod produkcyjny że tak powiem. Geniuszem programowania na pewno nie jestem ale jakoś za cholerę nie mogę sobie wyobrazić, żeby z powodu mojej nieumiejętności programowania pojawiły się takie problemy.
  • #6 15743217
    Konto nie istnieje
    Poziom 1  
  • #7 15743608
    Konto nie istnieje
    Konto nie istnieje  
  • #8 15743741
    Fredy
    Poziom 27  
    A nie jest tak, że watchdog Ci wywala program?
    Że masz gdzieś na granicy kasowanie go i dla jednej częstotliwości zdąży, a dla innej już nie?
  • #9 15743742
    Hypno
    Poziom 10  
    A proszę bardzo wersję:
    Compiler version: 2.0.2.1
    Compiler build: 2.0.2.1.0
    IDE version: 2.0.2.0

    Windows OS: Windows 7 Proffesional SP1

    Oryginał legalny nie ma się czego wstydzić. Timera używam tylko jednego z odmierzaniem około 5 sekund.
    
    'konfigurujemy timer wywoływany co jakiś czas (patrz procedura)
    Config Timer0 = Counter , Prescale = 1024
    Enable Interrupts
    On Timer0 Co_jakis_czas
    Enable Timer0
    Dim Licznik As Word


    ....
    
    Co_jakis_czas:
       'definiujemy procedurę odmierzającą mniej więcej 4s
       'i wywołującą odpowiednie funkcje
    
       Stop Timer0
       Disable Interrupts
       Timer0 = 1023
       Incr Licznik
    
       If Licznik = 15000 Then
          Licznik = 0
          Call Pomiary
       End If
    
       Enable Interrupts
       Start Timer0
    
    Return


    Pomiary trwają kilkadziesiąt milisekund. Absolutnie nie ma mowy żeby się nałożyły sprawdzane testowane.

    Poza tym tylko dosłownie kilka opóźnień typu waitms przy odczycie I2C czy klawiaturze. Żadnych wyrafinowanych pętli odczytu z jakichś portów z krytycznym odmierzaniem czasu.

    Watch dog'a nie używam....

    Piszę powyższe już bardziej dla sportu bo zmieniłem kwarc i po zawodach.
  • #10 15743867
    kamyczek
    Poziom 38  
    Dla mnie byka masz w przerwaniu timer0=1023 ? Ten zegar jest 8bitowy więc brana jest pod uwagę wartość młodszego bajtu w tym przypadku 255, Przepełnienie zegara następuje po jednym impulsie taktującym timer0 czyli po 1024 impulsach zegarowych (prescaler) nie masz tam 5s tylko $crystal/1024 . W przerwaniach unikał bym wywołania call i if . Ustaw flagę ewentualnie zmień jakiś wskaźnik reszta w pętli głównej programu .
  • #11 15743889
    Hypno
    Poziom 10  
    Hmmm układ może nie wiedzieć o tym co piszesz :-) , bo wywoływane jest to prawidłowo co odpowiedni przedział czasu.
  • #12 15744154
    Konto nie istnieje
    Poziom 1  
  • #13 15744171
    Konto nie istnieje
    Konto nie istnieje  
  • #14 15744231
    Hypno
    Poziom 10  
    $regfile = "m644pdef.dat"                                   ' definiujemy układ
    $crystal = 12000000                                         ' ustawiamy prędkość zegara
    $baud = 19200                                               ' ustawiamy prędkość transmisji
    $hwstack = 200                                              ' ustawiamy wielkość stosu
    $swstack = 200
    $framesize = 80
    
    'definiujemy podłączenie i rodzaj wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    Config Lcd = 16 * 2
    
    Config Pind.5 = Output
    Set Portd.5
    Led Alias Portd.5
    Wait 3
    Reset Led
    
    Config Pina.2 = Output
    Set Porta.2
    Lcdb Alias Porta.2
    
    'konfigurujemy timer wywoływany co jakiś czas (patrz procedura)
    Config Timer0 = Counter , Prescale = 1024
    Enable Interrupts
    On Timer0 Co_jakis_czas
    Enable Timer0
    Dim Licznik As Word
    Start Timer0
    
    Dim S As Byte
    Dim M As Byte
    Dim G As Byte
    Dim T As String * 16
    
    Do
    
       For G = 0 To 23
          For M = 0 To 59
             For S = 0 To 59
    
                T = Str(g) + ":"
                T = T + Str(m) + ":"
                T = T + Str(s)
                Locate 1 , 1
                Lcd T
                Wait 1
    
             Next S
          Next M
       Next G
    
    Loop
    
    End
    
    Co_jakis_czas:
       'definiujemy procedurę odmierzającą mniej więcej 4s
       'i wywołującą odpowiednie funkcje
    
       Stop Timer0
       Disable Interrupts
       Timer0 = 1023
       Incr Licznik
    
       If Licznik = 45000 Then
          Licznik = 0
          'Call Pomiary
          Toggle Led
       End If
    
       Enable Interrupts
       Start Timer0
    
    Return


    Proszę bardzo skompilowane i działające. Co ja Wam powiedzieć więcej... mogę filmik podesłać z działania ale też powiecie że zrobione w Photoshopie :-)

    A z wywołaniem Call w przerwaniu macie rację, poprawiam.
  • #15 15744254
    Konto nie istnieje
    Poziom 1  
  • #16 15744269
    Hypno
    Poziom 10  
    Nie no proszę nie w ten sposób. Jak napisałem rozumiem co mówicie ale widzę też jak zachowuje się układ. I sam widziałem jak zmiana 12 czy 16 MHZ w dyrektywach robiła różnicę. Jak jednak widzicie mimo pewnego braku logiki działa jak oczekiwałem.
    Sam również już spotykałem się z innymi niedoróbkami BASCOMa np. w definicjach procków (właśnie 644p)
    Na pewno to co napisaliście wezmę pod uwagę ale nie traktujcie mnie jak jakiegoś osiołka co to nie wie o czym pisze. Dyskusja już jednak mocno odbiegła od tematu i chyba czas ją zakończyć.
  • #17 15744276
    Konto nie istnieje
    Poziom 1  
  • #18 15744288
    Hypno
    Poziom 10  
    Ależ oczywiście że ustawię, tym przykładem chciałem jedynie pokazać że działa tak jak jest. Szukam właśnie w nocie atmelowskiej info o licznikach. I tak szczerze mówiąc napisane jest że są dwa 8 bitowe i jeden 16. Nie widzę info który jaki jest, czy 16 bitowy jest ten 0, 1 czy 2. Więc może tu jest figiel.
  • #19 15744296
    Konto nie istnieje
    Poziom 1  
  • #20 15744303
    Konto nie istnieje
    Konto nie istnieje  
  • #21 15744304
    Hypno
    Poziom 10  
    Skompilowane i na oko nie widać żadnej różnicy w czasie mrygania leda. Zatem działa jedno i drugie tylko to moje jakby wbrew logice układu. Własnie o to mi chodzi, że to kolejny przykład na to jak trzeba uważać w BASCOMie. Ostatnio walczyłem z drobnym błędem w innym projekcie. Układ mi się resetował, okazało się że w jednym miejscu nie obsłużyłem wyjątku i w zmiennej Byte pojawiało mi się -1 i w tym był pies pogrzebany.

    Znalazłem i ja w nocie, szukałem Timer0 na początku...
  • #22 15744307
    Konto nie istnieje
    Poziom 1  
  • #23 15744315
    Hypno
    Poziom 10  
    Nie jest wrażliwy na taktowanie, na oko także nie widzę różnicy w mruganiu diodki.
    A na grzebanie w tym dużym kodzie produkcyjnym nie mam czasu.
  • #24 15744316
    kamyczek
    Poziom 38  
    Ja bym chciał usłyszeć jak sprawdziłeś te 5s ? jeśli tak się dzieje to czas wykonania procedury call pomiar właśnie tyle trwa . Mikrokontroler wchodzi w procedurę przerwania blokuje obsługę przerwań i mieli tak obsługę pomiar jak ją wykona to zezwala na przerwanie i znów je wykonuje . Zegar nie liczy nic co ma liczyć a czas wynika jedynie z czasu wykonywania podprogramu pomiar . To jest szkolny błąd procedura obsługi przerwania jest dłuższa niż czas jego wystąpienia ...
  • #25 15744317
    Konto nie istnieje
    Konto nie istnieje  
  • #26 15744329
    Hypno
    Poziom 10  
    Proszę bez ignorancji mi tu.
    Jeżeli pisałbym w asemblerze to jest to moja niech będzie ignorancja.
    Ale używam języka wysokiego poziomu i skoro ten kompilator napluje na mnie jak będę chciał zapisać word do byte w zmiennej to nie rozumiem dlaczego nie pluje jak chcę zapisać word do byte w rejestrze licznika. Oczywiście zgadzam się z tym że jest to mój błąd ale nie rozumiem dlaczego Bascom w jednym miejscu sprawdza a w drugim już nie ten sam typ błędu.

    Dobra proszę, o zamknięcie tematu bo zaczyna się lekko nerwowo robić.
  • #27 15744346
    Konto nie istnieje
    Konto nie istnieje  
  • #28 15744354
    Hypno
    Poziom 10  
    Jak widzę, że ktoś napisał, że szkolny błąd bo procedura obsługi przerwania jest dłuższa od czasu pomiędzy przerwaniami i w tym samym zdaniu napisał, że pierwszą instrukcja obsługi jest zablokowanie przerwania ponownego a ostatnia jest ponowne odblokowanie to mi się pióropusz podnosi.
  • #29 15744419
    kamyczek
    Poziom 38  
    Ja się zapytam tylko tak chcesz się czegoś nauczyć czy wolisz pióropusz i błędne poczucie że masz rację . Różnica jest taka że ja wiem co piszę a ty piszesz co wiesz . Jeśli chcesz coś wyciągnąć z tematu to musisz uznać że na forum są mądrzejsi od ciebie i ode mnie masz tą szansę czegoś się od nich nauczyć . Poza tym masz symulator programowy naucz się z niego korzystać .
  • #30 15744499
    Hypno
    Poziom 10  
    Kolego Kamyczek, bez urazy ale proszę nie zabieraj więcej głosu w tym wątku. Nie zamierzam więcej dyskutować w ten sposób.
    Wszystkim dziękuję za merytoryczne odpowiedzi. Za inne też "dziękuję".
REKLAMA