Jump to content

Реализация Графического Языка Программирования Для Avr Контроллеров.


Lihouzov
 Share

Recommended Posts

Установил FLprog, программы у нас похожие. В FLprog не нашел информацию о создании собственных блоков, библиотека пополняется автором. Я в своей программе за основу взял открытость, постарался сделать возможным добавление собственных блоков, для добавление блока необходимо знать AVRasm и иметь текстовый редактор. В моей программе можно посмотреть код любого моего блока через меню над блоком. В настоящий момент я арендовал хостинг и в ближайшее время сделаю обновление программы через инет, новые FBD блоки будут подгружаться сами. Далее я планирую добавить блоки для работы с UART и найти творческих людей для создания данных блоков.

Link to comment
Share on other sites

Установил FLprog, программы у нас похожие. В FLprog не нашел информацию о создании собственных блоков, библиотека пополняется автором. Я в своей программе за основу взял открытость, постарался сделать возможным добавление собственных блоков, для добавление блока необходимо знать AVRasm и иметь текстовый редактор. В моей программе можно посмотреть код любого моего блока через меню над блоком. В настоящий момент я арендовал хостинг и в ближайшее время сделаю обновление программы через инет, новые FBD блоки будут подгружаться сами. Далее я планирую добавить блоки для работы с UART и найти творческих людей для создания данных блоков.

Так может объедините свои усилия с автором FLprog?

Тема то очень интересная, может с ним удастся решить вопрос оптимизации компиляции (размеру кода) или

по крайней мере обменяетесь идеями по улучшению своих продуктов.

Edited by capicator
Link to comment
Share on other sites

  • 1 month later...

Химические элементы FANSO EVE Energy для питания беспроводных датчиков
Литиевые батарейки различного химического состава и разных типоразмеров широко используются в беспроводных датчиках систем сбора данных, промышленной автоматики и систем умного дома. И в любом из многочисленных вариантов использования беспроводных датчиков основными требованиями к их работе являются автономность и бесперебойность функционирования.
Главным условием, гарантирующим такую работу, является правильный выбор элемента питания для датчика.

Подробнее >>

  • 2 weeks later...

Сравнительное тестирование алкалиновых батареек POWER FLASH 

В потребительском и промышленном сегментах российского рынка химических источников тока имеется множество щелочных (алкалиновых) батареек различных производителей и ценовых категорий. Но велика ли разница в их качестве?

Провели небольшой сравнительный тест, чтобы понять, могут ли источники тока POWER FLASH эффективно заменить продукцию таких известных производителей, как Duracell и GP, вычислить, чему равна стоимость одного часа работы батареек, а также сравнить полученные данные со значениями, указанными в технической документации.  Подробнее>>

Хочу реализовать FBD блок электронного термометра DS18B20, сразу столкнулся с проблемой. У меня есть блоки реализующие доступ к выводам контроллера, каждый выход можно настроить либо на ввод данных либо на вывод данных, приведу поясняющий пример:

rs.jpg

В данном примере задействованы две входных ножки контроллера PinB1, PinB2 и одна выходная PinC1. Если к входным ножкам подключить кнопки, а к выходной светодиод то получим программу управлением светодиодом. PinB1 кнопка включить, а PinB2 выключить. Здесь каждая ножка настроена либо на вход либо на выход, а соединение FBD блоков имеет логический тип.

Для опроса термометра DS18B20 необходимо постоянно менять конфигурацию вывода, настраивая ее то на ввод данных то на вывод. Я подошел к созданию нового типа FBD блока способного в полной мере управлять выводом контроллера. Имея такой блок можно опрашивать устройства подобные DS18B20 (микросхемы часы реального времени, флеш память итд)

Блок реализующий полный доступ к выводу контроллера (управление линией PinC0):

IO_pin.jpg

Выводом данного блока является указатель на интерфейс управлением выводом. Интерфейс это набор функций. Имея указатель на данный интерфейс можно настроить вывод контроллера на ввод/вывод данных, получить текущее состояние, занять данный вывод если через данный вывод общаются несколько FBD блоков (например несколько DS18B20).

Пример двухканального термометра:

ds18b20.jpg

В данном примере два термометра ds18b20 опрашиваются через вывод PinС0, а результат отображается на дисплее.

В меню обновления программы доступны все разрабатываемые блоки.

Edited by Lihouzov
Link to comment
Share on other sites

  • 1 month later...

Новые источники питания на DIN-рейку класса High End от MORNSUN
Компания MORNSUN разработала новую линейку ИП с креплением на DIN-рейку класса High End. Линейка состоит из двух семейств однофазных ИП, различающихся функционалом (LIMF и LIHF) и одного семейства на трехфазное напряжение (LITF). У всех этих ИП печатная плата с компонентами имеет лаковое покрытие. Продукция работоспособна в температурном диапазоне -40...85ºС (для однофазных) и -30...70ºС (для трехфазных). Кроме того, однофазные ИП соответствуют требованиям ATEX и могут использоваться во взрывоопасных зонах. Семейство LIMF имеет стандартный функционал (ККМ, сухой контакт реле, 150% перегрузочная способность), а семейство LIHF – максимальный функционал с доп. функциями селективной защиты (SFB) и возможностью дистанционного управления (может заменить серию QUINT от Phoenix Contact).

Подробнее >>

Здравствуйте Lihouzov. Заинтересовал Ваш проект. Разъясните пожалуйста, почему у меня не появляются в элементах шим и цап.

Link to comment
Share on other sites

Блоки ЦАП я не делал. У меня есть блоки АЦП, данные блоки аппаратно зависимые они будут доступны при выборе микроконтроллера ATmega8a или ATtiny13a, для другие микроконтроллеры я не переносил данные блоки. Что касается блоков ШИМ я их выложу.

Link to comment
Share on other sites

Добрый день!

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

Чтобы подкрепить интерес к созданию собственных блоков я готов организовать конкурс на "создание лучшего блока" с призовым фондом. Код блока пишется на ассемблере, поэтому необходимым и достаточным для добавления новых блоков является знание ассемблера.

Хочу спросить есть ли у кого желание создать собственный блок?

Link to comment
Share on other sites

  • 4 months later...
  • 2 weeks later...

Создаю блок управления 7-ми сегментным индикатором.

код блока:

#ifndef _FBD41_
#define _FBD41_ FBD41
#message define FBD41 (LED_7_SEG)__FILE__
.SET LED_7_SEG_DATA_SIZE = 4
.SET LED_7_SEG_DATA_RAM = FBD_DATA_RAM						  //Глобальные данные для LED
.SET FBD_DATA_RAM = LED_7_SEG_DATA_RAM + LED_7_SEG_DATA_SIZE    //Выделяем память для LED

//Размер описания FDB блока 16 байт
//4   байта -строка инициализации
//12  байт- вывода  блока A-F,DP,N1-N4
// Оперативная память
//1 байт счетчик   
//    биты  7-4 - выводимый символ
//    биты  3-0 - счетчик
FBD41_init:
 ldi   A,  LED_7_SEG_DATA_SIZE	
 ldi   B,  0
FBD41_Loop_LED_Copy:			   
 sub A, One					  
 brcs FBD41_End_LED_copy				
 rcall Read_cfg					   
 mov   ZL, B
 rcall LCD_out_char	
 inc   B
 rjmp  FBD41_Loop_LED_Copy				
FBD41_End_LED_copy:
 ADIW  YL, 12   
 ADIW  XL, 1		  //Пропускаем
ret;
FBD41_run:
 ADIW  YL, 4			   //Пропускаем строку инициализации
 ld   H, X				 //Получаем байт счетчика
 inc  H				    //Увеличить счетчик
 st   X+, H			    //Сохраняем байт счетчика
 mov  F, H				 //Копируем
 andi F, 0b00011000	    //Получаем номер символа
// andi H, 0b00000111	    //Счетчик
// breq FBD41_out_null
 inc  H
 andi H, 0b00000111	    //Счетчик
 breq FBD41_out_null
   lsl  F				    //Номер символа 0b000000XX 
   swap F				    //Номер символа 0b00000XX0
 //lsr  F				    //Номер символа 0b000000XX
 ldi   ZL, Low(LED_7_SEG_DATA_RAM)   ; адрес
 ldi   ZH, High(LED_7_SEG_DATA_RAM)  ; адрес
 add   ZL, F
 adc   ZH, Zero
 ld    A, Z			    //Загружаем символ
//***************************************************************
//Здесь необходимо преобразовать ASCII в представление 7-seg
  subi A, 0x2D
  cpi  A, 25
  brmi FBD41_no_correct
  ldi  A, 2
FBD41_no_correct:
  ldi ZH, high(2*FBD41_tabl_7_seg)
  ldi ZL, low(2*FBD41_tabl_7_seg)
  add ZL, A
  adc ZH, Zero
  lpm
  mov A,  Addr_Data
//***************************************************************
 BST A, 0
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод A
 BST A, 1
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод B
 BST A, 2
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод C
 BST A, 3
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод D
 BST A, 4
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод E
 BST A, 5
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод F
 BST A, 6
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод G
 BST A, 7
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод DP

 ldi   A, 0b000000001	  //Преобразуем 0b0XX00000 -> 0b00001000
 sbrc  F, 0			    //Преобразуем 0b0XX00000 -> 0b00001000
 lsl   A				   //Преобразуем 0b0XX00000 -> 0b00001000
 sbrc  F, 1			    //Преобразуем 0b0XX00000 -> 0b00001000
 lsl   A				   //Преобразуем 0b0XX00000 -> 0b00001000
 sbrc  F, 1			    //Преобразуем 0b0XX00000 -> 0b00001000
 lsl   A				   //Преобразуем 0b0XX00000 -> 0b00001000
 //sbrc  F, 2			  //Преобразуем 0b0XX00000 -> 0b00001000
 //swap  A				 //Преобразуем 0b0XX00000 -> 0b00001000
 com A
 BST A, 0
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод N1
 BST A, 1
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод N2
 BST A, 2
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод N3
 BST A, 3
 BLD Uz1L, 0
 rcall Read_cfg_Save_Uz1   //Вывод N4
 ret
FBD41_out_null:
 clr  Uz1H				 //Выводим ноль
 clr  Uz1L				 //Выводим ноль
 rcall Read_cfg_Save_Uz1   //Вывод A
 rcall Read_cfg_Save_Uz1   //Вывод B
 rcall Read_cfg_Save_Uz1   //Вывод C
 rcall Read_cfg_Save_Uz1   //Вывод D
 rcall Read_cfg_Save_Uz1   //Вывод E
 rcall Read_cfg_Save_Uz1   //Вывод F
 rcall Read_cfg_Save_Uz1   //Вывод G
 rcall Read_cfg_Save_Uz1   //Вывод DP
 inc  Uz1L
 rcall Read_cfg_Save_Uz1   //Вывод N1
 rcall Read_cfg_Save_Uz1   //Вывод N2
 rcall Read_cfg_Save_Uz1   //Вывод N3
 rcall Read_cfg_Save_Uz1   //Вывод N4
ret;
FBD41:
.db 16, 1								  //Размер FBD блока, необходимая оперативная память
.dw FBD41_run, FBD41_init
//  0 | - | 2D | 0b01000000
//  1 | . | 2E | 0b10000000
//  2 | / | 2F | 0b00000000
//  3 | 0 | 30 | 0b00111111
//  4 | 1 | 31 | 0b00000110
//  5 | 2 | 32 | 0b01011011
//  6 | 3 | 33 | 0b01001111
//  7 | 4 | 34 | 0b01100110
//  8 | 5 | 35 | 0b01101101
//  9 | 6 | 36 | 0b01111101
// 10 | 7 | 37 | 0b00000111
// 11 | 8 | 38 | 0b01111111
// 12 | 9 | 39 | 0b01101111
// 13 | - | 3A | 0b00000000
// 14 | - | 3B | 0b00000000
// 15 | - | 3C | 0b00000000
// 16 | - | 3D | 0b00000000
// 17 | - | 3E | 0b00000000
// 18 | - | 3F | 0b00000000
// 19 | - | 40 | 0b00000000
// 20 | A | 41 | 0b01110111
// 21 | B | 42 | 0b01111100
// 22 | C | 43 | 0b00111001
// 23 | D | 44 | 0b01011110
// 24 | E | 45 | 0b01111001
// 25 | F | 46 | 0b01110001
FBD41_tabl_7_seg:
.db 0b01000000, 0b10000000, 0b00000000, 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101
.db 0b00000111, 0b01111111, 0b01101111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000
.db 0b01110111, 0b01111100, 0b00111001, 0b01011110, 0b01111001, 0b01110001
LCD_out_char:	   //ZL-позиция вывода  Addr_Data-код выводимого символа
 cpi   ZL,  LED_7_SEG_DATA_SIZE
 brcc  LCD_out_char_end
 ldi   ZH, Low(LED_7_SEG_DATA_RAM)
 add   ZL, ZH
 ldi   ZH, High(LED_7_SEG_DATA_RAM)
 adc   ZH, Zero
 st    Z,  Addr_Data
LCD_out_char_end:
ret
#else
#error redeclared FBD41 __FILE__
#endif

Тестирование:

Link to comment
Share on other sites

Попробовал, мнение такое, разработка, конечно заслуживает большого уважения, но хотелось бы обратить внимание разработчика на то, что в проекте нет наглядности при составлении программы, т.е нельзя сесть и за минут десять сделать, например термометр. Т.е надо или примеры работы с каждым блоком добавить или нормальное описание каждого блока, за пример для подражания, в хорошем смысле, посоветую взять Codesys с ее языками FBD и CFC.

Будьте проще и люди к вам потянутся.

Link to comment
Share on other sites

  • 2 weeks later...

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

Link to comment
Share on other sites

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

Выложил для обновления данные блоки. Группа "Таймеры/Счетчики".

Описание блоков "меню над блоком -> Информация о блоке".

Link to comment
Share on other sites

  • 5 weeks later...
  • 3 weeks later...

Нужна помощь, не могу совладать с компилятором.

Есть код блока "счетчик миллисекунд"

#ifndef _FBD41_
#define _FBD41_ FBD41
#message define FBD41 Countert milliseconds (Timer 0)
.SET TimerCounter0_DATA_SIZE = 6
.SET TimerCounter0_DATA_RAM = FBD_DATA_RAM							 //Глобальные данные для TimerCounter0
.SET FBD_DATA_RAM = TimerCounter0_DATA_RAM + TimerCounter0_DATA_SIZE	 //Выделяем память для TimerCounter0
//Оперативная память:
// 1 байта - TCNT0
// 1 байта - TIMSK
iOVF0addr: ;Прерывание по таймеру
LDS iB, TimerCounter0_DATA_RAM+5			 ;Задаем значение таймера
out TCNT0, iB							 ;Задаем значение таймера
in iB, SREG								 ;Сохраняем регистр флагов								
LDS iA, TimerCounter0_DATA_RAM			 ;мс в текущем цикле
add iA, One								 ;мс в текущем цикле
STS TimerCounter0_DATA_RAM, iA			 ;мс в текущем цикле
out SREG, iB								 ;Восстанавливаем регистр флагов
reti
FBD41_init:
rcall Read_cfg							 ;Период прерывания
STS TimerCounter0_DATA_RAM+5, Addr_Data	 ;Период прерывания
rcall Read_cfg							 ;Делитель					
out TCCR0, Addr_Data						 ;Делитель
in A,	 TIMSK						 ;Разрешаем прерывание по переполнению
ori A,	 0b00000001					 ;Разрешаем прерывание по переполнению
out TIMSK, A							 ;Разрешаем прерывание по переполнению
ret;
FBD41_run:
ADIW YL, 2					 ;Пропускаем команды инициализации
cli							 ;Запрещаем прерывания
LDS A, TimerCounter0_DATA_RAM	 ;мс накопленные за цикл
STS TimerCounter0_DATA_RAM, Zero ;мс накопленные за цикл, обнуляем
sei							 ;Разрешаем прерывания
LDS B, TimerCounter0_DATA_RAM+1 ;Обновляем счетчик миллисекунд
add B, A						 ;Обновляем счетчик миллисекунд
STS TimerCounter0_DATA_RAM+1, B ;Обновляем счетчик миллисекунд
LDS B, TimerCounter0_DATA_RAM+2 ;Обновляем счетчик миллисекунд
adc B, Zero					 ;Обновляем счетчик миллисекунд
STS TimerCounter0_DATA_RAM+2, B ;Обновляем счетчик миллисекунд
LDS B, TimerCounter0_DATA_RAM+3 ;Обновляем счетчик миллисекунд
adc B, Zero					 ;Обновляем счетчик миллисекунд
STS TimerCounter0_DATA_RAM+3, B ;Обновляем счетчик миллисекунд
LDS B, TimerCounter0_DATA_RAM+4 ;Обновляем счетчик миллисекунд
adc B, Zero					 ;Обновляем счетчик миллисекунд
STS TimerCounter0_DATA_RAM+4, B ;Обновляем счетчик миллисекунд
ret;

FBD41:
.db 2, 0		 //Размер FBD блока, необходимая оперативная память
.dw FBD41_run, FBD41_init
Timer_Diff:
lds ZL, TimerCounter0_DATA_RAM+1	 //Счетчик Lw
lds ZH, TimerCounter0_DATA_RAM+2	 //Счетчик Hg
sub ZL, Uz1L						 //Разница времени
sbc ZH, Uz1H						 //Разница времени
ret
#else
#error redeclared FBD41 __FILE__
#endif

Данный код не работает на ATtiny13, потому что нет некоторых портов ввода-вывода.

Зато работает код:

#ifndef _FBD41_
#define _FBD41_ FBD41
#message define FBD41 Countert milliseconds (Timer 0)
.SET TimerCounter0_DATA_SIZE = 6
.SET TimerCounter0_DATA_RAM = FBD_DATA_RAM							 //Глобальные данные для TimerCounter0
.SET FBD_DATA_RAM = TimerCounter0_DATA_RAM + TimerCounter0_DATA_SIZE	 //Выделяем память для TimerCounter0
//Оперативная память:
// 1 байта - TCNT0
// 1 байта - TIMSK0
iOVF0addr: ;Прерывание по таймеру
LDS iB, TimerCounter0_DATA_RAM+5			 ;Задаем значение таймера
[color=#ff0000]out TCNT0, iB							 ;Задаем значение таймера				 ***[/color]
in iB, SREG								 ;Сохраняем регистр флагов								
LDS iA, TimerCounter0_DATA_RAM			 ;мс в текущем цикле
add iA, One								 ;мс в текущем цикле
STS TimerCounter0_DATA_RAM, iA			 ;мс в текущем цикле
out SREG, iB								 ;Восстанавливаем регистр флагов
reti
FBD41_init:
rcall Read_cfg							 ;Период прерывания
STS TimerCounter0_DATA_RAM+5, Addr_Data	 ;Период прерывания
rcall Read_cfg							 ;Делитель					
out TCCR0B, Addr_Data						 ;Делитель
[color=#ff0000]in A,	 TIMSK0						 ;Разрешаем прерывание по переполнению ***
ori A,	 0b00000010					 ;Разрешаем прерывание по переполнению ***[/color]
out TIMSK0, A							 ;Разрешаем прерывание по переполнению
ret;
FBD41_run:
ADIW YL, 2					 ;Пропускаем команды инициализации
cli							 ;Запрещаем прерывания
LDS A, TimerCounter0_DATA_RAM	 ;мс накопленные за цикл
STS TimerCounter0_DATA_RAM, Zero ;мс накопленные за цикл, обнуляем
sei							 ;Разрешаем прерывания
LDS B, TimerCounter0_DATA_RAM+1 ;Обновляем счетчик миллисекунд
add B, A						 ;Обновляем счетчик миллисекунд
STS TimerCounter0_DATA_RAM+1, B ;Обновляем счетчик миллисекунд
LDS B, TimerCounter0_DATA_RAM+2 ;Обновляем счетчик миллисекунд
adc B, Zero					 ;Обновляем счетчик миллисекунд
STS TimerCounter0_DATA_RAM+2, B ;Обновляем счетчик миллисекунд
LDS B, TimerCounter0_DATA_RAM+3 ;Обновляем счетчик миллисекунд
adc B, Zero					 ;Обновляем счетчик миллисекунд
STS TimerCounter0_DATA_RAM+3, B ;Обновляем счетчик миллисекунд
LDS B, TimerCounter0_DATA_RAM+4 ;Обновляем счетчик миллисекунд
adc B, Zero					 ;Обновляем счетчик миллисекунд
STS TimerCounter0_DATA_RAM+4, B ;Обновляем счетчик миллисекунд
ret;

FBD41:
.db 2, 0		 //Размер FBD блока, необходимая оперативная память
.dw FBD41_run, FBD41_init
Timer_Diff:
lds ZL, TimerCounter0_DATA_RAM+1	 //Счетчик Lw
lds ZH, TimerCounter0_DATA_RAM+2	 //Счетчик Hg
sub ZL, Uz1L						 //Разница времени
sbc ZH, Uz1H						 //Разница времени
// brcc Timer_Diff_end
// neg ZL								 //Меняем знак
// com ZH								 //Меняем знак
//Timer_Diff_end:
ret
#else
#error redeclared FBD41 __FILE__
#endif

Как заставить линковщик совместить эти два кода?

Link to comment
Share on other sites

Совместил выражением:

#if defined( _TN13ADEF_INC_)||defined(_TN13DEF_INC_)				   
out TCCR0B, Addr_Data						 ;Делитель
in    A,	  TIMSK0						  ;Разрешаем прерывание по переполнению   ***
ori   A,	  0b00000010					  ;Разрешаем прерывание по переполнению   ***
out   TIMSK0,  A							  ;Разрешаем прерывание по переполнению
#else
out TCCR0, Addr_Data						  ;Делитель								  
in    A,	  TIMSK						   ;Разрешаем прерывание по переполнению	   !!!
ori   A,	  0b00000001					  ;Разрешаем прерывание по переполнению
out   TIMSK,  A							   ;Разрешаем прерывание по переполнению
#endif

Link to comment
Share on other sites

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

Блок "счетчик миллисекунд" заработал и на тини13:

Link to comment
Share on other sites

  • 3 weeks later...

Добрый день, хочу добавить возможность внутрисхемной отладки.

Логика следующая:

1. Программа подключается к МК.

2. Запрашивает конфигурацию.

3. Если конфигурация совпадает с проектом, включает режим отладки.

4. Программа непрерывно получает значения соединений и отображает их.

Хочу использовать UART. Код отладчика оформить в виде FBD блока, если необходима отладка достаточно будет перенести данный блок на холст.

Для UART необходим буфер приема/передачи.

В памяти буфер буду хранить следующим образом:

r,w,[0,1,..,n-1] где r - указатель чтения; w - указатель записи; [0,1,..,n-1] - n байт данных буфера.

Статус буфера:

r=w - буфер пуст;

inc_b(w)=r - буфер полон.

inc_b - инкремент указателя буфера

.macro    inc_b    ;@0 регистр указателя  @1 регистр размер буф
  inc @0			  ;увеличиваем указатель
  cp  @0, @1	  ;корректировка указателя
  brne end_inc_b
  clr  @0			  ;указатель на начало
.endm				 ; конец макроса

Функции чтения/записи в буфер:

Входные параметры:

Z - указатель на буфер

A - (регистр) размер буфера

Результат: бит C регистра SREG

1 - ошибка чтения/записи

0 - успешно

read_buf:
 ld C, Z+   ;указатель чтения
 ld D, Z+   ;указатель записи
 cp C, D   ;проверяем
 brne next_read_buf
 sec	   ; ошибка
 ret		 ; выходим
next_read_buf:
 add ZL, C
 adc ZH, Zero
 ld B, Z   ;Читаем буфер
 inc_b C, A  ;смещаем указатель
 clc	 ;успешно
 ret	 ;выходим

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...