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

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 89
Зарегистрирован: Вт мар 31, 2015 01:12:46

Сообщение dumbass »

Доброго времени суток!
Вопрос по работе с матричной клавиатурой. Программа выводит на св-диоды в двоичном виде номер нажатой клавиши. Кнопок 16.
У меня корректно срабатывают и выводятся значения, соответствующие 1, 2, 4, 8, 16 в двоичном виде.
При нажатии любой другой кнопки не светится ничего, точнее на мгновение загораются нужные светодиоды, но сразу же гаснут. Такое впечатление, будто в порт светодиодов следом за нужным значением выводится ноль.
Подтяжки на входах есть
В студии при отладки вроде все ок
В протеусе работает
На практике нет)
(возможно скопировать текст и вставить в новый лист в студии будет удобнее для глаз. Почему то тут текст "съезжает")
Спасибо за ответы!
Спойлер

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

/* МАТРИЧНАЯ КЛАВИАТУРА с выводом в порт двоичного значения (на дисплей символа) нажатой кнопкой
Программа производит считывание матричной клавиатуры. 
При нажатой кнопке - выводим ее двухзначный код, иначе - выводим "0".

Матричная клавиатура состоит из 16 клавиш
МЛАДШИЕ 4 разряда порта - столбцы
СТАРШИЕ 4 разряда порта - строки
1 клавиша - на пересечении "1" и "А".

Микроконтроллер		ATtiny2313
Тактовая частота	8 MHz
*/

.include "tn2313def.inc"

;НАСТРОЙКА ПОРТОВ
.def	temp		=R16
.def	line		=R17
.def	column		=R18
.def	number		=R19
.def	count_delay	=R20

.equ	PORT_LED	=PORTD
.equ	PORT_SW		=PORTB
.equ	PIN_SW		=PINB

.cseg
.org	0x00	rjmp	init

;ИНИЦИАЛИЗАЦИЯ
init:		ldi		temp,low(RAMEND)			;Инициализация стековой памяти
	  		out		SPL,temp

			ser		temp	
			out		DDRD,temp					;Порт D	на выход с 0
			clr		temp
			out		PORT_LED,temp
	
			ldi		temp,0x0F					;Младшая тетрада - выход с 0
			out		DDRB,temp					;Старшая тетрада - вход  с подтяжкой
			swap	temp
			out		PORT_SW,temp

;ОСНОВНОЙ ЦИКЛ
MAIN:		rcall	Keyboard
			out		PORT_LED,number
			clr		number
			rjmp	MAIN

Keyboard:	ldi		column,0b11111110			;Обнуление первого столбеца
Next_column:rcall	Ch_of_line					;Вызов подпрограммы проверки строк
			brne	SW_press					;Если кнопка нажата, то Z=0 (в регистре line осталось какое то число)
			rol		column						;Обнуление след. столбца
			sbrc	column,4					;Если еще/уже не были/были обнулены все столбцы по очередно, то
			rjmp	Next_column					;-обнуляем следующый  	столбец
			rjmp	Keyboard					;-обнуляем снова первый столбец


SW_press:	rcall	delay

			rcall	Ch_of_line					;Считывание устойчивого состояния
			breq	Keyboard					;В случае ложного срабатывания (от помехи) - опрашиваем заново
			mov		R5,line						;Сохранение значения

			rcall	Ch_of_line					;Ожидание отпускания кнопки
			brne	PC-1						;

			rcall	delay

			mov		line,R5
			add		number,line					;Загрузка в регистр number относительного адреса нажатой клавиши
			lsr		column						;Определение абсолютного адреса нажатой клавиши
			brcc	Exit_SW
			subi	number,-4
			rjmp	PC-3

			
Ch_of_line:	out		PORT_SW,column				;Обнуление выбранного столбеца
			ldi		line,5						;Регистр будет сдвинут 4 раза
			in		temp,PIN_SW					;Считывание состояния Вывода порта SW
m1:			dec		line
			breq	Exit_SW			
			lsl		temp						;Сдвиг регистра для определения нажатой кнопки
			brcs	m1
Exit_SW:	ret


delay:
; =========== 
;    delay loop generator 
;     400000 cycles:
; ----------------------------- 
; delaying 399999 cycles:
          ldi  R21, $97
WGLOOP0:  ldi  R22, $06
WGLOOP1:  ldi  R23, $92
WGLOOP2:  dec  R23
          brne WGLOOP2
          dec  R22
          brne WGLOOP1
          dec  R21
          brne WGLOOP0
; ----------------------------- 
; delaying 1 cycle:
          nop
; =========== 

			ret
Реклама
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

1 - Даю файлы из старого проекта. Я на асме проекты уже несколько лет не пишу. Разбираетесь сами.
2 - Матричная клавиатура подключена без диодов. Пины-входы подтянуты к + питания резисторами 10 кОм. Комбинаций клавиш ограниченное количество, нужно садиться и анализировать. Либо писать тестовую программу, которая выводит состояние клавы на светодиоды, на дисплей, по интерфейсу.
3 - Цикл статей Татарчевского. По статьям будет понятен мой код.
Сначала хотел отдельные файлы выложить, решил весь проект отдать. Видео тут.
LCD_4.rar
(29.35 КБ) 223 скачивания
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3820099#p3820099"]да, r16 - это тоже имя. и меня всегда бесило, зачем в многочисленных примерах плодят эти новые имена temp, temp1 и тому подобное.[/uquote]
Очевидно - использование именованной сущности вместо "магического числа". Другое дело, что нет смысла вводить свои магические числа вроде temp1, temp2, temp100500, да еще не соответствующие своему имени.
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3820099#p3820099"]
COKPOWEHEU писал(а):А чем регистр по имени temp лучше регистра по имени r16?
да, r16 - это тоже имя. и меня всегда бесило, зачем в многочисленных примерах плодят эти новые имена temp, temp1 и тому подобное. логика такой замены сомнительна (для меня)....[/uquote]
Переприсвоение имен для АВРки вполне оправдано.
Регистровый файл достаточно универсален и позволяет применять в отношении регистров собственную модель (единую для конкретного проекта) наиболее удобную в каждом отдельном случае.
Я обычно ставлю во фрагменте файла переопределения имен вот такой шаблон:
Спойлер;________________________
;таблица обьявленных имен - переназначение регистров РОН
;
; принята базовая модель:
; область ограниченного функционала
; .def mfr0 = r0 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def mfr1 = r1 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def = r2 ;(ограниченный функционал)
; .def = r3 ;(ограниченный функционал)
; .def = r4 ;(ограниченный функционал)
; .def = r5 ;(ограниченный функционал)
; .def = r6 ;(ограниченный функционал)
; .def = r7 ;(ограниченный функционал)
; .def = r8 ;(ограниченный функционал)
; .def = r9 ;(ограниченный функционал)
; .def = r10 ;(ограниченный функционал)
; .def = r11 ;(ограниченный функционал)
; .def = r12 ;(ограниченный функционал)
; .def = r13 ;(ограниченный функционал)
; .def = r14 ;(ограниченный функционал)
; .def = r15 ;(ограниченный функционал)
; область полного функционала
.def tmp0 = r16 ; рабочий регистр (полный функционал)
.def tmp1 = r17 ; рабочий регистр (полный функционал)
; .def = r18 ;(полный функционал)
; .def = r19 ;(полный функционал)
; .def = r20 ;(полный функционал)
; .def = r21 ;(полный функционал)
; .def = r22 ;(полный функционал)
; .def = r23 ;(полный функционал)
; .def = r24 ;("указатель базы" полный функционал)
; .def = r25 ;("указатель базы" полный функционал)
; Xl = r26 ; адрес сегмента Х (полный функционал)
; Xh = r27 ; адрес сегмента Х (полный функционал)
; Yl = r28 ; адрес сегмента Y (полный функционал)
; Yh = r29 ; адрес сегмента Y (полный функционал)
; Zl = r30 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; Zh = r31 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; регистры Xh:Xl, Yh:Yl, Zh:Zl определены в дефайне изготовителя и в системе команд
; изменение их имени хотя и возможно, но нежелательно -
; возникает путаница с интегрированной абревиатурой системы команд
; в случае с "малой моделью" допускающей/достаточной для размещения ВСЕХ
; используемых ВСЕМИ подпрограммами регистров в области СОЗУ регистрового
; файла одновременно (без "подкачки" наборов параметров через ОЗУ)
; рекомендовано переназначение индивидуальных имен регистров
; согласно текущей задачи
;
:roll:
Реклама
Эиком - электронные компоненты и радиодетали
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

[uquote="BOB51",url="/forum/viewtopic.php?p=3820561#p3820561"]...[/uquote]
Ерунда, а не шаблон.
1 - Написано то, что и так известно.
2 - Команда LPM более доступна, чем кажется. Уточняйте в даташитах на конкретные камни.
3 - Слишком много писанины непонятно для какой цели. Когда вы начинали, может быть это и было полезно. На нынешний момент, как минимум, касаемо команды LPM, устарела.

У меня такой вариант шаблона:
Спойлер

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

//==================
//----------- List used register -----------------------------------------
//                         n/u - Not Used
//                   = r0  result multiply
//                   = r1  result multiply
.def  RSREG          = r2
.def  CNT_LCD        = r3
.def  CNT_2          = r4
.def  KEYS_PREV      = r5
.def  KEYS_CURRENT   = r6
//                   = r7
//                   = r8
//                   = r9
//                   = r10
//                   = r11
//                   = r12
//                   = r13 n/u
//                   = r14 Used.
//                   = r15 Used.
//------------------------------------------------------------------------
.def  TEMP           = r16 // Used. Everywhere
//                   = r17 Used. Everywhere
//                   = r18 Used. Everywhere
//                   = r19 Used. Everywhere
.def  FSM_STATE      = r20
.def  FSM_FLAGS      = r21
.def  CNT            = r22
.def  FLAGS          = r23
//                   = r24 // adiw/sbiw
//                   = r25 // adiw/sbiw
//                   = r26 XL
//                   = r27 XH
//                   = r28 YL
//                   = r29 YH
//                   = r30 ZL
//                   = r31 ZH
//==================
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Закончил новые шрифты (переменной ширины).
Позвольте немного креативчика. В духе времени так сказать.

Изображение

:)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3820740#p3820740"][uquote="BOB51",url="/forum/viewtopic.php?p=3820561#p3820561"]...[/uquote]
Ерунда, а не шаблон....[/uquote]
LPM рассматривается как максимальный вариант - режим самопрограммирования (там ессно и по даташиту полазить придется)
Ваша Упрощенка - всего копия той же идеи как подтверждение целесообразности применения такого решения.
А заметки именно в заготовке шаблона никогда лишними не бывают.
Особо ежли не ежедневно программированием заниматься.
:wink:
:beer:
Вымогатель припоя
Аватара пользователя
Сообщения: 516
Зарегистрирован: Вт янв 01, 2013 15:51:19
Откуда: Vilnius

Сообщение Jurkin »

[uquote="shonty",url="/forum/viewtopic.php?p=3820786#p3820786"]Закончил новые шрифты (переменной ширины).[/uquote]

Эт случайно не для ST7735 ? И как бы взглянуть на Вашу реализацию, ну конечно если это не комерческий проектик.
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Jurkin писал(а):Эт случайно не для ST7735 ? И как бы взглянуть на Вашу реализацию, ну конечно если это не комерческий проектик.
Проект не комерческий, просто база для последующих проектов, для вывода названий радиостанций в частности. Это для ILI9341, но подойдёт и для ST7735, хотя шрифт для последнего слишком крупный, всего 7-8 символов в строку уберётся.

Презентация исходника пока не планируется, но готов ответить на любые вопросы по теме, и куски кода также могу выложить.
Грызет канифоль
Сообщения: 286
Зарегистрирован: Пт дек 30, 2016 18:05:50
Откуда: Украина.

Сообщение Deoptim »

Есть softuart.c для aattiny13, ttinyX5 и прочих.
Порты задаются в softuart.h.

Что необходимо?
Необходимо использовать RESET пин(БЕЗ отключения через фьюзы) как вход для UART_RX.
Т.е. этот RESET пин(БЕЗ отключения через фьюзы) можно использовать как аналоговый ADC0 и с определенным порогом напряжения (не ниже срабатывания RESET) определять пин как 1 или 0.

Может ли кто-то помочь как-то написать asm код для softuart_rx где в случае использования PB5(он же RESET он же ADC0)?
Или вообще, пожалуйста покажите на примере asm код для чтения ADC0 значения?
Может я что-то упускаю, и при чтении adc значения должна быть задержка - и из-за скорости это вообще не будет работать?
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Считаем время обработки трех последовательных преобразований АЦП, остальные интервалы по обработке одного бита приемника.
Ежли скорость устраивает - пробуем сотворить.
Только воть... Использование вывода сброса под чего иного без отключения функционала фузами...
Это весьма маловероятно.
В принципе для начала не помешает угробить пару кристаллов для проверки такого предположения...
8)
Да и зачем софт уарту ДВА вывода?
Он же все равно или на приеме или на передаче - одновременно делать и прием и передачу не сумеет.
Тогда и вопросы с мозготрепом отпадут...
:dont_know:
Последний раз редактировалось BOB51 Чт апр 09, 2020 10:48:13, всего редактировалось 1 раз.
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

убрал я этот весь базар о переменных на тему "есть ли жизнь на Марсе?".
если этот базар начнется опять, буду удалять без предупреждений.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Грызет канифоль
Сообщения: 258
Зарегистрирован: Пн окт 03, 2016 10:06:09

Сообщение Леонид_М »

Доброго времени,
возник такой вопрос: есть подпрограмма, в которой команду cbi нужно при разных запусках
выполнять то как cbi PORTC,0, то как cbi PORTC,1, чтобы не плодить кучу подпрограмм - можно ли как-то
это сделать путем передачи параметра?

пробовал с set - читал, что вроде как может изменять значение, но на практике получается ,что set не меняет значение в процессе работы программы...
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Не знаю, правильно ли я Вас понял, но предполагаю, что при разных условиях нужно выполнять разные действия. Я использую "регистр флагов" в таких случаях. Проверяю соответствующий бит, и произвожу соответствующие действия. Можно также бит "T" в SREG использовать для установки/проверки условия.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Леонид_М",url="/forum/viewtopic.php?p=3832596#p3832596"]можно ли как-то это сделать путем передачи параметра?[/uquote]Можно. Передать параметр в подпрограмму и в зависимости от его значения вызвать разную команду согласно алгоритму.
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

[uquote="Леонид_М",url="/forum/viewtopic.php?p=3832596#p3832596"]Доброго времени,
возник такой вопрос: есть подпрограмма, в которой команду cbi нужно при разных запусках
выполнять то как cbi PORTC,0, то как cbi PORTC,1, чтобы не плодить кучу подпрограмм - можно ли как-то
это сделать путем передачи параметра?

пробовал с set - читал, что вроде как может изменять значение, но на практике получается ,что set не меняет значение в процессе работы программы...[/uquote]

Зависит от задачи.
Если динамически изменяемое условие, которое анализируется кодом программы - тогда механизм флагов.
Если это подпрограмма, которая в зависимости от фрагмента, в который вставляется, меняет свою "начинку" (в принципе тот же макрос) можно применить условное ассемблирование.
Однако скорее всего выбрано не лучшее(не оптимальное) решение алгоритма задачи.
8)
Грызет канифоль
Сообщения: 258
Зарегистрирован: Пн окт 03, 2016 10:06:09

Сообщение Леонид_М »

shonty, VladislavS, сейчас пока так и сделал, но хотел бы по другому, чтобы этот параметр подставлялся в нужную команду.

BOB51, условное ассемблирование - это то, что выбирается при компиляции и не меняктся?

вот пример того, что я хотел:

.set port_v=$0

rcall pppp

.set port_v=$1

rcall pppp
.......


pppp:
......
cbi PORTC,port_v
......
ret

это работает не совсем как надо, при компиляции port_v принимает значение 1 - и с ним отрабатывает все обращения у подпрограмме,
а не принимает значение сначала 0, потом 1.
как сделать, чтобы подставлялись разные значения?
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

макрос это должен быть, а не подпрограмма.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Опишите полностью словами, чего хотите сделать...
Тогда можно чего подсказать.
:roll:
Условная компиляция - это использование возможностей препроцессора и именованных меток/констант
для указания компилятору чего в случае необходимости обрабатывать, а чего пропустить в одном и том же текстовом фрагменте.
Для АВРок (avrasm2) это применение директив
#define
#ifdef
#ifndef
#if and #elif
#else
#endif
8)
Грызет канифоль
Сообщения: 258
Зарегистрирован: Пн окт 03, 2016 10:06:09

Сообщение Леонид_М »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3832885#p3832885"]макрос это должен быть, а не подпрограмма.[/uquote]

ясно, спасибо, направление понял, буду изучать макросы...

Добавлено after 1 hour 21 minute 24 seconds:
BOB51 - "для указания компилятору чего в случае необходимости обрабатывать" - т.е. это определяется при компиляции... и больше не меняется... не пойдет... если я правильно понял...
Ответить

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