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

problem z programem pod AT90S8515

blaszka 12 Cze 2004 09:57 1791 5
  • #1 687560
    blaszka
    Poziom 11  
    Witam,

    Mam mały problem z programem pod AVR'a. Jestem poczatkojącym użytkownikiem układów AT90.... Napisałem prosty program, który ma zapalać i po pewnym czasie gasić diodę. Niestety program nie działa. Stąd moje pytanie dlaczego nie działa i gdzie popełniłem błąd.Poniżej umieszczam listing programu. Program w linii 14 zapala diodę,następnie w linii 16 przechodzi do procedury opóźnienia (linie 24-34). Z procedury powinien powrócić do linii 18 a rozpoczyna od linii 10. Co tu jest nie tak??? Prosze o pomoc i wskazówki. Używam programu AVR Studio 4.08

    1 .include "8515def.inc"
    2 .dseg
    3 .def tmp_2=R17
    4 .def tmp_3=R18
    5 .def temp=R19
    6 .def ust=R20
    7 .cseg
    8 .org 0x00
    9 start:
    10 ldi temp,0xff
    11 out DDRC,temp
    12 nowy:
    13 ldi temp,0x00
    14 out PORTC,temp
    15
    16 rcall led_wait
    17
    18 ldi temp,0xff
    19 out PORTC,temp
    20 rjmp nowy
    21 bbb:
    22 ldi tmp_3,0xff
    23 wait:
    24 dec tmp_3
    25 brne cont
    26 dec tmp_2
    27 brne wait
    28 ret
    29 led_wait:
    30 ldi tmp_2,0xff
    31 rcall wait
    32 ldi tmp_2,0xff
    33 rcall wait
    34 ret
    35 .exit
    .org 0x100
    ZNAKI:
    .db 23,45,67,87,56,34
    .exit

    Przeniesiono z Programowanie Ogólne. - arnoldziq
  • #2 687753
    h-doc
    Poziom 27  
    W 25 linii masz odwołanie do etykienty cont, a jakoś nie mogę jej znaleźć w programie. Natomiast zasadnicze pytanie brzmi: czy na symulatorze program działa prawidłowo?
  • #3 687831
    blaszka
    Poziom 11  
    Teraz podaje prawidłowy plik. W symulatorze też nie działa. Z niego podałem przebieg działania.

    1 .include "8515def.inc"
    2 .dseg
    3 .def tmp_2=R17
    4 .def tmp_3=R18
    5 .def temp=R19
    6 .def ust=R20
    7 .cseg
    8 .org 0x00
    9 start:
    10 ldi temp,0xff
    11 out DDRC,temp
    12 nowy:
    13 ldi temp,0x00
    14 out PORTC,temp
    15
    16 rcall wait_led
    17
    18 ldi temp,0xff
    19 out PORTC,temp
    20 rjmp nowy
    21 wait:
    22 ldi tmp_3,0xff
    23 cont:
    24 dec tmp_3
    25 brne cont
    26 dec tmp_2
    27 brne wait
    28 ret
    29 wait_led:
    30 ldi tmp_2,0xff
    31 rcall wait
    32 ldi tmp_2,0xff
    33 rcall wait
    34 ret
    35 .exit
  • #4 687918
    h-doc
    Poziom 27  
    po pierwsze staraj się nie włazić z kodem programu na wektory przerwań a po drugie, jak chcesz korzystać ze stosu, to trzeba by najpierw ustawić do niego wskaźnik
  • #5 688029
    BoskiDialer
    Poziom 34  
    1- zgodze sie.. stos niezainicjowany...
    2- fajna sprawa.. czekasz.. zapalasz diody i odrazu je gasisz.. gratuluje reflexu jak zauważysz miganie diody...
    co do wektorów przerwań to mam jedno zastrzeżenie.. jeśli w czasie działania programu niezostanie ustawiony bit I w rejestrze sreg to program spokojnie może sie znajować na wektorach przerwań..

    Sprawdź taki kod czy zadziała: (mi działa)
    .include "8515def.inc"
      ldi r16,$7f
      out spl,r16
      ldi r16,$ff
      out ddrc,r16
      ldi r16,$ff
      out portc,r16
    loop:
      rcall wait
      in r16,portc
      com r16
      out portc,r16
      rjmp loop
    
    wait:
      ldi r24,$ff
      ldi r25,$ff
    waitloop:
      sbiw r25:r24,1
      brne waitloop
      ret
  • #6 688078
    h-doc
    Poziom 27  
    BoskiDialer - oczywiście, że można pisać kod w obszarze wektorów przerwań. Jednak dobrą praktyką jest omijanie tego obszaru, żeby wejść w nawyk, że ten obszar ma szczególne zastosowanie. Zresztą do najczęściej zapominanych przeze mnie rzeczy należą:
    1. brak ustawienia wskaźnika stosu
    2. brak inicjalizacji odpowiednich rejestrów
    3. kod w obszarze wektórów przerwań

    heh, chociaż ostatnio raczej piszę w C, więc kompilator mnie pilnuje ;-)
REKLAMA