Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

AVRstudio Assembler kilka pytań nowicjusza

KJ 03 Dec 2008 01:51 2126 10
  • #1
    KJ
    Level 31  
    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 ?
  • #2
    d.d
    Level 20  
    Kwarc do symulacji ustawia się w Debug->AVR Simulator Options
    albo skrót Alt+O
  • #3
    ZlyDotyk
    Level 19  
    KJ wrote:
    ... Przy okazji czy ktoś wie gdzie znajdę listę wszystkich dyrektyw obsługiwanych przez AVRstudio ?


    menu Help/Assembler Help i klikasz "Assembler directives"
  • #4
    KJ
    Level 31  
    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
    krzych41
    Level 15  
    Czy pod adresem 0x012 ($012) masz wpisany rozkaz skoku do procedury przerwania (np.: jmp TC0OVF)?
  • #6
    KJ
    Level 31  
    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 
    
    
  • Helpful post
    #7
    krzych41
    Level 15  
    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.
  • #8
    KJ
    Level 31  
    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
    krzych41
    Level 15  
    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
    KJ
    Level 31  
    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
    zumek
    Level 39  
    KJ wrote:
    problem kolejny w jaki sposób poprawnie skonfigurować uart ??

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

    KJ wrote:
    ...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.