Jump to content
Lihouzov

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

Recommended Posts

Спасибо за ссылку на FLprog

Пожалуйста.Очень интересно ваше мнение по этому проекту.

Надеюсь оценка компактности кода все же будет?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

Edited by capicator

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

Читать статью

Хочу реализовать 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

Share this post


Link to post
Share on other sites
                     

STM32G0 - средства противодействия угрозам безопасности

Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Особенно чувствительными эти расходы стали теперь, в процессе массового внедрения IoT. Обладая мощным набором инструментов информационной безопасности, микроконтроллеры STM32G0 производства STMicroelectronics, объединив в себе невысокую цену, энергоэффективность и расширенный арсенал встроенных аппаратных инструментов, способны обеспечить полную безопасность разрабатываемого устройства.

Подробнее...

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Добрый день!

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

#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

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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Подскажите почему в вашей программе нет ацп для других atmeg только для atmega8 ?

Share this post


Link to post
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
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...

  • Similar Content

    • By Вячеслав_НС
      Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7  .  задача - управлять atmega8 по i2c ,  цап  PCF8591T .
      понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • By кип-сервис
      Продам новые комплектующие пневматического оборудования для систем автоматизации. Недорого. Цены по запросу.












    • By LegionKC
      Добрый день.
      Экспериментирую с платой TP4056 и MK ATmega8, конкретнее - пытаюсь собрать простенькое зарядное устройство с выводом параметров при зарядке/разрядке на АЦП МК. Для измерения тока нашел ACS712. Думаю, что получится выводить ток при зарядке (т.е. когда идет питание на TP4056 и нагрузка отключена) и при разрядке (питание выключено, нагрузка подключена). Нагрузка - резистор. Возникла проблема с измерением напряжения на АКБ. Вернее, проблема с отсутствием идей как это сделать. Может какую-нибудь схему делителя напряжения нужно сделать? Прошу помочь советом. Схему из пэинта прилагаю.
      Спасибо.
       

    • By кип-сервис
      В связи с закрытием склада, распродаю новые комплектующие для автоматизации: пневматика, реле, датчики, контроллеры и другое (Danfoss, Omron, Ifm, Esbe, Festo, SMC, Camozzi и др.)  Недорого! Подробности в ЛС. Цены по запросу.








×
×
  • Create New...