скобки нужны конечно...
скобки нужны конечно...
перекинь с Pb0..Pb3 на Pb4..Pb7...uwrtey писал(а):http://radiokot.ru/forum/download/file.php?id=90498Что у тебя на ней висит?
- клавиатура(надо переделать...)
у меня ног не хватит !а вот если одиночные кнопки (1 кнопка на 1 пин порта) то лучше включать внутренний подтягивающий резистор и все ! никаких внешних больше не нужно, кнопка (ну или выключатель) одной ногой на порт, другой на землю..
нее, просто нужно делать интеллектуальный пульт управления.. с дисплеем и навигацией по менюuwrtey писал(а): у меня ног не хватит !(надо атмегу 64 тогда юзать)
Код: Выделить всё
.DSEG
key_buffer: .byte 5 ; зарезервируем 5 байт в ОЗУ
;************************************************************************
keyboardread:
ldi temp,5 ; количество столбцов клавы = пять
ldi R17,0b00000001 ; первый столбец
; загружаем адрес метки (key_buffer) находящейся в ОЗУ в регистровую пару X
ldi XL,low (key_buffer) ; младший байт адреса
ldi XH,high(key_buffer) ; старший байт адреса
keyboardread_loop: ; цикл опроса
out PortD,R17 ; выводим в порт "Д" значение "R17" для выбора столбца клавиатуры
in R18,PinB ; прочитали состояние столбца
st X+,R18 ; сохраним в ОЗУ состояние столбца клавы,
; адрес в регстровой паре "X" автоматом увеличится на 1
lsl R17 ; сдвинули единичку выбора столбца клавиатуры на 1
; позицию влево
dec temp ; уменьшим счетчик
brne keyboardread_loop ; если не все просканировали, то циклимся
ret ; возврат из подпрограммы
Код: Выделить всё
/*
* _147.asm
*
* Created: 24.08.2012 00:12:55
* Author: UWRTEY
*/
;.include "d:\avr\avrasm\appnotes\attyny2313def.inc"
.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
.def Temp5=R21
.def Temp6=R22
.def Temp7=R23
.def Temp8=R24
.def Temp9=R25
.dseg ;оперативка
key_buff: .byte 5 ; зарезервируем 5 байт в ОЗУ
;******************************************************************************
;******************************************************************************
.cseg
.org 0
rjmp RESET ; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
rjmp INT0 ; External Interrupt Request 0
rjmp INT1 ; External Interrupt Request 1
rjmp TIMER1 ; CAPT Timer/Counter1 Capture Event
rjmp TIMER1 ; COMPA Timer/Counter1 Compare Match A
rjmp TIMER1 ; OVF Timer/Counter1 Overflow
rjmp TIMER0 ; OVF Timer/Counter0 Overflow
rjmp USART0 ; RX USART0, Rx Complete
rjmp USART0 ; UDRE USART0 Data Register Empty
rjmp USART0 ; TX USART0, Tx Complete
rjmp ANALOG ; COMP Analog Comparator
rjmp PCINT ; Pin Change Interrupt
rjmp TIMER1 ; COMPB Timer/Counter1 Compare Match B
rjmp TIMER0 ; COMPA Timer/Counter0 Compare Match A
rjmp TIMER0 ; COMPB Timer/Counter0 Compare Match B
rjmp USI ; START USI Start Condition
rjmp USI ; OVERFLOW USI Overflow
rjmp EE ; READY EEPROM Ready
rjmp WDT ; OVERFLOW Watchdog Timer Overflow
;RESET: ; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset////
INT0: ; External Interrupt Request 0
INT1: ; External Interrupt Request 1
TIMER1: ; CAPT Timer/Counter1 Capture Event
;TIMER1: ; COMPA Timer/Counter1 Compare Match A/////////////////////////////////
TIMER1: ; OVF Timer/Counter1 Overflow
TIMER0: ; OVF Timer/Counter0 Overflow
USART0: ; RX USART0, Rx Complete
USART0: ; UDRE USART0 Data Register Empty
USART0: ; TX USART0, Tx Complete
ANALOG: ; COMP Analog Comparator
PCINT: ; Pin Change Interrupt
TIMER1: ; COMPB Timer/Counter1 Compare Match B
TIMER0: ; COMPA Timer/Counter0 Compare Match A
TIMER0: ; COMPB Timer/Counter0 Compare Match B
USI: ; START USI Start Condition
USI: ; OVERFLOW USI Overflow
EE: ; READY EEPROM Ready
WDT: ; OVERFLOW Watchdog Timer Overflow
reti ; выход из обраьотчика прерываний
;******************************************************************************
;******************************************************************************
;инициализация стека
;******************************************************************************
reset: ;включение микроконтроллера
ldi Temp,0b01000000 ;разрешить прерывание компаратора
out TIMSK,Temp
ldi Temp,0b00000001 ;тактовый сигнал = CK (1:1)
out TCCR1B,Temp
; инициализация компаратора
ldi Temp,0xC ; 3кГц, 1/3000=0,00033сек=330мкс, 330/2=165мкс длительность импульса или паузы
out OCR1AH,Temp ; 0,05мкс*65535=3276,75 3276,75>165 --- по этому не будем делить тактовую частоту (СК)
ldi Temp,0xE4 ; 165мкс/0,05мкс=3300 тиков таймера 3300=CE4(hex)
out OCR1AL,Temp ;
ldi Temp,0 ;обнуление таймера при включении
out TCNT1H,Temp
out TCNT1L,Temp
ldi Temp,RamEnd ;еще один вариант записи ldi temp, low(Ramend)
out SPL,Temp ;инициализации стека out SPL, temp
cei ;глобальное разрешение прерываний
;******************************************************************************
;*******************************************************************************
;настройка портов
;*******************************************************************************
ldi Temp,0b11110000
out DDRB,Temp ;настроили порт "В"
;х0000000 - вывод на передатчик
;00Х00000 - ДЛЯ ГЕНЕРАЦИИ (НЕ ЗНАЮ ЧТО ДЕЛАТЬ - ВЫХОД ИЛИ ВХОД)
;0000хххх - для чтения клавиатуры
ldi Temp,0b01111111
out DDRD,Temp ;настраиваем порт "D" на вывод(запись)(0-ввод, 1-вывод)
;но не весь, а только шесть млажших бит (PD0-PD5)
;к которым прицеплены четыре столбца клавиатуры
;и остальные настроил на вывод, для того что бы
;при их чтении получит не чёрте-че, а четкий ноль
;*только самый старши бит настроен на ВВОД (потому что в порте "D" отсутсвует эта нога)
;*******************************************************************************
; Чтение клавы и запись данных в ОЗУ
;*******************************************************************************
keyboardreed: ;метка - опрос клавиатуры
ldi Temp,5 ; количество столбцов клавы = пять
ldi Temp1,0b00000001 ; первый столбец
; загружаем адрес метки (key_buff) находящейся в ОЗУ в регистровую пару X
ldi XL,low(key_buff) ; младший байт адреса
ldi XH,high(key_buff) ; старший байт адреса
keyboardread_loop: ; цикл опроса
out PortD,Temp1 ; выводим в порт "Д" значение "Temp1" для выбора столбца клавиатуры
in Temp2,PinB ; прочитали состояние столбца
st X+,Temp2 ; сохраним в ОЗУ состояние столбца клавы,
; адрес в регстровой паре "X" автоматом увеличится на 1
lsl Temp1 ; сдвинули единичку выбора столбца клавиатуры на 1
; позицию влево
dec temp ; уменьшим счетчик
brne keyboardread_loop ; если не все просканировали, то циклимся
rjamp keyboardreed ; зациклились бесконечно опрашивать клаву и перезаписывать данные
;*********************************************************************************
;ОБРАБОТКА ПРЕРЫВАНИЯ////////
;*********************************************************************************
TIMER1:
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp
.......
reti
Код: Выделить всё
TIMER1:
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp
out_dat:
Ldi ZL,Low(key_buff) ; загрузили в регистровую пару "Z" адресс метки "key_buff" (массива из ОЗУ)
Ldi ZH,High(key_buff)
Ld Temp1,Z+ ; загрузили в регистр "Temp1" данные из ОЗУ, по адресу из регистровой пары "Z"
; адресс автоматически увеличился на еденицу
Код: Выделить всё
ldi Temp,0b01000000 ;разрешить прерывание компаратора
out TIMSK,Temp
то есть константе OCIE1A ему уже присвоен номер бита который нужно установить в порту.equ OCIE1A = 6 ; Timer/Counter1 Output CompareA Match Interrupt Enable
Код: Выделить всё
ldi Temp, (1<<OCIE1A) ;разрешить прерывание компаратора
out TIMSK,Temp
Код: Выделить всё
;.include "d:\avr\avrasm\appnotes\attyny2313def.inc"
.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
.def Temp5=R21
.def Temp6=R22
.def Temp7=R23
.def Temp8=R24
.def Temp9=R25
.dseg ;оперативка
key_buff: .byte 5 ; зарезервируем 5 байт в ОЗУ
;******************************************************************************
;******************************************************************************
.cseg
.org 0
rjmp RESET ; ну или START - как тебе приятнее :-)
.org INT0addr ; 0x0001 ; External Interrupt Request 0
reti
.org INT1addr ; 0x0002 ; External Interrupt Request 1
reti
.org ICP1addr ; 0x0003 ; Timer/Counter1 Capture Event
reti
.org OC1Aaddr ; 0x0004 ; Timer/Counter1 Compare Match A
reti
.org OC1addr ; 0x0004 ; For compatibility
reti
.org OVF1addr ; 0x0005 ; Timer/Counter1 Overflow
reti
.org OVF0addr ; 0x0006 ; Timer/Counter0 Overflow
reti
.org URXCaddr ; 0x0007 ; USART, Rx Complete
reti
.org URXC0addr ; 0x0007 ; For compatibility
reti
.org UDREaddr ; 0x0008 ; USART Data Register Empty
reti
.org UDRE0addr ; 0x0008 ; For compatibility
reti
.org UTXCaddr ; 0x0009 ; USART, Tx Complete
reti
.org UTXC0addr ; 0x0009 ; For compatibility
reti
.org ACIaddr ; 0x000a ; Analog Comparator
reti
.org PCIBaddr ; 0x000b ; Pin Change Interrupt Request B
reti
.org PCIaddr ; 0x000b ; For compatibility
reti
.org OC1Baddr ; 0x000c ;
reti
.org OC0Aaddr ; 0x000d ;
reti
.org OC0Baddr ; 0x000e ;
reti
.org USI_STARTaddr ; 0x000f ; USI Start Condition
reti
.org USI_OVFaddr ; 0x0010 ; USI Overflow
reti
.org ERDYaddr ; 0x0011 ;
reti
.org WDTaddr ; 0x0012 ; Watchdog Timer Overflow
reti
.org PCIAaddr ; 0x0013 ; Pin Change Interrupt Request A
reti
.org PCIDaddr ; 0x0014 ; Pin Change Interrupt Request D
reti
Код: Выделить всё
.def Temp=R16 ; это временный регистр для операций
.def loopCount=R17 ; счетчик циклов
.def bitPointer=R18 ; битовый указатель
Код: Выделить всё
RESET:
cli ; запретили прерывания
Код: Выделить всё
LDI temp, low(ramend)
out spl, temp
Код: Выделить всё
ldi Temp,0b10000000
out DDRB,Temp ;настроили порт "В"
;х0000000 - выход на передатчик
;0000хххх - вход чтения клавиатуры
ldi Temp,0b00011111
out DDRD,Temp ;настраиваем порт "D" на вывод(запись)(0-ввод, 1-вывод), 5 младших линий на выход (линии клавиатуры)