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

[Atmega 128] [FastAvr] błędne działanie komendy Wait

Salomon 19 Maj 2009 11:50 2226 5
  • #1 6548109
    Salomon
    Poziom 11  
    Witam,
    Mam problem z prawidłowym uruchomieniem prostego programu na atmega128 typu:

    $Device= m128
    $Stack = 32
    $Clock = 18.432
    $Source= On
    Dim n As Byte
    DDRD=&hff
    n=&hfe
    Do
    PORTD=n
    Rotate(Left, 1, n)
    WaitMs 100
    Loop

    Program po poprawnej kompilacji w Fastavr mogę bez problemów załadować za pomocą PonyProg i STK 200/300 do układu. W wyniku otrzymuję zaświeconą jedną diodę LED na porcie PD0. Przedmiotowy kod uruchamiam na nowym mikrokontrolerze podłączonym według schematu:

    [Atmega 128] [FastAvr] błędne działanie komendy Wait

    Po zmodyfikowaniu kodu pętli „Do” w sposób:

    Do
    WaitMs 100
    PORTD=n

    Loop

    Zaświecają się wszystkie diody podłączone do portu D natomiast ten kod bez procedury „WaitMs 100” zapala jak na początku jedną podpiętą do PD0. Jednym słowem, jakby komenda „WaitMs 100” była odpowiedzialna za taki stan rzeczy. Czy muszę coś skonfigurować np. przełączyć na zewnętrzny rezonator 18.432mhz. Gdy skonfiguruję Fuse bity w sposób: CKSEL3..1 na 1111 i SUT1..0 na 11 będzie ok?
  • #2 6548198
    tzok
    Moderator Samochody
    Świecą się wszystkie, bo program działa "za szybko". Polecenie WaitMs nie używa timera, tylko czeka określoną ilość taktów, aby ta ilość była prawidłowa, kompilator musi "znać" taktowanie procesora.

    Na raz ma się świecić tylko jedna dioda, tylko co "chwilę" kolejna - przy odpowiednio małym czasie da to efekt świecenia wszystkich diod jednocześnie.
  • #3 6548631
    Salomon
    Poziom 11  
    tzok napisał:
    Świecą się wszystkie, bo program działa "za szybko". Polecenie WaitMs nie używa timera, tylko czeka określoną ilość taktów, aby ta ilość była prawidłowa, kompilator musi "znać" taktowanie procesora.

    Na raz ma się świecić tylko jedna dioda, tylko co "chwilę" kolejna - przy odpowiednio małym czasie da to efekt świecenia wszystkich diod jednocześnie.


    Dzięki za wskazówkę, zmieniłem w programie komendę „WaitMs 100” na „Wait 2” ale to nic nie zmieniło. Program nie zaświeca rotacyjnie, co 2sek kolejnych diod począwszy od podłączonej do PD0, która cały czas się świeci. Proszę o dalsze podpowiedzi.
  • #4 6553498
    Salomon
    Poziom 11  
    Zauważyłem, że wszystko działa poprawnie, gdy zmienię dyrektywę „$Device= m128”, definiującą procesor i jego zasoby na np. „$Device= m8515” lub „$Device= m161”. Dlaczego tak jest?
  • Pomocny post
    #5 6553507
    _Robak_
    Poziom 33  
    A nie masz wlaczonego fuse bitu ze atmega 128 robi za atmega 103 ?
  • #6 6553594
    Salomon
    Poziom 11  
    _Robak_ napisał:
    A nie masz wlaczonego fuse bitu ze atmega 128 robi za atmega 103 ?


    Strzał w dziesiątkę! Wielkie Dzięki. :please:
REKLAMA