Atmel AVR blad w programie ?

Witam,

Od dwóch dni walcze z problemem w prostym programie, opisze krótko jego dzialanie - przy kazdym przerwaniu powinien zwiekszyc wartosc rejestru "num_counter" i wystawic go na port B jednak gdzies lezy blad i program wraca do etykiety start która inicjuje kontroler i dodatkowo kasuje ten rejestr, z pozoru wszystko jest OK ale uklad dziala jak opisalem, HELP !

Z góry dzieki za pomoc

;*************************************************************************** .include "2313def.inc"

.def STATUS_REG =R0

.def TEMP =R16 .def num_counter =R24

.cseg

.org $0000 rjmp start

.org INT0addr rjmp ext_int0

start: ldi TEMP,$50 out SPL,TEMP

ldi TEMP,(1<<ISC01)|(1<<ISC00) out MCUCR,TEMP

ldi TEMP,$FF out DDRB,TEMP

ldi TEMP,(1<<INT0) out GIMSK,TEMP

clr TEMP mov num_counter,TEMP

sei

MAIN_LOOP:

rjmp MAIN_LOOP

ext_int0: in STATUS_REG,SREG out PORTB,num_counter inc num_counter out SREG,STATUS_REG reti

Reply to
Carlosek
Loading thread data ...

W jakim programie napisany jest ten kawalek kodu podany przez kolege? Czy to nie jest czasami C?

P.S. Sorki tak z ciekawosci pytam.

Reply to
Dr.Endriu

Uzytkownik "Carlosek" napisal w wiadomosci

start: ldi TEMP,$50 out SPL,TEMP

A ja nadal polecam zmienic ten fragment z $50 na RAMEND.

W dokumentacji (s. 17) stoi cos takiego:

The Stack Pointer must be set to point above $60. Jesli sie nie myle, to $50 < $60, wiec cos jest nie tak.

Konkretnie (s. 18, dol): ldi temp, low(RAMEND) out SPL, temp

Ramend to najprawdopodobniej wartosc $DF. Ustawiajac z palca $50, chyba ustawiasz SPL w srodek obszaru rejestrow systemowych.

Mam nadzieje, ze jak zmienisz, to zadziala :)

Polecam takze fragment taki, mowiacy jak dziala stos (s. 17) i dlaczego SPL ma byc ustawiony na koniec ramu, a nie na jego poczatek... (i do tego z bledem ;) ): The Stack Pointer is decremented by 1 when data is pushed onto the stack with the PUSH instruction, and it is decremented by 2 when an address is pushed onto the stack with subroutine calls and interrupts. The Stack Pointer is incremented by 1 when data is popped from the stack with the POP instruction, and it is incremented by 2 when an address is popped from the stack with return from subroutine RET or return from interrupt RETI.

Reply to
mIrO

Watchdog masz wlaczony ?

J.

Reply to
J.F.

hej,

pisze bezposrednio w asemblerze, cenie sobie jego prostote

pozdrawiam

Reply to
Carlosek

nie wlaczalem watchdoga, tez podejrzewalem ze petla powoduje reset, chyba ze watchdog jest wlaczany domyslnie...

pozdrawiam

Reply to
Carlosek

Dzialaa!!!! pomogla zamiana na:

ldi temp, low(RAMEND)

wielkie dzieki !!!! pozdrawiam i zycze wesolych swiat

Reply to
Carlosek

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.