насчет UserGuide: надо бы сразу туда глядеть))) лучше поздно, чем никогда))))
насчет UserGuide: надо бы сразу туда глядеть))) лучше поздно, чем никогда))))
разрядность операнда выше разрядности регистра. Вы пытаетесь впихнуть невпихуемое.katu6ka писал(а):error: Operand(s) out of range in 'ldi r16,0x45f'
Написать можно все, что угодно. Другое дело, будет ли работать. Смотрите: устанавливаем ADEN, хорошо, включили АЦП. Следующей командой устанавливаем ADFR, но одновременно сбрасываем ADEN. В итоге получается фигня. Ну это так, к слову.katu6ka писал(а):можно же вот так писать ?
Посмотрите в файле подключаемой библиотеки используемого мк как определен регистр состояния АЦП - компилятор не понимает аббревиатуры ADCSRA в вашем сообщении.katu6ka писал(а):error: SRA: Unknown instruction or macro syntax error, unexpected ','
Команда ldi не использует стек.katu6ka писал(а):Насчет невпихуемого - стек был не настроен , уже все отомпилировалось))
Все правильно.OCF2 is cleared by writing a logic one to the flag.
Код: Выделить всё
ldi Temp, 0b01101100 ; настройка режима работы Т/С2, в т.ч. CLK/64, быстрый ШИМ и При совпадении ноль
out TCCR2, Temp
ldi Temp, 0b01000000 ; Bit 7 – TOIE2 установлен, разрешает прерывание по переполнению
out TIMSK, Temp
sei.. ну во-первых раз это mega8, то следущий вектор идет не через раз.... правильно будетkatu6ka писал(а):Код: Выделить всё
.ORG $000 rjmp RESET ; Reset Handler .ORG $002 ;rjmp EXT_INT0 ; IRQ0 Handler
Код: Выделить всё
.ORG $000
rjmp RESET
reti ; rjmp EXT_INT0
reti ;
.... и т.д.Код: Выделить всё
.macro outi
ldi R16,@1
out @0,R16
.endm
; .... и вместо 2-х строк
ldi R16, (1<<DDB3) ; вывод ОС2 ( порт В, 3 бит) на выход
out PORTB, R16
; можно писать одну
outi PORTB,(1<<DDB3) ; вывод ОС2 ( порт В, 3 бит) на выход
Код: Выделить всё
.ORG INT_VECTORS_SIZEКод: Выделить всё
ldi R16, (1<<DDB3) ; вывод ОС2 ( порт В, 3 бит) на выход
out PORTB, R16Код: Выделить всё
SBI PORTB, 3Код: Выделить всё
SBI DDRB, 3 ; вывод ОС2 ( порт В, 3 бит) на выходКод: Выделить всё
.MACRO outi // Отправка константы в регистр в/в
ldi Temp, @1
out @0, Temp
.ENDMACRO
Код: Выделить всё
ldi Temp, 0b01101100 ; настройка режима работы Т/С2, в т.ч. CLK/64, быстрый ШИМ и При совпадении ноль
out TCCR2, TempКод: Выделить всё
outi TCCR2, 0b01101100Код: Выделить всё
ldi Temp, 0b10000000 ; 1<< I bit в регистре статуса SREG ( Global Interrupts Enable )
; и все же прописываем мы или тоже не надо, как и OCF2 ??
out SREG, TempКод: Выделить всё
SEIКод: Выделить всё
.include "m8def.inc"
.def Temp=R16
.MACRO outi // Отправка константы в регистр в/в
ldi Temp, @1
out @0, Temp
.ENDMACRO
.cseg
.ORG $000
rjmp RESET ; Reset Handler
.ORG $008
rjmp TIM2_OVF ; Timer2 Overflow Handler
;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;**************************************************
.ORG INT_VECTORS_SIZE
Reset:
SBI DDRB, 3 ; вывод ОС2 ( порт В, 3 бит) на выход
outi TCCR2, 0b01101100 ; настройка режима работы Т/С2, в т.ч. CLK/64, быстрый ШИМ и При совпадении ноль
outi TIMSK, 0b01000000 ; Bit 6 – TOIE2 установлен, разрешает прерывание по переполнению
outi SPL, low(RAMEND) ; Инициализация стека
outi SPH, high(RAMEND)
;настройка АЦП
outi ADMUX, (1<<ADLAR) ; выравнивание слева (результат в старших разрядах)
sei ;разрешить прерывания
;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************
begin:
outi ADCSRA, 0b11100000
outi OCR2, 0xFF ; ПОЛОЖИТЬ В OCR 0xFF ; на выходе будет лог. 1
; А НИЧЕГО НЕ ПРОИСХОДИТ ...
Inf:
rjmp Inf ;бесконечный цикл -- ждем прерывания
;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ таймера (как переполнился, так можно класть новое значение OCR)
;*************************************************
TIM2_OVF:
in R17, ADCH ; тут говорят надо в стеке сохранять R17
out OCR2, R17;
reti ;выход из обработчика прер-я АЦП
это не самый удачный совет. писать код можно сразу после определения последнего задействованного вектора (если они определяются в правильном порядке), а то вы напрасно потеряете приличный кусок памяти впустую. с другой стороны, если ваш код "грязный", т.е. есть вероятность, что вы разрешите прерывание, для котрого не определен вектор, оба совета не хороши - в таком разе надо определять ВСЕ векторы, устанавливая на месте неиспользуемых хотя бы reti - всяко безопаснее (хотя поиск ошибок отнюдь не облегчает)...IfoR писал(а):В таблице векторов можно не прописывать каждый вектор. Достаточно описать только нужные. По умолчанию все прерывания, кроме RESET, отключены и по этому какое либо другое прерывание оно не может быть вызвано, пока вы явно не включите его.
В соответствии с написанным выше, т.к. код нужно располагать после таблицы, то его нужно выравнять с помощью этого:Код: Выделить всё
.ORG INT_VECTORS_SIZE