Modbus RTU для AVR на Assembler. часть2

AVR
Ну так сказать «дембельский аккорд по АВРам» часть2. Если что то начало можно глянуть здесь



Читать дальше
  • +2
  • 16 августа 2016, 15:25
  • deses
  • 2

Modbus RTU для AVR на Assembler. часть1

AVR
Понадобилось мне недавно разобраться с Модбасом. А точнее освоить подключение панели оператора к Меге.
Приглашаю всех желающих посмотреть мою реализацию такого решения


Читать дальше
  • +3
  • 02 августа 2016, 22:27
  • deses

И ещё раз SSD1306

Китайский, IIC, 0,96 дюйма.
Общие впечатления — дёшево и сердито, только очень мало и относительно медленно.




Читать дальше

NHD-2.7-12864

Немного допилил и решил положить сюда.
Итак, экранчик NHD-2.7-12864 с контроллером SSD1325.


Читать дальше

TIS-100

Уникальная Игра TIS-100 от американского разработчика Закари Барта.


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




Читать дальше
  • +5
  • 18 августа 2015, 17:59
  • BOBBY

Кольцевой буфер

AVR
Пусть здесь полежит, а то вдруг с моим репозиторием что случится… А тут, глядишь, кому и сгодится.
Код для обслуживания кольцевых буферов, маленький и шустрый.
Собственно так: в секции данных надо поместить массивчик, где будет храниться сам буфер, произвольного размера, до 255 байт. Глубина буфера задаётся константой RBSIZE, и массив получается на три байта больше размером. В первом байте лежит глубина заполнения, то есть сколько данных сейчас в буфере. При укладке байта — увеличивается, при выгрузке — уменьшается; если ноль — буфер пуст. Второй и третий байты — служебные, указатели загрузки и выгрузки. Для инита буфера надо эти три байта обнулить.
А дальше всё стандартно — процедурой PutToBuf укладываем в буфер содержимое r16, процедурой GetFromBuf — достаём. Если буфер переполнен — очередной байт туда не ляжет, если пуст — содержимое r16 не изменится.
Портит xl,xh,r17, загрузка/выгрузка занимает по 29 тактов. Локальных меток не имеет, так что можно легко тиражировать в любом количестве экземпляров внутри программы.


; В секции данных:
;.equ RBSIZE=11
; ringbuf:	.byte RBSIZE+3
; Конструкция кольцевого буфера: 
;+0 - глубина заполнения
;+1 - указатель укладки
;+2 - указатель выгрузки
;+3... - данные
; Использованные регистры: xh,xl,r16,r17
; укладка в буфер. 29 тактов
PutToBuf:	ldi	xh,high(ringbuf+3) ;загрузка базы буфера
		ldi	xl,low (ringbuf+3)
		lds	r17,ringbuf+0	;load rbdept
		cpi	r17,RBSIZE        ; проверка на переполнение
		brcc	pc+16
		inc	r17
		sts	ringbuf+0,r17    ;store rbdept
		lds	r17,ringbuf+1 	;load rbputptr
		add	xl,r17            ; складываем указатель с базой
		brcc	pc+2
		inc	xh
		st	x,r16            ; помещаем байт в буфер
		inc	r17               ; приращение указателя укладки
		cpi	r17,RBSIZE        ; закольцовка, если достигнута граница
		brcs	PC+2
		clr	r17
		sts	ringbuf+1,r17	;store rbputptr
		ret

; выгрузка из буфера. 29 тактов
GetFromBuf:	ldi	xh,high(ringbuf+3)
		ldi	xl,low (ringbuf+3)
		lds	r17,ringbuf+0	;load rbdept
		tst	r17            ; проверка наличия данных
		breq	pc+16
		dec	r17
		sts	ringbuf+0,r17	;store rbdept
		lds	r17,ringbuf+2	;rbgetptr
		add	xl,r17
		brcc	pc+2
		inc	xh
		inc	r17
		cpi	r17,RBSIZE
		brcs	PC+2
		clr	r17
		sts	ringbuf+2,r17	;rbgetptr
		ld	r16,x
		ret

Базовые макросы. Взгляд из ассемблера ARM Cortex-M.

Всем привет.

Здесь я коротко напишу про вид из ассемблера базовых макросов min(a,b), max(a,b) и isEqual(a,b).

Первые два иногда пригождаются, третий — весьма спорный, но иногда его удобно использовать.

Заметка будет короткой и наверняка не интересной для профи, которые знакомы с архитектурой ARM-Cortex, и понимающие отличия ARM-режима процессора от THUMB-режима) Кому все же интересно — добро пожаловать под кат.

we.zloy_pakimon.arm_asm_macro_1



Читать дальше

Коротенький диспетчер

Понадобился мне небольшой диспетчер. Вот, собственно, результат. Тут, конечно, фиг чего нового придумаешь, но все таки пусть лежит. Нуждается в легком допиливании, ибо добавление задачи сверх положенного сорвет контроллеру крышу, ну и стек в прерывании некисло прогружается. Под катом здоровая простыня кода, можно сразу копировать и запускать. Есть фрагменты кода DI HALT`a, они со мной давно ))


Читать дальше

1-Wire: алгориттма поиска ROM, реверс

Одолела тут детская болезнь — «написать свой 1-Wire с преферансом и куртизанками», точнее с определением количества устройств на шине. Готовые проекты, которые нашёл, не являются библиотеками по принципу «подключил и пользуйся», только как примеры. (Здесь тоже этого нет — возможно, позже). Сам алгоритм описан в AN187.

Читать дальше

Dowlib update

DOWLIB обновлён.
Bugfix: устранено бесконечное ожидание в Ex_DowRst при коротком замыкании шины. Теперь возвращает CY (нет отклика устройства на сброс)
Bugfix: вызов Ex_DowSkipRom ошибочно возвращал CY. поправлено.
Новая версия в аттаче.