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

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


Lihouzov

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

При таком подходе часть точности потеряется на дробной арифметике. Я имел в виду что-то вроде

volatile unsigned int adc_res=0;
ISR(ADC_vect){
static unsigned char count=0;
static unsigned int adc_temp=0;
adc_temp+=ADC;
count++;
if(count>63){
 adc_res=adc_temp / 64; //точнее, adc_res = adc_temp >> 6;
 count=0; adc_temp=0;
}
}

Впрочем, именно для 64 выборок, учитывая, что в AVR 10-разрядный АЦП, можно обойтись даже без деления, получится 16 значащих бит.

Впрочем, реализация цикла оригинальная.

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

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

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Умножение деление целых чисел:

;**** A P P L I C A T I O N   N O T E   A V R 2 0 0 ************************
;*
;* Title:  Multiply and Divide Routines
;* Version:  1.1
;* Last updated: 97.07.04
;* Target:  AT90Sxxxx (All AVR Devices)
;*
;* Support E-mail: avr@atmel.com
;* ;* DESCRIPTION
;* This Application Note lists subroutines for the following
;* Muliply/Divide applications:
;*
;* 8x8 bit unsigned
;* 8x8 bit signed
;* 16x16 bit unsigned
;* 16x16 bit signed
;* 8/8 bit unsigned
;* 8/8 bit signed
;* 16/16 bit unsigned
;* 16/16 bit signed
;*
;* All routines are Code Size optimized implementations
;*;***************************************************************************
.include "1200def.inc"
rjmp RESET ;reset handle

;***************************************************************************
;*
;* "mpy8u" - 8x8 Bit Unsigned Multiplication
;*
;* This subroutine multiplies the two register variables mp8u and mc8u.
;* The result is placed in registers m8uH, m8uL
;* 
;* Number of words :9 + return
;* Number of cycles :58 + return
;* Low registers used :None
;* High registers used  :4 (mp8u,mc8u/m8uL,m8uH,mcnt8u)
;*
;* Note: Result Low byte and the multiplier share the same register.
;* This causes the multiplier to be overwritten by the result.
;*
;***************************************************************************
;***** Subroutine Register Variables
.def mc8u =r16  ;multiplicand
.def mp8u =r17  ;multiplier
.def m8uL =r17  ;result Low byte
.def m8uH =r18  ;result High byte
.def mcnt8u =r19  ;loop counter
;***** Code

mpy8u: clr m8uH  ;clear result High byte
ldi mcnt8u,8 ;init loop counter
lsr mp8u  ;rotate multiplier

m8u_1: brcc m8u_2  ;carry set
add  m8uH,mc8u ;   add multiplicand to result High byte
m8u_2: ror m8uH  ;rotate right result High byte
ror m8uL  ;rotate right result L byte and multiplier
dec mcnt8u  ;decrement loop counter
brne m8u_1  ;if not done, loop more
ret


;***************************************************************************
;*
;* "mpy8s" - 8x8 Bit Signed Multiplication
;*
;* This subroutine multiplies signed the two register variables mp8s and
;* mc8s. The result is placed in registers m8sH, m8sL
;* The routine is an implementation of Booth's algorithm. If all 16 bits
;* in the result are needed, avoid calling the routine with
;* -128 ($80) as multiplicand
;* 
;* Number of words :10 + return
;* Number of cycles :73 + return
;* Low registers used :None
;* High registers used  :4 (mc8s,mp8s/m8sL,m8sH,mcnt8s)
;*
;***************************************************************************
;***** Subroutine Register Variables
.def mc8s =r16  ;multiplicand
.def mp8s =r17  ;multiplier
.def m8sL =r17  ;result Low byte
.def m8sH =r18  ;result High byte
.def mcnt8s =r19  ;loop counter
;***** Code
mpy8s: sub m8sH,m8sH ;clear result High byte and carry
ldi mcnt8s,8 ;init loop counter
m8s_1: brcc m8s_2  ;if carry (previous bit) set
add m8sH,mc8s ;    add multiplicand to result High byte
m8s_2: sbrc mp8s,0  ;if current bit set
sub m8sH,mc8s ;    subtract multiplicand from result High
asr m8sH  ;shift right result High byte
ror m8sL  ;shift right result L byte and multiplier
dec mcnt8s  ;decrement loop counter
brne m8s_1  ;if not done, loop more
ret

;***************************************************************************
;*
;* "mpy16u" - 16x16 Bit Unsigned Multiplication
;*
;* This subroutine multiplies the two 16-bit register variables
;* mp16uH:mp16uL and mc16uH:mc16uL.
;* The result is placed in m16u3:m16u2:m16u1:m16u0.
;* 
;* Number of words :14 + return
;* Number of cycles :153 + return
;* Low registers used :None
;* High registers used  :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,
;*						  m16u3,mcnt16u)
;*
;***************************************************************************
;***** Subroutine Register Variables
.def mc16uL =r16  ;multiplicand low byte
.def mc16uH =r17  ;multiplicand high byte
.def mp16uL =r18  ;multiplier low byte
.def mp16uH =r19  ;multiplier high byte
.def m16u0 =r18  ;result byte 0 (LSB)
.def m16u1 =r19  ;result byte 1
.def m16u2 =r20  ;result byte 2
.def m16u3 =r21  ;result byte 3 (MSB)
.def mcnt16u =r22  ;loop counter
;***** Code
mpy16u: clr m16u3  ;clear 2 highest bytes of result
clr m16u2
ldi mcnt16u,16 ;init loop counter
lsr mp16uH
ror mp16uL
m16u_1: brcc noad8  ;if bit 0 of multiplier set
add m16u2,mc16uL ;add multiplicand Low to byte 2 of res
adc m16u3,mc16uH ;add multiplicand high to byte 3 of res
noad8: ror m16u3  ;shift right result byte 3
ror m16u2  ;rotate right result byte 2
ror m16u1  ;rotate result byte 1 and multiplier High
ror m16u0  ;rotate result byte 0 and multiplier Low
dec mcnt16u  ;decrement loop counter
brne m16u_1  ;if not done, loop more
ret
;***************************************************************************
;*
;* "mpy16s" - 16x16 Bit Signed Multiplication
;*
;* This subroutine multiplies signed the two 16-bit register variables
;* mp16sH:mp16sL and mc16sH:mc16sL.
;* The result is placed in m16s3:m16s2:m16s1:m16s0.
;* The routine is an implementation of Booth's algorithm. If all 32 bits
;* in the result are needed, avoid calling the routine with
;* -32768 ($8000) as multiplicand
;* 
;* Number of words :16 + return
;* Number of cycles :210/226 (Min/Max) + return
;* Low registers used :None
;* High registers used  :7 (mp16sL,mp16sH,mc16sL/m16s0,mc16sH/m16s1,
;*	   m16s2,m16s3,mcnt16s)
;*
;***************************************************************************
;***** Subroutine Register Variables
.def mc16sL =r16  ;multiplicand low byte
.def mc16sH =r17  ;multiplicand high byte
.def mp16sL =r18  ;multiplier low byte
.def mp16sH =r19  ;multiplier high byte
.def m16s0 =r18  ;result byte 0 (LSB)
.def m16s1 =r19  ;result byte 1
.def m16s2 =r20  ;result byte 2
.def m16s3 =r21  ;result byte 3 (MSB)
.def mcnt16s =r22  ;loop counter
;***** Code
mpy16s: clr m16s3  ;clear result byte 3
sub m16s2,m16s2 ;clear result byte 2 and carry
ldi mcnt16s,16 ;init loop counter
m16s_1: brcc m16s_2  ;if carry (previous bit) set
add m16s2,mc16sL ;    add multiplicand Low to result byte 2
adc m16s3,mc16sH ;    add multiplicand High to result byte 3
m16s_2: sbrc mp16sL,0 ;if current bit set
sub m16s2,mc16sL ;    sub multiplicand Low from result byte 2
sbrc mp16sL,0 ;if current bit set
sbc m16s3,mc16sH ;    sub multiplicand High from result byte 3
asr m16s3  ;shift right result and multiplier
ror m16s2
ror m16s1
ror m16s0
dec mcnt16s  ;decrement counter
brne m16s_1  ;if not done, loop more
ret

;***************************************************************************
;*
;* "div8u" - 8/8 Bit Unsigned Division
;*
;* This subroutine divides the two register variables "dd8u" (dividend) and
;* "dv8u" (divisor). The result is placed in "dres8u" and the remainder in
;* "drem8u".
;* 
;* Number of words :14
;* Number of cycles :97
;* Low registers used :1 (drem8u)
;* High registers used  :3 (dres8u/dd8u,dv8u,dcnt8u)
;*
;***************************************************************************
;***** Subroutine Register Variables
.def drem8u =r15  ;remainder
.def dres8u =r16  ;result
.def dd8u =r16  ;dividend
.def dv8u =r17  ;divisor
.def dcnt8u =r18  ;loop counter
;***** Code
div8u: sub drem8u,drem8u ;clear remainder and carry
ldi dcnt8u,9 ;init loop counter
d8u_1: rol dd8u  ;shift left dividend
dec dcnt8u  ;decrement counter
brne d8u_2  ;if done
ret   ;    return
d8u_2: rol drem8u  ;shift dividend into remainder
sub drem8u,dv8u ;remainder = remainder - divisor
brcc d8u_3  ;if result negative
add drem8u,dv8u ;    restore remainder
clc   ;    clear carry to be shifted into result
rjmp d8u_1  ;else
d8u_3: sec   ;    set carry to be shifted into result
rjmp d8u_1

;***************************************************************************
;*
;* "div8s" - 8/8 Bit Signed Division
;*
;* This subroutine divides the two register variables "dd8s" (dividend) and
;* "dv8s" (divisor). The result is placed in "dres8s" and the remainder in
;* "drem8s".
;* 
;* Number of words :22
;* Number of cycles :103
;* Low registers used :2 (d8s,drem8s)
;* High registers used  :3 (dres8s/dd8s,dv8s,dcnt8s)
;*
;***************************************************************************
;***** Subroutine Register Variables
.def d8s =r14  ;sign register
.def drem8s =r15  ;remainder
.def dres8s =r16  ;result
.def dd8s =r16  ;dividend
.def dv8s =r17  ;divisor
.def dcnt8s =r18  ;loop counter
;***** Code
div8s: mov d8s,dd8s ;move dividend to sign register
eor d8s,dv8s ;xor sign with divisor
sbrc dv8s,7  ;if MSB of divisor set
neg dv8s  ;    change sign of divisor
sbrc dd8s,7  ;if MSB of dividend set
neg dd8s  ;    change sign of divisor
sub drem8s,drem8s ;clear remainder and carry
ldi dcnt8s,9 ;init loop counter
d8s_1: rol dd8s  ;shift left dividend
dec dcnt8s  ;decrement counter
brne d8s_2  ;if done
sbrc d8s,7  ;    if MSB of sign register set
neg dres8s  ;	    change sign of result
ret   ;    return
d8s_2: rol drem8s  ;shift dividend into remainder
sub drem8s,dv8s ;remainder = remainder - divisor
brcc d8s_3  ;if result negative
add drem8s,dv8s ;    restore remainder
clc   ;    clear carry to be shifted into result  
rjmp d8s_1  ;else
d8s_3: sec   ;    set carry to be shifted into result
rjmp d8s_1


;***************************************************************************
;*
;* "div16u" - 16/16 Bit Unsigned Division
;*
;* This subroutine divides the two 16-bit numbers
;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).
;* The result is placed in "dres16uH:dres16uL" and the remainder in
;* "drem16uH:drem16uL".
;* 
;* Number of words :19
;* Number of cycles :235/251 (Min/Max)
;* Low registers used :2 (drem16uL,drem16uH)
;* High registers used  :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH,
;*	   dcnt16u)
;*
;***************************************************************************
;***** Subroutine Register Variables
.def drem16uL=r14
.def drem16uH=r15
.def dres16uL=r16
.def dres16uH=r17
.def dd16uL =r16
.def dd16uH =r17
.def dv16uL =r18
.def dv16uH =r19
.def dcnt16u =r20
;***** Code
div16u: clr drem16uL ;clear remainder Low byte
sub drem16uH,drem16uH;clear remainder High byte and carry
ldi dcnt16u,17 ;init loop counter
d16u_1: rol dd16uL  ;shift left dividend
rol dd16uH
dec dcnt16u  ;decrement counter
brne d16u_2  ;if done
ret   ;    return
d16u_2: rol drem16uL ;shift dividend into remainder
rol drem16uH
sub drem16uL,dv16uL ;remainder = remainder - divisor
sbc drem16uH,dv16uH ;
brcc d16u_3  ;if result negative
add drem16uL,dv16uL ;    restore remainder
adc drem16uH,dv16uH
clc   ;    clear carry to be shifted into result
rjmp d16u_1  ;else
d16u_3: sec   ;    set carry to be shifted into result
rjmp d16u_1

;***************************************************************************
;*
;* "div16s" - 16/16 Bit Signed Division
;*
;* This subroutine divides signed the two 16 bit numbers
;* "dd16sH:dd16sL" (dividend) and "dv16sH:dv16sL" (divisor).
;* The result is placed in "dres16sH:dres16sL" and the remainder in
;* "drem16sH:drem16sL".
;* 
;* Number of words :39
;* Number of cycles :247/263 (Min/Max)
;* Low registers used :3 (d16s,drem16sL,drem16sH)
;* High registers used  :7 (dres16sL/dd16sL,dres16sH/dd16sH,dv16sL,dv16sH,
;*	   dcnt16sH)
;*
;***************************************************************************
;***** Subroutine Register Variables
.def d16s =r13  ;sign register
.def drem16sL=r14  ;remainder low byte 
.def drem16sH=r15  ;remainder high byte
.def dres16sL=r16  ;result low byte
.def dres16sH=r17  ;result high byte
.def dd16sL =r16  ;dividend low byte
.def dd16sH =r17  ;dividend high byte
.def dv16sL =r18  ;divisor low byte
.def dv16sH =r19  ;divisor high byte
.def dcnt16s =r20  ;loop counter
;***** Code
div16s: mov d16s,dd16sH ;move dividend High to sign register
eor d16s,dv16sH ;xor divisor High with sign register
sbrs dd16sH,7 ;if MSB in dividend set
rjmp d16s_1
com dd16sH  ;    change sign of dividend
com dd16sL 
subi dd16sL,low(-1)
sbci dd16sL,high(-1)
d16s_1: sbrs dv16sH,7 ;if MSB in divisor set
rjmp d16s_2
com dv16sH  ;    change sign of divisor
com dv16sL 
subi dv16sL,low(-1)
sbci dv16sH,high(-1)
d16s_2: clr drem16sL ;clear remainder Low byte
sub drem16sH,drem16sH;clear remainder High byte and carry
ldi dcnt16s,17 ;init loop counter
d16s_3: rol dd16sL  ;shift left dividend
rol dd16sH
dec dcnt16s  ;decrement counter
brne d16s_5  ;if done
sbrs d16s,7  ;    if MSB in sign register set
rjmp d16s_4
com dres16sH ;	    change sign of result
com dres16sL
subi dres16sL,low(-1)
sbci dres16sH,high(-1)
d16s_4: ret   ;    return
d16s_5: rol drem16sL ;shift dividend into remainder
rol drem16sH
sub drem16sL,dv16sL ;remainder = remainder - divisor
sbc drem16sH,dv16sH ;
brcc d16s_6  ;if result negative
add drem16sL,dv16sL ;    restore remainder
adc drem16sH,dv16sH
clc   ;    clear carry to be shifted into result
rjmp d16s_3  ;else
d16s_6: sec   ;    set carry to be shifted into result
rjmp d16s_3
;****************************************************************************
;*
;* Test Program
;*
;* This program calls all the subroutines as an example of usage and to
;* verify correct verification.
;*
;****************************************************************************
;***** Main Program Register variables
.def temp =r16  ;temporary storage variable
;***** Code
RESET:
;---------------------------------------------------------------
;Include these lines for devices with SRAM
; ldi temp,low(RAMEND)
; out SPL,temp
; ldi temp,high(RAMEND)
; out SPH,temp ;init Stack Pointer
;---------------------------------------------------------------
;***** Multiply Two Unsigned 8-Bit Numbers (250 * 4)
ldi mc8u,250
ldi mp8u,4
rcall mpy8u  ;result: m8uH:m8uL = $03e8 (1000)
;***** Multiply Two Signed 8-Bit Numbers (-99 * 88)
ldi mc8s,-99
ldi mp8s,88
rcall mpy8s  ;result: m8sH:m8sL = $ddf8 (-8712)
;***** Multiply Two Unsigned 16-Bit Numbers (5050 * 10,000)
ldi mc16uL,low(5050)
ldi mc16uH,high(5050)
ldi mp16uL,low(10000)
ldi mp16uH,high(10000)
rcall mpy16u  ;result: m16u3:m16u2:m16u1:m16u0
   ;=030291a0 (50,500,000)

;***** Multiply Two Signed 16-Bit Numbers (-12345*(-4321))
ldi mc16sL,low(-12345)
ldi mc16sH,high(-12345)
ldi mp16sL,low(-4321)
ldi mp16sH,high(-4321)
rcall mpy16s  ;result: m16s3:m16s2:m16s1:m16s0
   ;=$032df219 (53,342,745)
;***** Divide Two Unsigned 8-Bit Numbers (100/3)
ldi dd8u,100
ldi dv8u,3
rcall div8u  ;result:  $21 (33)
   ;remainder: $01 (1)
;***** Divide Two Signed 8-Bit Numbers (-110/-11)
ldi dd8s,-110
ldi dv8s,-11
rcall div8s  ;result: $0a (10)
   ;remainder $00 (0)

;***** Divide Two Unsigned 16-Bit Numbers (50,000/60,000)
ldi dd16uL,low(50000)
ldi dd16uH,high(50000)
ldi dv16uL,low(60000)
ldi dv16uH,high(60000)
rcall div16u  ;result: $0000 (0)
   ;remainder: $c350 (50,000)

;***** Divide Two Signed 16-Bit Numbers (-22,222/10)
ldi dd16sL,low(-22222)
ldi dd16sH,high(-22222)
ldi dv16sL,low(10)
ldi dv16sH,high(10)
rcall div16s  ;result: $f752 (-2222)
   ;remainder: $0002 (2)
forever:rjmp forever

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

;***************************************************************************
;*
;* "mpy16s" - 16x16 Bit Signed Multiplication
;*
;* This subroutine multiplies signed the two 16-bit register variables
;* mp16sH:mp16sL and mc16sH:mc16sL.
;* The result is placed in m16s3:m16s2:m16s1:m16s0.
;* The routine is an implementation of Booth's algorithm. If all 32 bits
;* in the result are needed, avoid calling the routine with
;* -32768 ($8000) as multiplicand
;* 
;* Number of words :16 + return
;* Number of cycles :210/226 (Min/Max) + return
;* Low registers used :None
;* High registers used  :7 (mp16sL,mp16sH,mc16sL/m16s0,mc16sH/m16s1,
;*	   m16s2,m16s3,mcnt16s)
;*
;***************************************************************************
;***** Subroutine Register Variables
.def mc16sL =r16  ;multiplicand low byte
.def mc16sH =r17  ;multiplicand high byte
.def mp16sL =r18  ;multiplier low byte
.def mp16sH =r19  ;multiplier high byte
.def m16s0 =r18  ;result byte 0 (LSB)
.def m16s1 =r19  ;result byte 1
.def m16s2 =r20  ;result byte 2
.def m16s3 =r21  ;result byte 3 (MSB)
.def mcnt16s =r22  ;loop counter
;***** Code
mpy16s: clr m16s3  ;clear result byte 3
sub m16s2,m16s2 ;clear result byte 2 and carry
ldi mcnt16s,16 ;init loop counter
m16s_1: brcc m16s_2  ;if carry (previous bit) set
add m16s2,mc16sL ;    add multiplicand Low to result byte 2
adc m16s3,mc16sH ;    add multiplicand High to result byte 3
m16s_2: sbrc mp16sL,0 ;if current bit set
sub m16s2,mc16sL ;    sub multiplicand Low from result byte 2
sbrc mp16sL,0 ;if current bit set
sbc m16s3,mc16sH ;    sub multiplicand High from result byte 3
asr m16s3  ;shift right result and multiplier
ror m16s2
ror m16s1
ror m16s0
dec mcnt16s  ;decrement counter
brne m16s_1  ;if not done, loop more
ret

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

Кстати да! Учитывая, что для практического применения этот язык бесполезен (контроллеры все-таки программируют на Ассемблере и Си, остальное намного реже), стоит его и позиционировать как обучение алгоритмическому мышлению (насколько я понял, так оно и есть). А тогда можно либо разработать свою платформу наподобие Arduino или, скажем, Pinboard, заточенную именно для обучения. Плюс в том, что не придется поддерживать весь зоопарк контроллеров а сосредоточиться на одном. Ну и, может продать это удастся.

С другой стороны, даже несмотря на внешнюю похожесть на обычные блок-схемы, суть у них другая. Если помните, там линии обозначают ход выполнения программы, а не потоки данных. То есть чему именно научатся люди с помощью вашего языка? Разумеется, я не отговариваю продолжать работу над ним: как минимум это полезно для саморазвития.

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

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

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

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

А в битах пусть разработчики видеокарт копаются. У них проблема с ресурсами никогда не исчезает. Большая конкуренция...

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

Потому что для практического использования он гораздо труднее, чем хотя бы Си, не говоря о более высокоуровневых языках. А если боитесь конфигурировать переферию - cvavr в руки, вроде как там есть автоконфигураторы. Даже "компьютерные" программиты не переходят на графические языки, хотя об экономии ресурсов или битовой магии речь обычно не идет. Помимо этого, проблемы с портированием (даже на ассемблере можно писать относительно кроссплатформенные программы с гибкой настройкой, не говоря уж о Си).

Ну и практическая полезность. Предложение реализовать бынальные часы или усреднение нескольких измерений АЦП были проигнорированы. Что-то более интересное даже предлагать бессмысленно, а ведь даже часы заняли всего полторы сотни строк Си, с учетом форматирования, комментариев, инициализации и прочего.

Плюс очевидные недостатки, которые я приводил в самом начале - громоздкость "кода"; большее время не программирование по сравнению с текстовыми языками; "замусореность" видимой области посторонними линиями данных, переносимость на другие языки, отсутствие (возможно, только пока) подпрограмм, отсутствие стандартных библиотек (ИМХО для одного автора это крайне трудоемкая задача), отсутствие (возможно, только пока) работы с прерываниями, отсутствие программных настроек (хотя бы на уровне Си-шных или ассемблерных макросов, хотя и они далеко не идеальны). Медленная реакция на внешние события: прием-передача данных по нескольким шинам, обработка АЦП и внешних датчиков, где чуть проспал - и считанные данные бесполезны.

Поэтому повторюсь: в настоящий момент этот проект не готов для практического применения. Максимум для обучения, как конкурент Arduino.

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

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

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

Что такое FBD https://ru.wikipedia.org/wiki/FBD

Примеры аналогичных программ и законченных продуктов:

http://www.owen.ru/c...m_rele/opisanie

http://www.canny.ru/c7

Потому что для практического использования он гораздо труднее, чем хотя бы Си, не говоря о более высокоуровневых языках. А если боитесь конфигурировать переферию - cvavr в руки, вроде как там есть автоконфигураторы. Даже "компьютерные" программиты не переходят на графические языки, хотя об экономии ресурсов или битовой магии речь обычно не идет. Помимо этого, проблемы с портированием (даже на ассемблере можно писать относительно кроссплатформенные программы с гибкой настройкой, не говоря уж о Си).

Ну и практическая полезность. Предложение реализовать бынальные часы или усреднение нескольких измерений АЦП были проигнорированы. Что-то более интересное даже предлагать бессмысленно, а ведь даже часы заняли всего полторы сотни строк Си, с учетом форматирования, комментариев, инициализации и прочего.

Плюс очевидные недостатки, которые я приводил в самом начале - громоздкость "кода"; большее время не программирование по сравнению с текстовыми языками; "замусореность" видимой области посторонними линиями данных, переносимость на другие языки, отсутствие (возможно, только пока) подпрограмм, отсутствие стандартных библиотек (ИМХО для одного автора это крайне трудоемкая задача), отсутствие (возможно, только пока) работы с прерываниями, отсутствие программных настроек (хотя бы на уровне Си-шных или ассемблерных макросов, хотя и они далеко не идеальны). Медленная реакция на внешние события: прием-передача данных по нескольким шинам, обработка АЦП и внешних датчиков, где чуть проспал - и считанные данные бесполезны.

Поэтому повторюсь: в настоящий момент этот проект не готов для практического применения. Максимум для обучения, как конкурент Arduino.

Самым первым языком который я изучил был AVR asssembler, потом Pascal, С, С++, java итд итп. На предприятии столкнулся с FBD. Как раз здесь на виду отражается логика, а исполнение на задний план и в нем не нужны переменные циклы структуры. Я согласен он не покроет весь спектр задач, не сделать на нем например программу осциллографа, обработка потоковых данных. Решаемый круг задач сводится к сбору, обработке, формированию управляющих воздействий и отображению информации. Это например управление ходовыми огнями, автоматизация конвейера, я лично собирал прибор для измерения внутреннего сопротивления аккумулятора.

На счет "усреднение нескольких измерений АЦП" никто не запрещает добавить блок усреднения значения , один вход один выход в свойствах указывается параметры усреднения. Аналогично дело и с часами. По прерываниям они реализованы.

PS с самого начала я использовал assembler, вероятно надо было брать язык си. Сейчас бы не было проблем с датчиками дисплеями, итп. Я просто бы использовал готовые библиотеки. Если найдутся люди желающие сделать тоже самое на си, возможно даже на других контроллерах например stm, совместно можно создать еще одну реализацию.

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

Язык FBD прост в изучении, нагляден и удобен для прикладных специалистов, не имеющих специальной подготовки в области информатики. Жесткая последовательность выполнения приводит к простой внутренней структуре команд, которая транслируется в быстрый и надежный код.
Там же, в начале темя, я писал что столкнулся с подобным "языком", Labview, на практике, и положительных эмоций у меня от него немного. Так вот, может для не-программистов он и удобен, но для того, кто хотя бы пытался программировать, переходить на него - кошмар. Про наглядность там тоже и речи не идет: этот клубок соединений поди разгреби, не говоря уж о том, что может быть нагляднее текстового описания. Жесткая последовательность тоже не в тему: по логике "языка" это одновременное вычисление всех действий, входные данные к которым собраны, далее все зависит от конкретной реализации, в том же Labview выделена специальная линия, использующаяся по сути только для этого. Быстрый код тоже не в тему: переплюнуть тот же асм почти невозможно, не говоря уж о накладных расходах на реализацию распараллеливания задач и прочего.

Впрочем, очевидный плюс распараллеливания - упрощение создания ОСРВ. Правда, сомнительно, что конкретная реализация (что ваш графический язык (придумали бы ему название, что ли), что Labview, что FBD) это позволит в полном объеме, но преимущество было бы существенным.

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

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

На счет "усреднение нескольких измерений АЦП" никто не запрещает добавить блок усреднения значения , один вход один выход в свойствах указывается параметры усреднения. Аналогично дело и с часами. По прерываниям они реализованы.

Между прочим, как раз усреднение и прочая обработка данных АЦП - как раз классическая задача "сбора и обработки данных". Невозможность решить ее штатными средствами языка или необходимость его модификации вызывает, мягко говоря, удивление. Насчет прерываний тоже странно: какой смысл игнорировать столь мощный механизм, тем более что принципиальных проблем по его добавлению незаметно (грубо говоря, FBD-болк, выдающий на выход хоть что-нибудь, когда наступило прерывание).

.

Еще раз, это не попытка отговорить от работы, тем более что она вызывает уважение. Просто надо четко определить область применения и не пытаться выходить за ее пределы. Тот же ассемблер штука хорошая, но только когда скорость и объем кода критичны. Даже под ARM'ы, не говоря про ПК, на нем пишут редко. Или какой-нибудь С#, хорош для программирования ПК, но для ATtiny13 не годится совершенно.

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

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

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

Ни ассемблер, ни даже СИ уже не являются языками высокого уровня. Это языки программистов.

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

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

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

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

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

Ассемблер не является, это самый низкоуровневый язык программирования (машинные коды все же не ЯП). А Си чем не угодил? По первым ссылкам гугля (на достоверность не претендую), Высокоуровневый язык программирования — язык программирования, разработанный для быстроты и удобства использования программистом. Основная черта высокоуровневых языков — это абстракция, то есть введение смысловых конструкций, кратко описывающих такие структуры данных и операции над ними, описания которых на машинном коде (или другом низкоуровневом языке программирования) очень длинны и сложны для понимания.

Википедия добавляет: Высокоуровневые языки программирования были разработаны для платформенной независимости сути алгоритмов. Зависимость от платформы перекладывается на инструментальные программы — трансляторы.

Си вполне подходит под определение. И сложные структуры данных реализованы, и кроссплатформенность. В отличие от графических.

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

И в чем противоречие?
Ну и что бы был понятен порядок вычислений на схеме можно блокам присваивать порядковые номера, которые собственно и определяли бы порядок их исполнения. Все тогда будет определенно...
То есть мало того, что вручную проставлять сами блоки, так еще и номера им пририсовывать? Довольно оригинальный костыль, учитывая что для задания порядка операций уже есть стандартные механизмы. К тому же реализация параллельного выполнения блоков - преимущество, а не недостаток.

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

В теории это, конечно, хорошая идея, но практическая реализация может оказаться довольно сложной. В том же Labview сделана возможность вставки текстовой формулы - блок с несколькими входами и несколькими выходами, у каждого свое имя, а в формуле эти имена работают как переменные. Для выражений сложнее x+x*x гораздо удобнее нагромождения отдельных блоков.

Собственно, я не понял, что вы пытаетесь доказать.

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

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

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

Есть языки для сугубо программистов-профессионалов, а есть языки для специалистов-прикладников той или иной сферы деятельности. Все имеют право на жизнь. Программисты-профессионалы должны , в основном, давать инструменты прикладникам в том виде, в котором прикладникам наиболее удобно работать. Лучше , чем прикладники они алгоритмы не придумают. А прикладники лучше, чем программисты программы не напишут. А программы могут быть разными. Одни чисто исполняют определенные функции, а другие универсальные, т.е. дающие пользователю создавать разновариантные вещи с помощью наборов инструментов, которые универсальной программой предоставляются.

Например , SCADA - универсальная программа для программирования систем верхнего уровня. Аналогичные программы должны быть для программирования контроллеров нижнего уровня. На каждый контроллер, выполняющий свою единичную конкретную задачу программиста не найти. Программировать или конфигурировать , как хотите называйте, по месту должен прикладник. Или даже просто потребитель.

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

По такой классификации, асм+Си для программистов-профессионалов Кому, как не им работать с железом на самом низком уровне.

Си+прочие ЯВУ для программистов-прикладников. Потому что на ассемблере пока гигабайтную программу напишешь пять раз посинеешь, в то же время алгоритмы не проще, чем у предыдущих товарищей.

"языки" настроек, скрипты (в широком смысле), графические языки и прочие упрощенные версии - для пользователей. Они обычно, на программистов не учились и им это не нужно, им надо автоматизировать какую-либо последовательность действий, и чем нагляднее, тем лучше. Сюда можно отнести Ардуинщиков (попробовать свои силы и понять, стоит ли лезть в электронику), физиков-экспериментаторов (автоматизация эксперимента), сисадминов (автоматизация настроек, запуска программ и тд), даже офисных работников (хотя бы банальные формулы в calc или другом табличном процессоре, не говоря уже про макросы).

То есть возвращаемся с чего начали - графический язык лучше всего подходит для легкой автоматизации, но не для низкоуровневого системного программирования.

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

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

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

Пошла игра в термины...

Если под нижним уровнем понимать встроенные в однокристалку периферийные устройства типа счетчиков и интерфейсных схем, для управления которыми нужны познания потрохов кристаллов и структуру управляющих ими регистров, то заниматься ими должен действительно программист на ассемблере или СИ. Результатом труда которого должны быть некие готовые функции , для прикладников представленные некими квадратиками на блок схеме и таблицами настроек этих функций. Прикладник должен оперировать выводами однокристалки и подключаемыми к ним устройствами. Т.е. заниматься электрическим согласованием , параметрами и т.д. И собственно алгоритмами управления....

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

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

В программировании ПК эти "квадратики" называются драйверами и библиотечными функциями. В контроллерах же переферию чаще настраивает разработчик конечного устройства. Уж больно разные задачи приходится решать одними и теми же модулями, к тому же вся эта настройка сводится к чтению даташита и записи нескольких регистров. Напоминаю, мы говорим про 8-битные контроллеры, точнее даже AVR.

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

С каких это пор программист-прикладник должен заниматься электрическими параметрами? Он должен разрабатывать конечную программу (в общем случае - устройство, программно-аппаратный комплекс и т.д.), с которой будет работать пользователь. Для ряда задач может быть полезно "изобрести" макроязык, чтобы облегчить пользователю автоматизацию. Возвращаясь к контроллерам - они не должны программироваться конечным пользователем, для этого есть программисты.

Пошла игра в термины...

Ну так расшифруйте сами употребляемые вами же термины, чтобы не было "игры" и путаницы.

И можете, наконец, сформулировать, что же вы пытаетесь тут доказать?

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

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

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

Я имел дело со SCADA и т.н. технологическим языком для программирования РС совместимых контроллеров нижнего уровня. И довольно успешно решал задачи автоматизации тех. процессов без применения СИ и т.п. сугубо программистких универсальных языков. Такого же рода инструменты должны быть и для однокристалок...

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

Перечитайте вот этот пост, точнее последний абзац. А то такое ощущение, что вы считаете, что я яростно критикую концепцию графических языков и Lihouzov'а лично, и пытаетесь доказать, что так делать неправильно.

Могу еще раз повторить: средства автоматизации, предназначенные для конечного пользователя, удобны и полезны. Это скрипты, мастера настроек (wizard), графические языки. Но они предназначены для относительно простых, с алгоритмической точки зрения, задач. Важным свойством таких средств является простота изменения алгоритма. То есть сегодня он управляет краном с помощью одного вывода, а завтра - другого, да еще с ЦАПом, поскольку старый кран сломался, а на складе нашлись только новые, которые можно открыть не только полностью, но и на 30%, например. В случае контроллера это не выполняется: изменение прошивки не самая простая задача, к тому же его выводы обычно жестко разведены на плате и изменить их назначение из программы невозможно. Вот если контроллер представляет отдельный законченный блок с удобными коннекторами на каждый вывод и собственным блоком питания - немного другое дело. То есть если вернуться к предложению сделать свою плату общего назначения, конфигурируемую на графическом языке, может практическая польза и появится. Сейчас же все еще не ясно, где это можно применить на практике.

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

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

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

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

Многие нынешние однокристалки по производительности и функционалу , включенному на кристал, превосходят ту плату. Не ISA так другая шина или интерфейс, аналоговых входов/выходов и дискретов уже и своих на кристале много, можно нарастить дополнительными чипами...

Чем не блок? Разъемчиков не хватает? Все это можно самостоятельно на макетке накидать в разной конфигурации...

Накидал в среде конфигурацию будущего контороллера в виде квадратиков и по готовым схемным кусочкам собрал на макетке...

В соответствиии с выбранной комплектацией и в среде предоставляться соответствующий набор функциональных блоков должен.

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

Определитесь, для кого вы хотите предназначить разработку. Если для разработчиков обычных устройств на контроллерах (от гирлянд до БПЛА), причем здесь графические языки? А если для "домохозяек", то есть людей, далеких от программирования (тем-то графические языки не нужны) и схемотехники - при чем здесь макетки? Разработчик сделает и десяток макеток и конечную плату, и прошивку самостоятельно на куда более удобных инструментах. А пользователь не будет разбираться в изготовлении платы и чтении даташита на голый контроллер - ему нужен законченный блок со стандартными разъемами и без ковыряний "эта нога может быть чем угодно, а эта только выходом USART'a, а вот на эту, и только на нее, можно подавать 10 В). Пока что больше похоже на попытки создания конкуренции традиционным языкам программирования.

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

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

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

IMHO, очередная "облегчалка" для "чайников", не первая и не последняя. Загнётся точно так-же, как разные FlowCode, LDmicro и.т.д, но оно и к лучшему. Пользы никакой, а вред может нанести ощутимый.

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

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

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

Для электронщиков и системщиков не занимающихся программированием профессионально. Т.е. не изучающих универсальных на все случаи жизни языков. К коим относится СИ. СИ был разработан давно как средство разработок операционок , т.к. к тому времени программирование в кодах уже стало не продуктивным.

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

Пока что болше похоже, что программисты СИ боятся остаться без работы. :yes:

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

GNOME уже операционка? Хотя по объему не так уж далеко :-)

На тему остаться без работы при развитии графических языков - крайне маловероятно. Даже появление куда более высокоуровневых языков (хотя бы С++, java, C#) не уничтожило нишу Си, самодельный конфигуратор на это тем более не повлияет.

"для электронщиков и системщиков" полезнее готовое устройство, а не голый контроллер.

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

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

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

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

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

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

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

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

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

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

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

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

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

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