#ifndef F_CPU
#error "F_CPU must be defined!"
#endif
Это значит, что F_CPU должно было быть описано выше командой #define, иначе компилятор выдаст ошибку с прекращением компиляции и выводом строки #error "F_CPU must be defined!"
Челюскин писал(а): #if F_CPU < 4000000
#warning "F_CPU too low, possible wrong delay"
#endif
Тут при компиляции будет варниг с сообщением что частота F_CPU слишком мала и возможно будет ошибочная длительность задержки
Здравствуйте, господа.
Пишу программу на ассемблере можно сказать первую в жизни,
есть обработчик прерывания АЦП он срабатывает все нормально в конце обработчика стоит как положено reti (не ret).
в начале программы так же стоит инициализация стека.
все работает нормально.
но если в обработчике прерывания я использую команду
CP либо CPI вываливается ошибка
Program counter at unprogrammed flash location
и программа не возвращается в бесконечный цикл, вообщем она теряет место от куда была вызвана.
подскажите почему так происходит.
Наверное надо показать обработчик.
После CP есть условные переходы (BRxx) куда-то? Они верны?
Сам по себе CP не может никак повлиять на ход выполнения программы, он всего лишь устанавливает флаги...
rjmp start
reti ; Addr $01
reti ; Addr $02
rjmp timer2comp ; Addr $03 - вектор прерывания по таймеру 2 (сравнение с числом в регистре)
reti ; Addr $04
reti ; Addr $05
reti ; Addr $06
reti ; Addr $07
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
rjmp ADC_ConversionComplite ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
reti ; Addr $11
reti ; Addr $12
reti ; Addr $13
reti ; Addr $14
start:
;настройка АЦП и таймера
ldi temp,0b0110000
out ADMUX,temp
ldi temp,0b11101111
out ADCSRA,temp
ldi temp,0b00001111
ldi temp,0b00000000
out TCNT2,temp
ldi temp,5
out OCR2,temp
ldi temp,0b10000000
out TIMSK,temp
ldi temp,RamEnd
out SPL,temp
sei
forever:
nop
nop
nop
nop
rjmp forever
timer2comp:
nop
nop
reti
ADC_ConversionComplite:
in temp,ADCH
mov temp2,temp
ldi temp,255
;******ЕСЛИ ЗАКОММЕНТИРОВАТЬ ЭТИ ДВЕ СТРОКИ ТО РАБОТАЕТ
; а с ними ошибка
cp temp2,temp
brsh label1
;*******************************************************
label1:
nop
nop
reti
Ваше условие в данном слу-ча-е... БЕСПОЛЕЗНО!
Если между brsh label1 и label1 вписать что нибудь полезное, то тогда будут два действия в зависимости от того, temp2 больше или меньше temp1
Типа так:
К чёрту VMLAB. Отказался от него давно. Куча ошибок в коде, который нормально компилится в других средах и работает в железе безупречно. Пользуюсь AVR Studio 4.
Никаких проблем нет.
I am DX168B and this is my favourite forum on internet!
ааааа... опять симуляторы...
В железке-то не пытались запустить?
То, что между метками, как-то использует стек? Или прямо этот код (как вы привели, с пустотой между метками) не компилится? Если второе - глюк симулятора 100%
Вот с этим я соглашусь на 300%. Имел я дело с этим симулятором. У него кажется какие - то проблемы с кодировками символов в исходниках или сам он "БАГ на БАГе"
I am DX168B and this is my favourite forum on internet!
В коде нет ошибки. Меняйте среду разработки. Используйте среду AVR Studio 4.
Это официальная среда от ATMEL. Бесплатная. У них на сайте её уже нет, ищите на торрентах.
А если хочется ещё и потыкать по виртуальным кнопкам или помигать виртуальными светодиодами и многое-многое другое, то пользуйтесь программой Proteus.
У меня когда-то этот VMLAB часто на ровном месте спотыкался. Пришлось отказаться от него.
Блин... Не заметил.
В меге 8535 инициализация стека делается так:
Ну, уже ответили. VMLAB тоже пробовал, что-то он вообще не в тему оказался... Уж лучше (чур меня) протеус.
Блин, и как я умудряюсь по 4К кода в одном блокноте писать... Иногда страницы 2-3 нафигаришь, зашьёшь, а он не то, что бы скомпилился без ошибки, так еще и работает!