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

Jak ustawić kwarc 16MHz w AVRstudio Assembler? Szukam listy dyrektyw

KJ 03 Gru 2008 01:51 2204 10
REKLAMA
  • #1 5811552
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Witam. Mam dość zasadniczy problem na który nie znalazłem odpowiedzi. Potrzebuję w AVRstudio zdefiniować że mam podłączony kwarc 16MHz tymczasem AVRstudio z uporem maniaka twierdzi ze kwarc jest 4MHz w skutek czego zależności czasowe w symulacji mają się nijak do rzeczywistości. Znalazłem tylko przykłady w C oczywiście dla asm nie działają :( Przy okazji czy ktoś wie gdzie znajdę listę wszystkich dyrektyw obsługiwanych przez AVRstudio ?
  • REKLAMA
  • #2 5811573
    d.d
    Poziom 20  
    Posty: 386
    Pomógł: 36
    Ocena: 18
    Kwarc do symulacji ustawia się w Debug->AVR Simulator Options
    albo skrót Alt+O
  • #3 5812825
    ZlyDotyk
    Poziom 19  
    Posty: 169
    Pomógł: 40
    Ocena: 1
    KJ napisał:
    ... Przy okazji czy ktoś wie gdzie znajdę listę wszystkich dyrektyw obsługiwanych przez AVRstudio ?


    menu Help/Assembler Help i klikasz "Assembler directives"
  • REKLAMA
  • #4 5814990
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Kolejne pytanie:
    Wg. noty atmegi16 wektor przerwania od przepełnienia timera0 (Timer0 OVF) znajduje sie pod adresem $012 natomiast w symulacji i rzeczywistym środowisku przerwanie działa tylko gdy skok do niego jest ustawiony pod adresem $030 (taka wartość ląduje w liczniku rozkazów w momencie wystąpienia przerwania). Czego nie wiem co deklaruje niewłaściwie albo czego nie doczytałem w nocie ? Puki co nie przeszkadza mi ten feler ale niebawem będę musiał do softu dodać kolejne przerwanie którego adres jest w świetle powyższych wydarzeń niewiadomą ;)
  • #5 5815232
    krzych41
    Poziom 15  
    Posty: 43
    Pomógł: 15
    Ocena: 3
    Czy pod adresem 0x012 ($012) masz wpisany rozkaz skoku do procedury przerwania (np.: jmp TC0OVF)?
  • #6 5815259
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    mam tak:
    
    .org 0
    rjmp reset ;po resecie
    
    .org $002
    rjmp detekcja0 ;przerwanie od detektora zera
    
    .org $012
    rjmp timer0;przerwanie od timera
    
    .org 40 
    reset:
    
    program 
    
    


    i ten kod nie działa

    a ten działa:

    
    .org 0
    rjmp reset ;po resecie
    
    .org $002
    rjmp detekcja0 ;przerwanie od detektora zera
    
    .org $030
    rjmp timer0;przerwanie od timera
    
    .org 40 
    reset:
    
    program 
    
    
  • REKLAMA
  • Pomocny post
    #7 5815403
    krzych41
    Poziom 15  
    Posty: 43
    Pomógł: 15
    Ocena: 3
    Czy procedurę o etykiecie "timer0" masz daleko od początku programu? A może jej w ogóle nie masz? W zasadzie dla procesorów o tak dużym Flash'u powinno się używać rozkazu "jmp", a nie "rjmp" (dlateg adresy w tablicy przerwań są co 2 bajty), ale tak jak napisałeś może też być, pod warunkiem, że nie zostanie przekroczony zasięg rozkazu "rjmp". Wówczas jednak kompilator powinien protestować.
    To ".org 40", jeśli tak jest rzeczywiście, to nie podoba mi się, gdyż 40 = $28 i z tego wychodzi galimatias, jedno na drugim. Z przypadkiem takim, że wektory przerwań nie pokrywają się z notą katalogową, jeszcze nie spotkałem sie, a w asemblerze programuję juz sporo czasu, nie tylko AVR-y.
  • REKLAMA
  • #8 5815503
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Pomyłka jest .org 49 więc nie powinno "włazić" na żaden wektor przerwania. Chyba właśnie doszedłem o co chodzi z tym przerwaniem... mianowicie o to że mam do czynienia z przerwaniem Timer0 COMP a nie Timer0 OVF które to znajduje sie pod adresem $028 ... i pod takim też działa poprawnie. Niech mnie ktos teraz oświeci czym różni się OVF od COMP ?
  • #9 5815622
    krzych41
    Poziom 15  
    Posty: 43
    Pomógł: 15
    Ocena: 3
    Niektóre timery (patrz zestawienie rejestrów kontrolnych i sterujących) mają rejestry licznika (liczników) i rejestry porównania (porównań). Przerwanie OVF występuje wtedy, gdy zapełni się rejestr licznika, natomiast przerwanie COMP (porównanie) następuje wówczas, gdy stan rejestru licznika zrówna się ze stanem rejestru porównania. Wartość rejestru porównania ustala programista i nie zmienia się, jeśli on sam tego nie zrobi w programie. To wszystko można wyczytać w nocie katalogowej procesora.
  • #10 5818389
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    problem kolejny w jaki sposób poprawnie skonfigurować uart ?? w chwili obecnej jest tak:
    ;UART
    
    ;baudrate - 9600bps
    ldi temp,0
    out ubrrh,temp
    ldi temp,103
    out ubrrl , temp
    
    ;aktywacja RXD
    
    ldi temp,(1<<rxen):<włączenie odbiornika
    out ucsrb,temp
    
    ldi temp,(1<<UCSZ0)|(1<<UCSZ1) :<-8 bitów danych
    out ucsrc ,temp 



    Na razie odpytywany programowo - odbiera dane ale niepoprawne więc pewnie coś z konfiguracją. Zauważyłem że w momencie wpisania:
    out ucsrc ,temp
    zmienia się także rejestr ubrrh na tą samą wartość ucsrc pewnie czegoś znowu nie doczytałem w nocie ...
  • #11 5818682
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    KJ napisał:
    problem kolejny w jaki sposób poprawnie skonfigurować uart ??

    Kolega ma zamiar w tym wątku, "przelecieć" całą dokumentacje ATMega16 :?:

    KJ napisał:
    ...zmienia się także rejestr ubrrh na tą samą wartość ucsrc pewnie czegoś znowu nie doczytałem w nocie ...

    I to pytanie świadczy dobitnie, że kolega albo dokumentacji nie czytał, albo czytał ale nie zrozumiał.

    ATMega16_PL

    Regulamin p.14, p.16 - temat zamykam.

Podsumowanie tematu

✨ W dyskusji poruszono problem konfiguracji kwarcu 16 MHz w symulatorze AVRstudio dla asemblera, gdzie domyślnie ustawiony jest kwarc 4 MHz, co powoduje rozbieżności czasowe w symulacji. Rozwiązaniem jest ustawienie częstotliwości kwarcu w opcjach symulatora (Debug -> AVR Simulator Options). Wskazano również, że listę dyrektyw asemblera można znaleźć w menu Help/Assembler Help. Dodatkowo omówiono problem z adresacją wektorów przerwań w ATmega16, gdzie przerwanie Timer0 OVF według noty katalogowej znajduje się pod adresem $012, lecz w praktyce działa pod $030. Wyjaśniono, że różnica wynika z rodzaju przerwania – OVF (przepełnienie licznika) i COMP (porównanie licznika z rejestrem porównania), które mają różne adresy wektorów. Poruszono także kwestie poprawnej konfiguracji UART, gdzie błędna konfiguracja rejestru UCSRC wpływa na rejestr UBRRH. Ostatecznie podkreślono konieczność dokładnego studiowania not katalogowych i dokumentacji procesora ATmega16 dla prawidłowej konfiguracji i programowania asemblerowego.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA