Проект:
Для начала - просто часы, которые показывают время с точностью до минуты, ну и само собой настройка.
Управление обычными кнопками, тактовый генератор - часовой кварц
slavik.ksu писал(а):да, странно, но PB5 все таки не горит! только 4ый.. но это пока для меня не столь важно.
Код: Выделить всё
; выполняемые функции: через модуль UART от компьютера принимаем числа
; которые отображаются на 8 СИДах в двоичном коде.
.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 ;
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 завершена
rjmp PriemZavershen ; Переходим к обработчику прерывания
.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
;================ ; Конец таблицы векторов прерываний===
;============ Блок подпрограмм обработки прерываний ===========
PriemZavershen:
in temp,UDR
out PortB,temp
reti
;============ конец Блока подпрограмм обработки прерываний ===========
;=================== Основная программа ====
Init:
;++++++++++++++ Сдержимое файла 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 , 0b00000000 ; то же самое для D
out portD , temp
ldi temp, 1<<RXEN|1<<RXCIE ; разрешаем прием и прерывание по приему по UART
out UCSRB, temp
ldi temp,25 ; задаем скорость UART = 9600
out UBRRL, temp
ldi r16, (1<<URSEL|1<<UCSZ0|1<<UCSZ1) ; 8-мибитный формат посылки
out UCSRC,r16
sei ; глобально разрешаем прерывания!
;==== Коенц Инициализация внутренних периферийных устройств====
;======= Главный цикл =====
Start:
nop
rjmp Start
Engineer_Keen писал(а):Что в INITCORE.inc и на какой частоте работает МК? Должно быть 4МГц, судя по UBRRL=25...
Код: Выделить всё
;++++++++++++++ Сдержимое файла 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 +++++++++++++++++
ploop писал(а):Если послать $FF - все должны загореться, $00 - все потухнуть на portB. Это работает?
ploop писал(а):Только посылать не символы, а байты.
ploop писал(а): Если не получается послать байты, пошлите русскую "р" (эр) в кодировке win1251 её код будет 240 ($F0) или 11110000 в двоичной, т.е. должны загореться первые 4 светодиода.