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

[AVR][ASM] programowanie w WinAVR

dypusz 18 Dec 2011 14:39 2244 7
  • #1
    dypusz
    Level 16  
    Posiadam programator UsbAsp więc AVRStudio odpada i dlatego korzystam z WinAVR i tu zaczynają się schody. Mam taki kod programu:
    Code: asm
    Log in, to see the code


    Programuje attiny2313(dioda podłączona do portu B) ale zamiast dioda świecić ciągłym światłem to miga co sekunde. Jak to poprawić?
  • #2
    pawel-jwe
    Level 30  
    Mikroprocesor może się resetować. Może być włączony Watchdog.
    Poczytaj tutaj:
    http://atmega32.republika.pl/12.htm
    Za włączenie/wyłączenie Watchdog odpowiada bit WDTON w FuseBitach.

    I jeszcze
    dypusz wrote:
    ldi R16,0b11111111
    out PORTB,R16

    jesteś pewny że to zapala diodę (będzie tak tylko jeśli katoda będzie na stałe do GND, a anoda do odpowiedniego pinu - oczywiście z rezystorem ograniczającym prąd).
    W płytkach testowych zazwyczaj anoda jest na stałe podłączona, a katoda do pinu mikroprocka i wtedy ustawienie "0" zapala diodę
  • #3
    dypusz
    Level 16  
    Ale to jest nówka(też może być włączony Watchdog?)
    na pewno dobrze podłączyłem

    Dodano po 23 [minuty]:

    Na pewno coś jest źle skonfigurowane w WinAVR(jeśli chodzi o asembler) bo wgrałem ten program w C i działa:

    Code: c
    Log in, to see the code
  • #4
    pawel-jwe
    Level 30  
    Tak tylko że w tym programie w asemblerze była na końcu nieskończona pętla i wtedy Watchdog mógł działać, a w tym napisanym w C już tej pętli nie widzę, tzn. program raz się wykonuje - ustawia port i koniec.
    W tym programie napisanym w C dodaj na końcu nieskończoną pętlę np. while(1){}, i zobacz wtedy co będzie.
  • #5
    dypusz
    Level 16  
    dodałem te pętle i dalej świeci
  • #6
    pawel-jwe
    Level 30  
    Patrząc na te przykłady w asemblerze (co prawda dla atmega32, ale składnia chyba ta sama):
    http://atmega32.republika.pl/30.htm
    ewidentnie brakuje mi w twoich programach adresu początku programu:
    .org 0x0000 ;podanie adresu początku programu - pamięć programu
    Może tu jest problem?

    PS. Chociaż doszukałem się w datasheet że jak nie ma .org* to z automatu zaczyna od adresu 0x0000, ale nie wiadomo jak to rozumuje kompilator.
  • Helpful post
    #7
    snnaap
    Level 25  
    Hey prawidłowo program w asm dla t2313 powinien się zaczynac od adresy 0x0013, adresy od 1 do 0x0012 zarezerwowane są dla wektorów przerwań.
    W adresie 0x0013 powinna być deklaracja stosu, zgodnie z notą:

    RESET: ldi r16, low(RAMEND); Main program start
    out SPL,r16; Set Stack Pointer to top of RAM

    Czyli program powinien wyglądać tak, że pod adresem 0x0000 powinieneś mieś skok do RESET.

    Dopiero po deklaracji stosu powinieneś pisać właściwy program.


    Dla AVRStudio:
    Code: asm
    Log in, to see the code
  • #8
    dypusz
    Level 16  
    działa dzieki