Перейти к содержанию

Примеры кода для AVR


Duhas

Рекомендуемые сообщения

написал подпрограмму обработки кнопки, на atmega48, получилось следующее творенье, только это творенье не работает, может кто подскажет чего не так намудрил.

key:

sbic 0x03,5	; определяем сброшен ли 6 бит, на порту B, что означает что кнопка нажата
			; если бит установлен пропускаем следующую команду
rjmp key_01	; переход если 1

ldi r29,0x02 ; выгружаем значение регистра антидребезга из ячейки 0х201
ldi r28,0x01
ldd r16,y+0
cpi r16,0 ; проверяем значение загруженное из памяти регистра антидребезга на равенство 0
breq key_0 ; переход при равенстве 0
dec r16 ; уменьшение значения регистра антидребезга
sts 0x0201,r16 ; здесь наверно можно было использовать просто регистр но я использовал память т.к.регистры могут понадобиться
rjmp key

key_0:

ldi r29,0x02 ; выгружаем значение поддиапазона адрес 0х0202
ldi r28,0x02
ldd r16,y+0
inc r16

sts 0x0202,r16 ; записываем увеличенное значение в память, значение поддиапазона	

key_01:	

ldi r16,0x50
sts 0x0201,r16 ; снова устанавливаем значение для регистра антидребезга

ret

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

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Есть два вопроса. Теоретический и практический.

1). Подскажите, кто пишет на С, можно ли использовать прерывания?

2). Как использовать встроенный в Мегу интерфейс I2C. Библиотека для программной реализации есть,но геморроиться не хочется, к тому же читал, что он капризный. Желательно на Ассемблере.

3). Модераторам-администраторам-еще-незнаю-кому-ответственному-за-сайт. Когда пытаюсь в поисковике найти тот же I2C или USB, он меня посылает по поводу поиска по 3-м буквам. Нельзя ли с этим что-нибудь сделать? Я же не могу их описать более расширенно (я же не помню\знаю как расшифровывается, а если и знаю,наверняка ж нету на сайте, а если и есть, то не то, а если и то, то на английском)(прошу прощения, что пишу здесь)

4). По поводу АВР-студио. Что за глюк, что приходится в начало кода дописывать " ldi r16,0b10000000 out SREG,r16 " Иначе не реагирует на прерывания. Как это исправить?

ЗЫ). A_0681h - не у всех механических кнопок есть дребезг.

- подключи .include "что_нибудь_def.inc". Мне лично не удобно читать 0х03 а компилятору пофиг. Лучше (в 3-ей же строке) sbic PINB,5 ... и читать легче и не прочитаешь из PortB или DDRB.

- если дребезг и есть, я бы обрабатывал кнопки (и еще что-нибуди) по таймеру.

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

2). Как использовать встроенный в Мегу интерфейс I2C. Библиотека для программной реализации есть,но геморроиться не хочется, к тому же читал, что он капризный. Желательно на Ассемблере.
 

;********************************************************************************

;* БИБЛИОТЕКА РАБОТЫ С МИКРОСХЕМАМА 24CXX ЧЕРЕЗ TWI *

;********************************************************************************

;регистры для TWI

.def statusTWI = r16

.def doneTWI = r17

.equ SLA_W =

.equ SLA_R =

;Подпрограмма инициализации интерфейса TWI

TWI_INICIAL:

типа сами напишите

ret

;Подпрограмма передачи команды "старт"

TWI_START:

ldi statusTWI,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)

out TWCR,statusTWI

ret

;Подпрограмма передачи команды "стоп"

TWI_STOP:

ldi statusTWI,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)

out TWCR,statusTWI

ret

;Подпрограмма передачи адреса микросхемы

TWI_ADR:

ldi statusTWI, SLA_W

out TWDR, statusTWI

ldi statusTWI, (1<<TWINT) | (1<<TWEN)

out TWCR, r16

ret

;Подпрограмма передачи данных

TWI_DATA_W:

ldi statusTWI,DATA;в вызывающей программе

out TWDR,statusTWI

ldi statusTWI,(1<<TWINT) | (1<<TWEN)

out TWCR,statusTWI

ret

;------------------------------------------------------------------

;оптимизация по размеру предыдущих функций

TWI_ADR:

ldi statusTWI,SLA_W

TWI_DATA_W:

out TWDR,statusTWI

ldi statusTWI,(1<<TWINT) | (1<<TWEN)

rjmp TWI_END

TWI_START:

ldi statusTWI,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)

rjmp TWI_END

TWI_STOP:

ldi statusTWI,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)

TWI_END: out TWCR,statusTWI

ret

;обработчик прерывания от модуля TWI

TWI_INT:

in doneTWI,TWSR

andi doneTWI, 0xF8 ;считываем статус модуля TWI

sbrc statusTWI,TWSTA

rjmp

а дальше сами

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

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

ртфцнф

Я имел в виду аппаратный. Библиотека эмуляции у меня есть

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

3). Модераторам-администраторам-еще-незнаю-кому-ответственному-за-сайт. Когда пытаюсь в поисковике найти тот же I2C или USB, он меня посылает по поводу поиска по 3-м буквам. Нельзя ли с этим что-нибудь сделать?

Попробуйте пожаловаться на поисковик.

Первая же ссылка http://www.gaw.ru/html.cgi/txt/app/micros/avr/AVR315.htm

ртфцнф

Я имел в виду аппаратный. Библиотека эмуляции у меня есть

Приведенный выше кусок кода и есть управление аппаратным I2C точнее TWI. Написанный прям по мануалу. Но раз Вы задаете такие вопросы в него Вы и не заглядывали. Еще раз народ тут не любит вопросов типа сделайте, дайте. Попробуйте начать писать сами, возникнут вопросы помогут.

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

4). По поводу АВР-студио. Что за глюк, что приходится в начало кода дописывать " ldi r16,0b10000000 out SREG,r16 " Иначе не реагирует на прерывания. Как это исправить?

Для разрешения прерываний у АВР необходимо установить в 1 бит I регистра SREG. В ассемблере для этого существует команда SEI, ваш вариант выполняет почти то же самое ldi  r16,0b1000000, за исключением того, что SEI не трогает остальных битов регистра.

Ссылка на комментарий
Поделиться на другие сайты

A можно и так сказать:

Для управления любым битом регистра SREG в асме существуют специально выделенные команды

http://www.atmel.ru/Articles/Atmel11.htm

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

Спасибо, ртфцнф! Я совсем забыл о SEI. За I2C тоже спасибо. Тут я, конечно, ступил.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

При прошивке аттини2313 столкнулся с такой проблемой: для программирования прилагается два файла ( .hex, .eep ), в Пони Прог зашиваю сначала .hex, учитываю-всё правильно, потом зашиваю второй файл и считываю только Eeprom-получается просто каша из обоих файлов. Схема, конечно работает не правильно. Может, надо както иначе прошивать в таком случае?

Ссылка на комментарий
Поделиться на другие сайты

При прошивке аттини2313 столкнулся с такой проблемой: для программирования прилагается два файла ( .hex, .eep ), в Пони Прог зашиваю сначала .hex, учитываю-всё правильно, потом зашиваю второй файл и считываю только Eeprom-получается просто каша из обоих файлов. Схема, конечно работает не правильно. Может, надо както иначе прошивать в таком случае?

.hex – файл прошивки, прошивается во FLASH памяти программ

.eep – файл данных, прошивается в EEPROM памяти данных.

Посмотрите внимательно для прошивки используются разные опции программатора (грубо говоря, разные кнопки)

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

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

сижу тут голову ломаю, подскажите может кто сталкивался.

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

кроме регистра флагов и используемых регистров что ещё надо запихнуть в стек?

Ссылка на комментарий
Поделиться на другие сайты

не забываем, что выход из обработчика прерывания "reti" а не "ret". А лучше приведите код обработчика

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

A_0861h

.include "8515def.inc"
.def tmp=r16
rjmp RESET

rjmp INT0
reti
reti
reti

reti
rjmp TIMER1_OVF
reti
reti

reti
reti
reti
reti

RESET:
ldi tmp,high(RAMEND)
out SPH,tmp
ldi tmp,low(RAMEND)
out SPL,tmp
ldi tmp,0b01000000
out GIMSK,tmp
ldi tmp,0b00000011
out TCCR1B,tmp
ldi tmp,(1<<TOIE1)
out TIMSK,tmp
sei
CYCLE:
rjmp CYCLE

INT0:
;-код по прерыванию Int0
reti

TIMER1_OVF:
;-код по переполнению таймера1
reti

Это пример кода для AT90S8515 (ATmega8515) с использованием внешнего прерывания и переполнения таймера1

С процедурами/прераваниями еще один нюанс, который я заметил: точка возврата сохраняется в стеке. Поэтому чтобы процедура передавала через него данные придется помучаться. Через регистр (или даже ОЗУ)проще.

Кстати у меня появилось еще 3 вопроса ( :rolleyes: ) - как именно ассемблирется программа (структура HEX-файла). Насколько я понял первая строка - заглавие, всегда постоянна; последняя - завершение, тоже постоянна.

В основном блоке. Суммарное количество байт (у меня было всегда кратно 2, но, возможно зто и не обязательно). Потом 2 байта нулей (в некоторых прогах там не только нули - это первый вопрос. потом то 1 до 5 двухбайтовых команд (младший байт потом старший). И в конце 1 байт видимо контрольный - это второй вопрос. Как именно он высчитывается?

И третий вопрос есть ли какие-то еще особенности?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Непонятно мене зачем передавать параметры через стек в програме на АСМ??? ладно это оправдано в С но в АСМ это не саое удачное.. гораздо проще передавать параметр в регистру или вообще выделить память отдельно...

HEX-файл - содержит в начале сторки адрес, потом данные и на конце контрольную сумму. если хотите видеть чистый код - переведите его в бинарник любой утилитой hex_to_bin

Ссылка на комментарий
Поделиться на другие сайты

Знаю :) я сам столкнулся когда прогал на асме для компа. Это больше как теория.

А как считается контрольная сумма (что-то у меня не получается :0200 0000 FFEF 10)

И зачем после адреса 1,5 (!)байта (три шестнадцатеричных разряда)нулей

И насчет перевода мне скорее понадобится делать HEX-файлы чем редактировать а это можно делать с помощью хелпа.

Да, чуть не забыл. Как в АТмеге8 разбирается РЕСЕТ. Он же к PC6 присоединен! И внешнее тактирование.

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Да, чуть не забыл. Как в АТмеге8 разбирается РЕСЕТ. Он же к PC6 присоединен! И внешнее тактирование.

Фузами включаются эти порты

ИМХО: RESET лучше не трогать, мне как-то всегда спокойней когда есть аппаратная возможность перезапустить МК

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

Аппаратаая возможность - жесткое выдирание батарейки :-Е или контроллера из панельки. Безотказная вещь, еще ни один контроллер не придумал как с этим бороться :)

Но в целом - согласен.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

спасибо за ответ. скелет программы такой же.

в стек заношу состояние регистра флагов, данные заношу в отдельную ячейку памяти но её не где не обнуляю, кроме как в прерывании по внешнему воздействию.

объяснение корявое я знаю, но код всей программы большой сразу не разобраться:)

вот код подпрограмм по работе с прерываниями

int1: ; подпрограмма по внешнему прерыванию
push r8
lds r8,0x3F
push r8
push r16
push r17
sei		
ldi r16,0x00
sts 0x80,r16	; записываем регистры установки счетчика T1,
ldi r16,0x00
sts 0x81,r16	; останавливаем счетчик

lds r16,0x84	; младший байт значения счетчика
lds r17,0x85	; старший байт значения счетчика
sts 0x0130,r16	; выгружаем значение счетчика в 0х0130 и 0х0131 для индикации частоты	
sts 0x0131,r17

ldi r29,0x01
ldi r28,0x90 ; специальная ячейка памяти для подсчёта старших разрядов 0х0180
ldd r16,y+0
sts 0x0132,r16

ldi r17,0x00	; обнуление регистров содержащих информацию об количестве импульсов
ldi r16,0x01
sts 0x85,r17
sts 0x84,r16
sts 0x0190,r17
clr r10

ldi r16,0x00
sts 0x80,r16	; записываем регистры установки счетчика T1,
ldi r16,0x01
sts 0x81,r16	; запускаем счетчик	

pop r17
pop r16
pop r8
sts 0x3f,r8
pop r8
reti

timer1_ovf: ; подпрограмма по переполнению
push r8
lds r8,0x3F

inc r10
sts 0x0190,r10


sts 0x3f,r8
pop r8
sei
reti

Ссылка на комментарий
Поделиться на другие сайты

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

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

для кнопки вроде как удалось победить, но мне кажется тут такой же способ не подойдёт.

Изменено пользователем A_0681h
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Ребят это мое первое творение поэтому прошу разьяснить,на схеме ниже справа распиновка до десяти,не понятно куда к контролеру для прошивки подключать выводы под номером 2,4,6,8,10

02b08a28948e.jpg

Ссылка на комментарий
Поделиться на другие сайты

ребят ну вот все собрал программатор и теперь вдуплить не могу его система должна определять как новое оборудование или нет,как он инициализируется с виндой и еще все таки не до конца понятно куда на амегу8 цеплять согласно схеме массу так как по распиновке контроллера масса (GND)это 8й и 22й пин а выводов массы с программатора четыре как быть,и если вешать массу то какой пин задействовать 8й или 22й и че делать с оставшимися массами, а и еще 3й вывод программатора обозначено LED это куда?

Изменено пользователем Nokian
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...