После компиляции отправляю её в МК ATmega16 с пом. JTAG mkII. Для отладки пользую его же..
и первое прерывание, которое происходит, так это прерывание готовности ЕЕПРОМа. ЕЕПРОМу я запретил делать прерывания в начале программы, да и если просто не инициализировать его, и не трогать его регистры, прерывание не должно случиться.
Тот же код при тестировании в симуляторе никогда не попадает на те же брейкпоинты, что при отладке джитагом.
строка в коде, на которую происходит неверный переход:
reti // происходит прерывание??? от ЕЕпром?
код в приложении.. Кто сталкивался с таким?
Еррата к 16-й меге выглядит так:
ATmega16(L) Rev. G. There are no errata for this revision of ATmega16.
ATmega16(L) Rev. H. There are no errata for this revision of ATmega16.
так что, надеюсь, проблема не в МК.
так что, надеюсь, проблема не в МК.
Проблема не в МК.
просто я самоучка

Нашел причину... Как оказалось, дело в определениях регистров.. точнее - в неверном определении.
после
.cseg
.org $0000
нельзя писать .equ .def
Тут фрагменты кода:
Код
Как "ненадо делать":
.cseg
.org $0[/b]
.def res_counter=r17
.equ reset_flag = $0100
.equ past_state = $0101
.equ bit_counter= $0102
jmp start ; Reset handler
reti //int_0
reti //int_0
.cseg
.org $0[/b]
.def res_counter=r17
.equ reset_flag = $0100
.equ past_state = $0101
.equ bit_counter= $0102
jmp start ; Reset handler
reti //int_0
reti //int_0
и "Как работает":
Код
.include "m16def.inc"
.def res_counter=r17
.equ reset_flag = $0100
.equ past_state = $0101
.equ bit_counter= $0102
.cseg
.org $0
jmp start ; Reset handler
reti //int_0
reti //int_0
.def res_counter=r17
.equ reset_flag = $0100
.equ past_state = $0101
.equ bit_counter= $0102
.cseg
.org $0
jmp start ; Reset handler
reti //int_0
reti //int_0
;)