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

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


Lihouzov

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

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

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

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

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

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

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

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

  • 1 месяц спустя...

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

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

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

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

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

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

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

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

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

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

rs.jpg

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

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

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

IO_pin.jpg

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

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

ds18b20.jpg

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

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

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

  • 1 месяц спустя...

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

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

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

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

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

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

Добрый день!

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

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

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

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

  • 4 месяца спустя...
  • 2 недели спустя...

Создаю блок управления 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

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

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

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

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

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

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

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

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

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

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

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

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

Добавил новый блок "Универсальный счетчик".

Описание блока:

http://horizontautomatics.ru/FBD/index.php?help=timer_CTN

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

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

  • 5 недель спустя...
  • 3 недели спустя...

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

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

#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

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

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

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

#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

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

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

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

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

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

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

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

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	 ;выходим

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Привет.  Хочу попробовать поработать с фоторезистом. Есть пару десятков ультрафиолетовых светодиодов, общей мощностью 4 вата. Хватит ли этой мощности для обработки платок размером 10 на 10 см или надо искать что-то дополнительно? 
    • Чтобы меньше было излучения, нужно мотать тороидальную. Возможно для повышения добротности по омическому сопротивлению лучше этот ТОР мотать в пару слоев. Если ее намотать на шило, то она вряд ли будет вообще работать как катушка.   Индуктивность прямо пропорциональна площади сечения, которая в свою очередь прямо пропорциональна квадрату диаметра. К тому же индуктивность в обратной пропорции с длиной намотки.
    • Я в ходе отладки выяснил, что сбоит в функции:  void w25qWritingByUSB(uint32_t dpagenum, uint8_t *bufByUSB) При чем поведение очень странное. Отладочные сообщения даже не выводятся в начале функции. В ходе экспериментов понял что связано это с объявлением массивов и решил объявить большие буферы которые на 4КБ и 0.25КБ: uint8_t current_sector_buf[4096]; uint8_t buf[256]; глобально. В оригинале, буферы объявлялись локально в функции. После изменения буквально двух строчек кода, все заработало. Также, в оригинальном проекте было сильно напутано из функциями. Я решил функции выкинуть из main.c и вставить в w25q.c Эти функции: void w25qEraseSector(uint16_t sector) void w25qWritingByUSB(uint32_t dpagenum, uint8_t *bufByUSB) Поиск данной проблемы реально отобрало кучу времени. На будущее буду знать что и такое бывает...
    • есть готовый  драйвер BTS7960 до 43А (долговременно до 10) с шим и все, что нужно и стоит недорого. И не надо изобретать  велосипед. Даже с учетом завышения параметров  уж 5А свободно.
    • А есть внятное описание этого M18? По моему он не очень "интегирируется" с микроконтроллером, да и нужно ли? По схеме выше - подключить его к U1C, выход U1C кинуть на +С12, U1D вообще выкинуть вместе с D1,D2 и R13.
    • Прежде чем сломя голову что-либо менять, следует задуматься о причинах выхода этого "чего-либо" из строя. В противном случае замененное отправится протоптанной тропой своих предшественников. Защитной лампой пользоваться умеете? Вот на нее и заменяйте для начала.
    • Это обрывные резисторы в роли предохранителей. Номинал на последнем фото похож на 470 Ом (желтый-фиолетовый-коричневый-золотой, если цвета правильно разглядел), но это многовато, вот 47 Ом - похоже на правду. Можно ставить в достаточно широком диапазоне, другое дело, что горят они не просто так. Скорее всего дальше где-то косяк. А мультиметром измеряли сопротивление? Что показывает?
  • Похожий контент

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