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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

если это tiny2313, то там нет АЦП. за то есть аналоговый компаратор.
далее, если включить мозг, то можно и его использовать для опроса клавы.
всего два вывода МК. обвяз - два резистора и один кондер (не считая резисторной линейки под кнопки)
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Можно и его , только он не любит дребезг , что Ацп практически не замечает
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Резистивный сенсор рассчитан исключительно под прямоугольную область и выдает координаты а не номера кнопок. Емкостные кнопки, могут иметь любую конфигурацию - шины строк и столбцов чисто условные, и могут проявлятся только вблизи самих кнопок в виде площадок. Работают при этом практически через любой диэлектрик, однако в любительских условиях при толщине более 1мм появляются технические проблемы связанные с надежной регистрацией столь малых емкостей - десяток-другой пикофарад.
Но в качестве преимущества, клавиатура может быть многомерной матрицей, например в 3-х измерениях : 3x3x3 = 27 кнопок 9-ю выводами против матрицы 4x5 = 20 кнопок(если не использовать диодное разделение кнопок умножающее количество определяемых кнопок на 2) те же 9 выводов.


Использование АЦП для заведения нескольких кнопок при помощи резисторной матрицы тоже имеют свои недостатки, особенно при плохих кнопках и отсутствии защиты нажатия ДВУХ И БОЛЕЕ кнопок одновременно. К тому же надо еще следить за стабильностью показаний АЦП и только после этого принимать какое-то решение - а это все огромные накладные расходы.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

на счет резистивника. я и говорил про координаты.
а остальное - просто варианты опроса кнопок, если ног не хватает и АЦП нет.
кондер параллельно кнопке решает на половину проблему дребезга.
остальное душится программно. номиналы линейки резисторов подбираются таким образом, чтобы сопротивление при нескольких зажатых кнопках отличалось от сопротивления отдельно взятой кнопки.
#ариантов масса.
зы: я недавно напарника отучил от цифровой фильтрации данных из АЦП. оставили только программные методы борьбы с собственными шумами АЦП. остальное решает аппаратная фильтрация. например, кондер или мост в цепи ООС операционника, стоящего на входе АЦП. нефиг камень грузить лишними задачами, когда это решается аналоговыми методами.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

Сообщение MS24 »

Ребят, подскажите пожалуйста, у меня с компа по юарту поступают числа, которые варьируются от 0 до 10 000, как мне передавать их, ведь в регистр может прийти только одно байтное число?
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Передавать по два байта... и считывать их вовремя - в прерывании по приему байта например.
Вереней даже 4 байта. первый $FFFF - будет означать начало передачи, а дальше два байта самого числа. Такая синхронизация нужна для того чтобы если вдруг будет пропущен один байт ограничить по времени сбой.
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

Сообщение MS24 »

Так, я получу по юарту 2 значения, т.е 1 байт я сохраню в один регистр. второй в другой. А как мне их снова в одно число востановить?
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

MS24 писал(а):Ребят, подскажите пожалуйста, у меня с компа по юарту поступают числа, которые варьируются от 0 до 10 000, как мне передавать их, ведь в регистр может прийти только одно байтное число?
Можете передавать сразу в ASCII коде Начало посылки ,либо предложенное выше либо из той же таблицы ASCII выбрать символы которые не встретятся в вашей посылке. Ну а заканчивать символами CR+LF
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

MS24 писал(а):Так, я получу по юарту 2 значения, т.е 1 байт я сохраню в один регистр. второй в другой. А как мне их снова в одно число востановить?
Стандартные подпрограммы прервода из десятич. в hex и обратно
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

Сообщение MS24 »

ILYAUL писал(а):
MS24 писал(а):Так, я получу по юарту 2 значения, т.е 1 байт я сохраню в один регистр. второй в другой. А как мне их снова в одно число востановить?
Стандартные подпрограммы прервода из десятич. в hex и обратно
А где их взять эти подпрограммы? )
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Написать.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

Сообщение MS24 »

Леонид Иванович писал(а):Написать.
если бы я мог, я бы не задовал таких вопросо сдесь -)
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

А собственно в чем проблема хранить в памяти контроллера 16-битное "слово" как два отдельных байта? Так делается всегда и во всех 8-битных процессорах.
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Леонид Иванович писал(а):Написать.
Леонид Иванович , за него это уже сделал ATMEL, как Вы знаете. Может - Поискать :)))
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

Сообщение MS24 »

ILYAUL писал(а):
Леонид Иванович писал(а):Написать.
Леонид Иванович , за него это уже сделал ATMEL, как Вы знаете. Может - Поискать :)))
Ребят, вот я принимаю данные таки макаром:
Uart_Send:
sbis UCSR0A,UDRE0 ;пропуск если нет флага готовности
rjmp Uart_Send ;ждем готовности - флага UDRE

out UDR0, Uart_Trans ;шлем байт
ret ;Возврат
Ребят, объясните пожалуйста как слать цифры с компа, я могу только символы слать, а как цифровое значение принять от 10 до 10000 ??? спасите плиз, у меня диплом горит((
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Считваешь два байта подряд, и рассматриваешь их как одно 16-бит слово. В чем проблема-то?
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

MS24 писал(а): .....а как цифровое значение принять от 10 до 10000 ??? ((
Знакомтесь
Кстати что посылать символы , что посылать цифры - USART пофинг - индеференден он к этому
Вложения
AVR204.zip
(84.24 КБ) 152 скачивания
Последний раз редактировалось ILYAUL Вт май 15, 2012 22:10:02, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Поддерживаю.
Потом, в компе это дело превращаем в unsigned short int примерно так: (с/с++)

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

unsigned char buff[16]; //буфер приема
unsigned short int var = 0;
// далее, принимаем данные и проверяем их.

//извлекаем наши байты из пакета в двухбаййтную переменную
var = (unsigned short int)(buff[1]<<8) | (buff[0]); //пои условии, что младший байт был отправлен первым
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

День добрый. Помогите разобраться с прерыванием от таймера. В общем первая моя программа на ассме. Нет, вообще можно сказать моя первая программа :)
Вкратце суть вопроса в том, что не происходит перехода по вектору прерывания таймера. Сам таймер крутиться не в основном цикле программы, а вызывается по событию -- сработке компаратора. Т.е. срабатывает компаратор, происходит переход по его вектору к месту, где запоминается его выходной сигнал, делается пауза (вот этот чертов таймер!!!), опять снимается выходной сигнал и сравнивается с запомненным. Если совпали -- дальше передача кода по UART (но это уже к вопросу отношения не имеет). Да! Тинька 45, 1МГц тактовая.
Таблица векторов выглядит так:
.org 0 ;Задание нулевого адреса старта программы
rjmp Reset ;Безусловный переход к метке reset
.org OVF0addr ;Задание адреса прерывания по переполнению таймера 0
rjmp timer0_ovf ;Безусловный переход к метке timer0_ovf
.org ACIaddr
rjmp Compare
т.е. в ней есть вектор по прерыванию компаратора. Работает правильно.
Разрешение прерываний от таймера:
ldi r16, (1<<TOIE0) ;Загрузка в регистр r16 "1", смещенной на TOIE0
out TIMSK,r16 ;Копирование значения из R16 в регистр TIMSK0,
;разрешение прерывания таймера
тоже вроде все правильно. Дальше собственно сама пауза таймера:
;формирование задержки
ldi r18,20 ; Задаем кол-во прерываний таймера
ldi r16,(1<<CS00) ;Загрузка двух "1", смещенных на CS00 и CS02
out TCCR0B,r16 ;Копирование значения из регистра r16 в регистр TCCR0B
sei
Pause:
rjmp Pause
tmr_clr: ;Прерывание по переполнению таймера 0
clr r16 ; Очистка регистра R16
out TCCR0B,r16 ; Остановка таймера
А по прерыванию таймера должен уходить на счетчик циклов таймера:
; Таймер===========
timer0_ovf:
dec r18
cpi r18,0
brne Pause
rjmp tmr_clr
Вроде все правильно, а не работает.
На картинке видно состояние регистров таймера, флаг переполнения стоит -- а перехода нет :o
ИзображениеКонечно, могу эту задержку реализовать на вложенных циклах, памяти хватает и за строку кода давиться не надо, но... Блин, хочется разобраться, чтобы потом с этим не сталкиваться!
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

1. Думаю, что стек Вы установили
2. При входе в прерывание I-флаг сбрасывается аппаратно, а выходите Вы RJMPом, естественно, зависая навсегда на PAUSE.
Ответить

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