Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Prevan
Родился
Сообщения: 13
Зарегистрирован: Пт июн 11, 2010 16:44:07

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение 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
Реклама
Аватара пользователя
Modest
Сверлит текстолит когтями
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Modest »

Блин и как я раньше на асме писал :)
А где задержка, защита от дребезга контактов?
Програмка считает нажатия кнопок или выводит последовательно цифры от 1 и до ...8 ?
Так чуть чуть вспомнил и чуть разобрался :oops: Снимаю свой вопрос :oops:
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Реклама
Prevan
Родился
Сообщения: 13
Зарегистрирован: Пт июн 11, 2010 16:44:07

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Prevan »

Modest писал(а):Блин и как я раньше на асме писал :)
А где задержка, защита от дребезга контактов?
Програмка считает нажатия кнопок или выводит последовательно цифры от 1 и до ...8 ?
Так чуть чуть вспомнил и чуть разобрался :oops: Снимаю свой вопрос :oops:
Да, программа выдаёт номер нажатой клавиши на LCD
Подпрограммы задержки я вырезал из сообщения чтобы меньше места занимал код (в реальной программе они есть)
А насчёт дребезга хотел спросить как его можно реализовать, а то при нажатии сразу штуки по три одинаковых цифры выдаёт?
lenivec87
Родился
Сообщения: 4
Зарегистрирован: Пн мар 22, 2010 15:40:53

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение lenivec87 »

Здравствуйте. Начал изучать хмегу 128а3, нигде не могу найти примеров на асм. Кто-ниь может помосодействовать. Хочу хотя бы посмотреть как ее инициализировать? Принцип написания программ такой же как и на обычных авр?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Modest
Сверлит текстолит когтями
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Modest »

Здесь вот


scankeys:

rcall delay40us

здесь опросить ногу от которой прерывание пришло
сли истина то продолжаем с опросом клавы
если нет то разрешаем прерывание и снова уходим в цикл loop: rjmp loop

ну и дальше как есть
cbi PORTD,5 ; установить бит 5 порта C в «0»
..................


(извиняй синтаксис асма подзабыл по этому писал словами, щас на С уже 2 года)
задержку подобрать придётся опытным путём

Кстати а что там за схемка, как там прерывание реализованно от всех кнопок?
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Реклама
Prevan
Родился
Сообщения: 13
Зарегистрирован: Пт июн 11, 2010 16:44:07

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Prevan »

Modest писал(а):Кстати а что там за схемка, как там прерывание реализованно от всех кнопок?
прерывание происходит от любой нажатой кнопки
С дребезгом вопос ещё как-бы терпит, а вот почему первая единица всегда появляется - вот это для меня загадка
Вложение 4.JPG больше недоступно
Вложения
4.JPG
(91.21 КБ) 510 скачиваний
Реклама
Аватара пользователя
Modest
Сверлит текстолит когтями
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Modest »

Ну для начала нужно бы порты клавиатуры подтянуть резисторами.
Потом попробуй после инициализации портов обнульть их все, лишним не будет.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Prevan
Родился
Сообщения: 13
Зарегистрирован: Пт июн 11, 2010 16:44:07

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Prevan »

Modest писал(а):Ну для начала нужно бы порты клавиатуры подтянуть резисторами.
Потом попробуй после инициализации портов обнульть их все, лишним не будет.
А вообще для чего подключают подтягивающие резисторы?
Аватара пользователя
Modest
Сверлит текстолит когтями
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Modest »

Ну блин вопрос прямо в лоб :)

Без подтягивающих резисторов у тя на портах будет что попало.
Т. е. если у тя нога настроена на вход и физически она у тебя в воздухе висит ( никуда не подключена) то при считывании
с этой ноги не факт что на ней будет низкий уровень (т. е. "0").
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Rimsky »

Modest писал(а):Ну для начала нужно бы порты клавиатуры подтянуть резисторами.
На практике вполне хватает внутренних подтяжек порта (регистр PORTn выставляем в 1 при DDRn = 0 PUD = 0)
Аватара пользователя
Modest
Сверлит текстолит когтями
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Modest »

Да, а потом появляются вопросы "а почему уменя....."
в протеусе можно и поставить, не убудет.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Prevan
Родился
Сообщения: 13
Зарегистрирован: Пт июн 11, 2010 16:44:07

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Prevan »

Подайте идею как можно написать чтобы в подпрограмме содержание регистра уменьшалось каждый раз на единицу и как только доходило до нуля, по новой устанавливало значение и выполняло ещё ряд действий?

примерно:

ldi num, 10;
......
podprogramma:

dec num;
cpi num,0
brne met

met: ldi num, 10;
{и ещё ряд команд, которые выполняются когда num равно 0}
ret

только эта подпрограмма будет проходить через met даже если num>0
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение 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
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Engineer_Keen »

Подайте идею как можно написать чтобы в подпрограмме содержание регистра уменьшалось каждый раз на единицу и как только доходило до нуля, по новой устанавливало значение и выполняло ещё ряд действий?
CPI - убрать совсем, метку MET поставить перед RET. Все.

Код: Выделить всё

LDI num, 10
......
podprogramma:

DEC num;
BRNE MET

LDI num, 10
{и ещё ряд команд, которые выполняются когда num равно 0}
MET:
RET
Prevan
Родился
Сообщения: 13
Зарегистрирован: Пт июн 11, 2010 16:44:07

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение 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 он воспринимает как вывод данных, а не команд.
Prevan
Родился
Сообщения: 13
Зарегистрирован: Пт июн 11, 2010 16:44:07

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение 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 
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение alexval2006 »

товарищи может у кого есть примерчик по работе с PS2 клавиатурой а то нашёл букварь на си от АВР но хотелось бы на асме :)
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение GP1 »

если мне память не изменяет AVR318
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение AI_Disable »

Подскажите, какое минимальное число циклов может занять программный SPI? Конкретно интересует, можно ли уложиться в 100 тактов?
ЗЫ: 8 бит, mode 0
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Meteor »

Если не ошибаюсь, то минимум - 4 такта на бит.
Т.о. 8 бит будут переданы за 32 такта.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Ответить

Вернуться в «AVR»