Страница 44 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 10:30:46
Prevan
Здравствуйте! Подскажите почему при запуске программы на дисплей сразу выдаётся цифра "1", хотя на дисплей должны выдаваться цифры только при нажатии клавиш
Код: Выделить всё
;******************************************************
.include "8515def.inc" ;файл определений AT90S8515
.def temp=r16 ;временная переменная
.def lcd=r22 ;регистр LCD (ЖК-дисплея)
.equ rs=5 ; (RS=1) - данные, (RS=0) - команды
.equ rw=4 ; (RW=1) - чтение LCD, (RW=0) - запись в LCD
.equ e=3 ;строб сигналов на шине команды/данные
.org $000
rjmp init
.org $007
rjmp scankeys ;обработка клавиатуры
;Инициализация
init:
ldi temp,low(RAMEND) ;Инициализация
out spl,temp ;указателя стека
ldi temp,high(RAMEND)
out sph,temp
;Инициализация портов
ser temp
out DDRA,temp ;порт РА на вывод
ldi temp,$30
out DDRC,temp ; конфигурируем биты 4, 5 порта C на вывод.
ldi temp,$38 ;линии порта PD4-PD5 на вывод,
out DDRD,temp
ldi temp,$0F ;PC0-PC3 на ввод
out PORTC,temp
;Инициализация таймера 0
ldi temp,$05
out TCCR0,temp ;коэффициент деления 1024
ldi temp, (1<<TOIE0)
out TIMSK, temp ;разрешение прерываний от таймера
;Инициализация ЖК-дисплея
rcall delay2ms
ldi lcd,$38 ;8-битовый режим вывода,
rcall lcdcom ;2 строки, шрифт 5х7
ldi lcd,$06 ;Направление сдвига курсора вправо, без сдвига дисплея
rcall lcdcom
ldi lcd,$0C ;включить дисплей
rcall lcdcom ;погасить курсор
ldi lcd,$01 ;Очистить дисплей и установить курсор в нулевую позицию
rcall lcdcom
rcall delay2ms
sei ;разрешение прерываний
loop: rjmp loop
;Подпрограмма обработки клавиатуры
scankeys:
cbi PORTD,5 ; установить бит 5 порта C в «0»
sbi PORTD,4 ; установить бит 4 порта C в «1»
ldi lcd,0x31 ; загрузить цифру "1" в регистр lcd
SBIC PINC,0 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x32 ; загрузить цифру "2" в регистр lcd
SBIC PINC,1 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x33 ; загрузить цифру "3" в регистр lcd
SBIC PINC,2 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x34 ; загрузить цифру "4" в регистр lcd
SBIC PINC,3 ; если сброшен пропустить следующую команду
rcall lcddat
cbi PORTD,4 ; установить бит 4 порта C в «0»
sbi PORTD,5 ; установить бит 5 порта C в «1»
ldi lcd,0x35 ; загрузить цифру "5" в регистр lcd
SBIC PINC,0 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x36 ; загрузить цифру "6" в регистр lcd
SBIC PINC,1 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x37 ; загрузить цифру "7" в регистр lcd
SBIC PINC,2 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x38 ; загрузить цифру "8" в регистр lcd
SBIC PINC,3 ; если сброшен пропустить следующую команду
rcall lcddat
reti
;Подпрограмма вывода на дисплей байта команды
lcdcom:
out PORTA,lcd ;вывод команды
ldi temp,0x08 ;установка режима записи команд
out PORTD,temp
cbi PORTD,e ;фронт 1/0 строба
rcall delay40us
ret
;Подпрограмма вывода на дисплей байта данных
lcddat:
out PORTA,lcd ;вывод символа
ldi temp,0x20 ;установка режима записи данных
out PORTC,temp
ldi temp,0x08 ;установка режима записи данных
out PORTD,temp
cbi PORTD,e ;фронт 1/0 строба
rcall delay40us
ret
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 10:51:08
Modest
Блин и как я раньше на асме писал
А где задержка, защита от дребезга контактов?
Програмка считает нажатия кнопок или выводит последовательно цифры от 1 и до ...8 ?
Так чуть чуть вспомнил и чуть разобрался

Снимаю свой вопрос

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 11:06:18
Prevan
Modest писал(а):Блин и как я раньше на асме писал
А где задержка, защита от дребезга контактов?
Програмка считает нажатия кнопок или выводит последовательно цифры от 1 и до ...8 ?
Так чуть чуть вспомнил и чуть разобрался

Снимаю свой вопрос

Да, программа выдаёт номер нажатой клавиши на LCD
Подпрограммы задержки я вырезал из сообщения чтобы меньше места занимал код (в реальной программе они есть)
А насчёт дребезга хотел спросить как его можно реализовать, а то при нажатии сразу штуки по три одинаковых цифры выдаёт?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 11:08:26
lenivec87
Здравствуйте. Начал изучать хмегу 128а3, нигде не могу найти примеров на асм. Кто-ниь может помосодействовать. Хочу хотя бы посмотреть как ее инициализировать? Принцип написания программ такой же как и на обычных авр?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 11:21:23
Modest
Здесь вот
scankeys:
rcall delay40us
здесь опросить ногу от которой прерывание пришло
сли истина то продолжаем с опросом клавы
если нет то разрешаем прерывание и снова уходим в цикл loop: rjmp loop
ну и дальше как есть
cbi PORTD,5 ; установить бит 5 порта C в «0»
..................
(извиняй синтаксис асма подзабыл по этому писал словами, щас на С уже 2 года)
задержку подобрать придётся опытным путём
Кстати а что там за схемка, как там прерывание реализованно от всех кнопок?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 11:31:40
Prevan
Modest писал(а):Кстати а что там за схемка, как там прерывание реализованно от всех кнопок?
прерывание происходит от любой нажатой кнопки
С дребезгом вопос ещё как-бы терпит, а вот почему первая единица всегда появляется - вот это для меня загадка
Вложение 4.JPG больше недоступно
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 11:44:55
Modest
Ну для начала нужно бы порты клавиатуры подтянуть резисторами.
Потом попробуй после инициализации портов обнульть их все, лишним не будет.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 11:59:02
Prevan
Modest писал(а):Ну для начала нужно бы порты клавиатуры подтянуть резисторами.
Потом попробуй после инициализации портов обнульть их все, лишним не будет.
А вообще для чего подключают подтягивающие резисторы?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 12:26:50
Modest
Ну блин вопрос прямо в лоб
Без подтягивающих резисторов у тя на портах будет что попало.
Т. е. если у тя нога настроена на вход и физически она у тебя в воздухе висит ( никуда не подключена) то при считывании
с этой ноги не факт что на ней будет низкий уровень (т. е. "0").
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 14:03:06
Rimsky
Modest писал(а):Ну для начала нужно бы порты клавиатуры подтянуть резисторами.
На практике вполне хватает внутренних подтяжек порта (регистр PORTn выставляем в 1 при DDRn = 0 PUD = 0)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 14:19:21
Modest
Да, а потом появляются вопросы "а почему уменя....."
в протеусе можно и поставить, не убудет.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 15:08:38
Prevan
Подайте идею как можно написать чтобы в подпрограмме содержание регистра уменьшалось каждый раз на единицу и как только доходило до нуля, по новой устанавливало значение и выполняло ещё ряд действий?
примерно:
ldi num, 10;
......
podprogramma:
dec num;
cpi num,0
brne met
met: ldi num, 10;
{и ещё ряд команд, которые выполняются когда num равно 0}
ret
только эта подпрограмма будет проходить через met даже если num>0
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 15:20:30
Rimsky
Prevan писал(а):Подайте идею как можно написать чтобы в подпрограмме содержание регистра уменьшалось каждый раз на единицу и как только доходило до нуля, по новой устанавливало значение и выполняло ещё ряд действий?
примерно:
ldi num, 10;
......
podprogramma:
dec num;
cpi num,0
brne met
met: ldi num, 10;
{и ещё ряд команд, которые выполняются когда num равно 0}
ret
только эта подпрограмма будет проходить через met даже если num>0
ldi r16, 10
loop:
dec r16
brne loop
inc r17
cpi r17, 1
breq metka1
cpi r17, 2
breq metka2
cpi r17, 3
breq metka3
cpi r17, 4
breq metka4
metka1:
rjmp loop
metka2:
rjmp loop
metka3:
rjmp loop
metka4:
rjmp loop
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 15:26:23
Engineer_Keen
Подайте идею как можно написать чтобы в подпрограмме содержание регистра уменьшалось каждый раз на единицу и как только доходило до нуля, по новой устанавливало значение и выполняло ещё ряд действий?
CPI - убрать совсем, метку MET поставить перед RET. Все.
Код: Выделить всё
LDI num, 10
......
podprogramma:
DEC num;
BRNE MET
LDI num, 10
{и ещё ряд команд, которые выполняются когда num равно 0}
MET:
RET
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 20:09:20
Prevan
Попробовал сделать согласно алгоритму функцию, которая бы при заполнении строки дисплея очищала её и ставила курсор в начальную позицию:
Код: Выделить всё
lcddat:
out PORTA,lcd ;вывод символа
ldi temp,0x20 ;установка режима записи данных
out PORTC,temp
ldi temp,0x08 ;установка режима записи данных
out PORTD,temp
cbi PORTD,e ;фронт 1/0 строба
rcall delay40us
rcall del200 ;задержка в 200мс от дребезга контактов
dec num ;начало обработки значения количества выведенных символов
cpi num,0
breq met ;переход на met если курсор дошёл до конца строки или
ret ;возврат к основной программе
met:
ldi lcd,$01 ;Очистить дисплей и установить курсор в нулевую позицию
rcall lcdcom
ldi num,5 ;снова установить значение num=5
ret
при нажатии значения кнопок выводятся подряд пять символов, затем идёт пробел и опять пять символов, т.е. как я понял, команду ldi lcd,$01 он воспринимает как вывод данных, а не команд.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср июн 16, 2010 20:22:28
Prevan
Engineer_Keen писал(а):
CPI - убрать совсем, метку MET поставить перед RET. Все.
Так тоже попробовал сделать, результат точно такой же: команду очистки дисплея "ldi lcd,$01" он воспринимает как данные, выводимые на дисплей, то есть "пробел". В данном случае выдаётся пять значений, затем "пробел", затем снова пять значений:
Код: Выделить всё
;******************************************************
.include "8515def.inc" ;файл определений AT90S8515
.def temp=r16 ;временная переменная
.def temp1=r17
.def temp2=r18
.def num=r19
.def lcd=r22 ;регистр LCD (ЖК-дисплея)
.equ rs=5 ; (RS=1) - данные, (RS=0) - команды
.equ rw=4 ; (RW=1) - чтение LCD, (RW=0) - запись в LCD
.equ e=3 ;строб сигналов на шине команды/данные
.org $000
rjmp init
.org $007
rjmp scankeys ;обработка клавиатуры
;Инициализация
init:
ldi temp,low(RAMEND) ;Инициализация
out spl,temp ;указателя стека
ldi temp,high(RAMEND)
out sph,temp
;Инициализация портов
ser temp
out DDRA,temp ;порт РА на вывод
ldi temp,$30
out DDRC,temp ; конфигурируем биты 4, 5 порта C на вывод.
ldi temp,$38 ;линии порта PD4-PD5 на вывод,
out DDRD,temp
ldi temp,$0F ;PC0-PC3 на ввод
out PORTC,temp
;Инициализация таймера 0
ldi temp,$05
out TCCR0,temp ;коэффициент деления 1024
ldi temp, (1<<TOIE0)
out TIMSK, temp ;разрешение прерываний от таймера
;Инициализация ЖК-дисплея
rcall delay2ms
ldi lcd,$38 ;8-битовый режим вывода,
rcall lcdcom ;2 строки, шрифт 5х7
ldi lcd,$06 ;Направление сдвига курсора вправо, без сдвига дисплея
rcall lcdcom
ldi lcd,$0C ;включить дисплей
rcall lcdcom ;погасить курсор
ldi lcd,$01 ;Очистить дисплей и установить курсор в нулевую позицию
rcall lcdcom
rcall delay2ms
ldi num,5
sei ;разрешение прерываний
loop:
rjmp loop
;Подпрограмма обработки клавиатуры
scankeys:
cbi PORTD,5 ; установить бит 5 порта C в «0»
sbi PORTD,4 ; установить бит 4 порта C в «1»
ldi lcd,0x31 ; загрузить цифру "1" в регистр lcd
SBIC PINC,0 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x32 ; загрузить цифру "2" в регистр lcd
SBIC PINC,1 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x33 ; загрузить цифру "3" в регистр lcd
SBIC PINC,2 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x34 ; загрузить цифру "4" в регистр lcd
SBIC PINC,3 ; если сброшен пропустить следующую команду
rcall lcddat
cbi PORTD,4 ; установить бит 4 порта C в «0»
sbi PORTD,5 ; установить бит 5 порта C в «1»
ldi lcd,0x35 ; загрузить цифру "5" в регистр lcd
SBIC PINC,0 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x36 ; загрузить цифру "6" в регистр lcd
SBIC PINC,1 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x37 ; загрузить цифру "7" в регистр lcd
SBIC PINC,2 ; если сброшен пропустить следующую команду
rcall lcddat
ldi lcd,0x38 ; загрузить цифру "8" в регистр lcd
SBIC PINC,3 ; если сброшен пропустить следующую команду
rcall lcddat
reti
;Подпрограмма вывода на дисплей байта команды
lcdcom:
out PORTA,lcd ;вывод команды
ldi temp,0x08 ;установка режима записи команд
out PORTD,temp
cbi PORTD,e ;фронт 1/0 строба
rcall delay40us
ret
;Подпрограмма вывода на дисплей байта данных
lcddat:
out PORTA,lcd ;вывод символа
ldi temp,0x20 ;установка режима записи данных
out PORTC,temp
ldi temp,0x08 ;установка режима записи данных
out PORTD,temp
cbi PORTD,e ;фронт 1/0 строба
rcall delay40us
rcall del200 ;задержка в 200мс от дребезга контактов
dec num ;КОД ПО НОВОМУ АЛГОРИТМУ
brne met ;переход на met если num=0
ldi num,5 ;значение num установить снова
ldi lcd,$01 ;Очистить дисплей и установить курсор в нулевую позицию
rcall lcdcom
met: ;переход к основной программе
ret
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 27, 2010 14:22:21
alexval2006
товарищи может у кого есть примерчик по работе с PS2 клавиатурой а то нашёл букварь на си от АВР но хотелось бы на асме

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 27, 2010 20:04:22
GP1
если мне память не изменяет AVR318
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн июн 28, 2010 00:00:07
AI_Disable
Подскажите, какое минимальное число циклов может занять программный SPI? Конкретно интересует, можно ли уложиться в 100 тактов?
ЗЫ: 8 бит, mode 0
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн июн 28, 2010 07:03:30
Meteor
Если не ошибаюсь, то минимум - 4 такта на бит.
Т.о. 8 бит будут переданы за 32 такта.