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

Dlaczego funkcja waitms w Bascom AVR działa 10 razy wolniej na ATmega8?

marcin w 14 Kwi 2006 07:30 3576 10
REKLAMA
  • #1 2525925
    marcin w
    Poziom 22  
    Posty: 756
    Pomógł: 4
    Ocena: 81
    Witam.
    Mam procesor atmega 8. Napisałem prosty programik zapalający i gaszący diodę. Oto jego treść:

    $regfile = "m8def.DAT"
    $crystal = 8000000
    Do
    Set Portd.4
    Waitms 500
    Reset Portd.4
    Waitms 500
    Loop

    Jednak nie zgadzają mi się czasy. Czas świecenia diody jest ok 5 s, a nie jak w programie 0,5 s. Sprawdzałem ustawienia bascom, jest prawidłowo wszystko ustawione.

    Co może być przyczyną tego ?? Proszę o pomoc, bo w dziedzinie Bascom jestem początkujący, kiedyś jedynie programowałem z poziomu asamblera uC 8051.
  • REKLAMA
  • #2 2525962
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    Sprawdzałeś fuse bity?
  • #3 2526001
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    jacobsek napisał:
    Sprawdzałeś fuse bity?


    dokładnie o to chodzi. Atmega8 standardowo jest ustawiona na wewnętrzny oscylator 1Mhz. jeśli chcesz żeby kożystał z zewnętrznego Kwarcu to musisz zmienić fusebity. ale uwaga wielu początkujących przypadkiem blokuje swoje atmegi wiec zanim coś będziesz robił to poczytaj note katalogową i opisy.
    dodam tylko że musisz ustawić pewne bity na 1111.
  • REKLAMA
  • #4 2529717
    Press
    Poziom 24  
    Posty: 566
    Pomógł: 69
    Ocena: 40
    ATmega8 ma tez wewnetrzny oscylator 8MHz. Tylko z Bascoma nie udalo mi sie go ustawic. Ale PonyProgiem mozna to zrobic bez problemu recznie modyfikujac CKSEL.
  • #5 2529729
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    W bascomie tez bez problemu można ustawić wewnętrzny na 8Mhz,są tam odpowiednie fusy
  • #6 2529863
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    Press napisał:
    ATmega8 ma tez wewnetrzny oscylator 8MHz.

    nieradze ustawiać tego generatora na 8Mhz gdyż oprucz taktowania procesora ma on drugą funkcję. generuje on przebiegi czasowe podczas programowania pamieci EEPROM i FLASH. ustawienie go na 8Mhz może doprowadzić do błędów zapisu oraz skrucenia życia tych pamieci. wiecej info w nocie katalogowej. Brrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr.... (Sprawdź pisownię - od tego jest przycisk, więc to tylko minuta... Light-I)
  • REKLAMA
  • #7 2530464
    1ceman
    Poziom 12  
    Posty: 104
    Pomógł: 1
    Cześć
    Domyślam się że marcin_w dopiero zaczyna przygodę z mikrokontrolerami jeśli próbuje zaświecić diode.
    Czy nie lepiej mu będzie po prostu w programie zmienić wartość crystal na 1000000 ? Wtedy mikrokontroler będzie liczył dobrze, a zabawa na tym poziomie z "fusami" dość szybko może się skończyć zablokowaniem procesora o czym się sam przekonałem całkiem niedawno :)
    $regfile = "m8def.DAT"
    $crystal = 1000000
    Do
    Set Portd.4
    Waitms 500
    Reset Portd.4
    Waitms 500
    Loop
    End 'zapomniales zakonczenia
    
  • #8 2531221
    greg_matrix
    Poziom 17  
    Posty: 163
    Pomógł: 28
    Ocena: 3
    Chodzi o to, że w mikrokontrolerze oprócz wyboru częstotliwości generatora można także ustawić podział tej częstotliwości przez 8. To się nazywa "clock devide by 8" i standardowo jest włączone. Wtedy procesor działa tak jakby częstotliwość była 1MHz zamiast 8MHz.

    Masz więc dwa wyjścia:
    1. Pamiętać o tym podziale- chcesz mieć "fizycznie" 500ms, więc wpisujesz 500/8=62,5 czyli waitms 63
    2. Wyłączyć podział- w okienku programowania są 3 zakładki, jedna z nich to "Lock and Fuse Bits" i takm "Clock Devide by 8" ustawiasz na OFF i klikasz "Write" żeby ustawienie zostało wpisane do procka. Co do konsekewncji to bardzo możliwe, że to o czym koledzy piszą to prawda (zauważyłem, że błędy zapisu rzeczywiście są wtedy częstsze).
  • #9 2532103
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    W atmedze 8 chyba nie ma już tej opcji dzielenia przez 8, widziałem ją w attiny 2313.
    Chciałbym poznać też zdanie innych na temat pracy atmegi z zegarem 8Mhz, co sądzą o tym że może powodować błędy w zapisie i skrócić żywotność eeprom a może nawet flash???
  • REKLAMA
  • #10 2532144
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    jacobsek napisał:
    W atmedze 8 chyba nie ma już tej opcji dzielenia przez 8, widziałem ją w attiny 2313.
    Nigdy nie było.
    jacobsek napisał:
    Chciałbym poznać też zdanie innych na temat pracy atmegi z zegarem 8Mhz, co sądzą o tym że może powodować błędy w zapisie i skrócić żywotność eeprom a może nawet flash???
    Po czym to kolega wnosi ?
    Zamiast wymyślania cudów, proponuję lekturę :
    http://www.atmel.com/dyn/products/datasheets.asp?family_id=607
  • #11 2539182
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    Witam. To nie była moja opinia o pracy atmegi z zegarem 8Mhz. Kol.hunterhouse tak sądzi, ja tylko chciałem sprawdzić czy poza nim ktoś jeszcze, sam do tej pory używałem f=8Mhz w atmedze i nie miałem z tym problemów.
    Pozdrawiam

Podsumowanie tematu

✨ Problem z funkcją waitms w Bascom AVR na mikrokontrolerze ATmega8 wynika z domyślnego ustawienia fuse bitów, które powodują, że procesor pracuje z wewnętrznym oscylatorem 1 MHz zamiast z zewnętrznym kwarcem 8 MHz. W efekcie czasy opóźnień są około 10 razy dłuższe niż oczekiwane. Aby uzyskać poprawne działanie, należy zmienić fuse bity, wyłączając domyślny wewnętrzny oscylator lub poprawnie skonfigurować źródło taktowania. Alternatywnie, dla początkujących, można w programie zmienić deklarację częstotliwości na 1 MHz, co pozwoli na prawidłowe działanie funkcji waitms bez ryzyka zablokowania mikrokontrolera. Dyskusja porusza także kwestie ryzyka uszkodzenia pamięci EEPROM i FLASH przy pracy z wewnętrznym oscylatorem 8 MHz oraz nieistnienie opcji dzielenia zegara przez 8 w ATmega8, co jest charakterystyczne dla innych modeli, np. ATTiny2313.
REKLAMA