Атмеловцы ошиблись при написании заголовочника и не дописали один символ. Это единственная его ошибка.
Атмеловцы ошиблись при написании заголовочника и не дописали один символ. Это единственная его ошибка.
я старшую пробовал нулями инициализироватьDX168B писал(а):AaNnDdRrEeYy неправильно стек инициализировал.
Указал только младшую часть адреса ОЗУ под стек.
Код: Выделить всё
ldi temp,0b10000000 out TIMSK,temp ldi temp,RamEnd ;Вот тут out SPL,temp sei forever:
Код: Выделить всё
ldi temp,0b00000000
out SPH,temp
Код: Выделить всё
0x015 RESET: ldi r16,high(RAMEND) ; Main program start
0x016 out SPH,r16 ; Set Stack Pointer to top of RAM
0x017 ldi r16,low(RAMEND)
0x018 out SPL,r16
Код: Выделить всё
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
Код: Выделить всё
.include "m8535def.inc"
;-------------------------------------------
.cseg
.org 0x0000
rjmp RESET
.org INT_VECTORS_SIZE
;-------------------------------------------
RESET:
ldi r16, Low(RAMend)
out SPL, r16
ldi r16, High(RAMend)
out SPH, r16
LOOP:
rjmp LOOP
Код: Выделить всё
; выполняемые функции: выполняется прерывание каждую секунду (резонатор =4МГц)
.device ATmega8515
.nolist
.include "m8515def.inc"
.list
;================
; Объявления
.def temp = r16
; FLASH =======
.CSEG ; Кодовый сегмент
;====== Таблица векторов прерываний================
.ORG 0x0000 ; RESET - Аппаратный сброс
RJMP Init
.ORG 0x0001 ; INT0 - External Interrupt0 Vector Address; Внешнее прерывание 0 ;
RETI
.ORG 0x0002 ; INT1 - External Interrupt1 Vector Address; Внешнее прерывание 1 ;
RETI ; Ничего не делаем, возвращаемся в основную программу
.ORG 0x0003 ; ICP1 - Input Capture1 Interrupt Vector Address; Событие захват Таймера/Счетчика 1 ;
RETI
.ORG 0x0004 ; OC1A - Output Compare1A Interrupt Vector Address ;Событие "совпадение A" Таймера/Счетчика 1 ;
rjmp Sravnenie ;RETI
.ORG 0x0005 ; OC1B - Output Compare1B Interrupt Vector Address; Событие "совпадение B" Таймера/Счетчика 1 ;
RETI
.ORG 0x0006 ; OVF1 - Overflow1 Interrupt Vector Address; Переполнение Таймера/Счетчика 1 ;
RETI
.ORG 0x0007 ; OVF0 - Overflow0 Interrupt Vector Address; Переполнение Таймера/Счетчика 0 ;
RETI
.ORG 0x0008 ; SPI - SPI Interrupt Vector Address; Передача данных по SPI завершена
RETI
.ORG 0x0009 ; URXC - UART Receive Complete Interrupt Vector Address; Прием данных по UART завершена
RETI;RJMP RX_OK ; Переходим к обработчику прерывания
.ORG 0x000a ; UDRE - UART Data Register Empty Interrupt Vector Address; Регистр данных UART пуст
RETI
.ORG 0x000b ; UTXC - UART Transmit Complete Interrupt Vector Address; Передача данных по UART завершен
reti;
.ORG 0x000c ; ACI - Analog Comparator Interrupt Vector Address; Готов результат аналогового компаратора
RETI
.ORG 0x000d ; INT2 - External Interrupt2 Vector Address
RETI
.ORG 0x000e ; OC0 - Output Compare0 Interrupt Vector Address
RETI
.ORG 0x000f ; ERDY - EEPROM Interrupt Vector Address
RETI
.ORG 0x0010 ; SPM - SPM complete Interrupt Vector Address
RETI
;.ORG 0x0011 ; SPMR - SPM complete Interrupt Vector Address
; RETI
; .ORG INT_VECTORS_SIZE
;================ ; Конец таблицы векторов прерываний===
;============ Блок подпрограмм обработки прерываний ===========
Sravnenie:
in temp, PortB
eor temp,r17
out PortB,temp
sbi PortB, 4
reti
;================
Init:cli ; Первая выполняемая команда
;++++++++++++++ Сдержимое файла INITCORE.INC +++++++++++++++++++++++++
;==== Инициализация ядра: Память; Регистры; Стек =============
.include "INITCORE.inc"
;++++++++++++++ Конец Содержимого файла INITCORE.INC +++++++++++++++++
;================
ldi temp , 0b11111111 ; определяем входы\выходы порта В,
out DDRB , temp ; 1 делает вывод выходом, 0 - входом!
ldi temp , 0b00000000 ; определяем в\в порта D
out DDRD , temp
ldi temp , 0b11111111 ; включаем подтяжку (1) для входов порта В
out portB , temp ; и задаем начальние состояния выходов
ldi temp , 0b11111111 ; то же самое для D
out portD , temp
ldi temp , 0b00001011 ; запуск таймера T\C1 изменено!
out TCCR1B,temp
ldi temp, 0xFF;42
out OCR1AL,temp
ldi temp, 0xFF;0x1F
out OCR1AH,temp
ldi temp,(1<<OCIE1A) ; разрешение прерывание по сравнению
out TIMSK,temp
ldi r17 , 0b00000010
sei
;================
; Основное тело программы
Start:
nop
rjmp Start
Код: Выделить всё
.cseg
.org 0x0000
rjmp RESET
.org OC1Aaddr
rjmp TIM_OC1A
.org INT_VECTORS_SIZE
;--------------------------------
TIM_OC1A:
....
reti
;--------------------------------
RESET:
ldi r16, Low(RAMend)
out SPL, r16
ldi r16, High(RAMend)
out SPH, r16
.....
....
sei
;---------------------------------
LOOP: rjmp LOOP
Код: Выделить всё
;++++++++++++++ Сдержимое файла INITCORE.INC +++++++++++++++++++++++++
;==== Инициализация ядра: Память; Регистры; Стек =============
;================= Инициализация Памяти ====
RAM_Flush: LDI ZL,Low(SRAM_START) ; Адрес начала ОЗУ в индекс
LDI ZH,High(SRAM_START)
CLR R16 ; Очищаем R16
Flush: ST Z+,R16 ; Сохраняем 0 в ячейку памяти
CPI ZH,High(RAMEND) ; Достигли конца ОЗУ?
BRNE Flush ; Нет! Крутимся дальше!
; Старший байт достиг конца ОЗУ!!!
; Заполняем оставшиеся 255 байт ОЗУ нулями.
CPI ZL,Low(RAMEND) ; Младший байт достиг конца ОЗУ?
BRNE Flush ; Нет! Крутимся дальше, до конца ОЗУ.
ST Z , r16 ; Да? тогда очиаем последний адрес и выходим из цикла
;=============== Инициализация регистров ===
; Очищаем 32 индексных регистра R0-R31
ldi ZL, 30 ; ZL есть регистр R30
CLR ZH ; ZH есть регистр R31
dec Zl
st Z,ZH
BRNE PC-2
;================ Инициализация стека ======
LDI R16,Low(RAMEND) ; Обязательно!!!
OUT SPL,R16
LDI R16,High(RAMEND)
OUT SPH,R16
CLR R16
;++++++++++++++ Конец Содержимого файла INITCORE.INC +++++++++++++++++
не согласен, с точки зрения отладки VMLab гораздо удобней студии и несоизмеримо проще протеуса.ploop писал(а):... попробуй в VMLAB'e. Но студия всё равно удобней.
А в VMLAB'e это есть???ну где вы видели в студии осцилограф или семисегментник?
Уверен?slavik.ksu писал(а):Добрый Вечер! Возник вопрос по таймеру:
Запускаю таймер, разрешаю прерывание "по совпадению" в режиме СТС (то есть сброс при совпадении). В обработчике прерывания просто мигаю светодиодом. НЕ МИГАЕТСЯ!!!
и как понимать?может что подскажете?
Вот прогаКод: Выделить всё
вот нашел в старом проектеploop писал(а): А в VMLAB'e это есть???![]()
Код: Выделить всё
MOV R0 , CONST_VERY_LONG_NAME_1 + CONST_VERY_LONG_NAME_2 + CONST_VERY_LONG_NAME_3 + CONST_VERY_LONG_NAME_4 + CONST_VERY_LONG_NAME_5
Код: Выделить всё
MOV R0 , CONST_VERY_LONG_NAME_1 +
CONST_VERY_LONG_NAME_2 +
CONST_VERY_LONG_NAME_3 +
CONST_VERY_LONG_NAME_4 +
CONST_VERY_LONG_NAME_5