Ассемблер (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 КБ) 507 скачиваний
Аватара пользователя
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
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 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»