расталкуйте как пользоваться мк

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар

Сообщение Кислый »

а о стандартах я не говорил :)) я за четкое оформление :)

а стандарты.. это наше всё..
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Контактная информация:
Реклама
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Сообщение eufs »

Мурик писал(а):Если это реализовывать на бейске FastAVR, то HEX получится еще компактнее чем на Си!
Мне по необходимости приходилось расковыривать НЕХ от бейсика и от си. Если сишный компилятор еще более менее компактно создает, хотя и с избыточностью, то бейсик формирует полный бред вообще. Работоспособный, но не более.
PS. Я программирую на асме. На си писал, когда была необходимость. Бейсик не признаю,так как считаю, что программировать на нем можно либо из-за отсутствия знаний (начинающие), либо просто от лени разбираться в программировании на других языках.
C0FFEE=‭12648430‬
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория

Сообщение s_black »

"... кто любит попа, кто попадью, кто попову дочку ... "
Контактная информация:
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

eufs, +1

Я предпочитаю совмещать C и ASM. И, кстати, по результатам расковыривания хексов, генерируемых AVR-GCC (про другие сказать не могу, не ковырял), оный чаще всего довольно неплохо справляется с оптимизацией. Другое дело, что многих эффективных "ручных" оптимизаций на С не сделать. Например, последовательную передачу байта (когда надо разобрать байт на биты) лучше всего писать на асме. Пример (правда, для MSP430, но суть одна, меняются только названия команд в асме):

Код: Выделить всё

for (i=0; i<8; i++)
{
  if (byte & (1<<i))
  {
    //единица в текущем бите
  }
  else
  {
    //ноль в текущем бите
  }
}
Но, очевидно, гораздо эффективнее сделать так:

Код: Выделить всё

  mov #8,R15
  
bitsend_loop:

  rra.b R12//тут байт
  jc    send_1
  jnc   send_0
  
continue_bitsend:

  dec R15
  jnz bitsend_loop
  
  jmp bitsend_compl
  
send_0:

   //ноль в текущем бите

  jmp continue_bitsend
  
send_1:

  //единица в текущем бите

  jmp continue_bitsend
  
bitsend_compl:

...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

eufs писал(а):Если сишный компилятор еще более менее компактно создает, хотя и с избыточностью, то бейсик формирует полный бред вообще.
OK.
Во вложении исходник проги на бейсике, асм файл и HEX.
Можете посмотеть и уже тогда высказать ваше мнение.
Программа не сложная, просто считывается температура с DS1820 и отображается на символьном индикаторе на основе контроллера HD44780.
Вот ее код:

Код: Выделить всё

$Device= 2313
$Stack = 32
$Clock = 3.6864
$Lcd   = PORTD.4, RS=PORTB.4, EN=PORTB.5, 16, 4
$1Wire = PORTD.3
$Source= On

Dim T As Word
Dim d0 As Byte, d1 As Byte, d2 As Byte, d3 As Byte
Dim d4 As Byte, d5 As Byte, d6 As Byte, d7 As Byte
Dim crc As Byte

Declare Sub Read1820()
Declare Sub CalcTmp()

Lcd "DS1820 T="

Do
	If 1Wreset Then
		1Wwrite &hcc; &h44
		WaitMs 250
		1Wreset
		1Wwrite &hcc; &hbe
		Read1820()
	Else
		Locate 1,10: Lcd "---"
	End If
	WaitMs 200
Loop

'/////////////////////////////////////////////////////
Sub Read1820()

1Wread d0,9				' read all 9bytes
If Crc8(d0,9)=0 Then	' check Crc, if OK
	CalcTmp()			' calc temp
Else
	Locate 1,10: Lcd "CRC"
End If
End Sub

'/////////////////////////////////////////////////////
Sub CalcTmp()	' calc for 0.1C resolution
' T is 10 times greater (integer)

If d0.1 Then Decr d0	' if odd decrement
T=(50*d0-25+(100*(d7-d6))/d7)/10
Locate 1,10: Lcd T
End Sub
Ассемблерный листинг, созданный бейсиком из кода (бейсик честно его отдал, да еще и с коммантариями и с возможностью скормить ассемблеру avrasm32.exe):

Код: Выделить всё

.include	"inc\2313DEF.INC"
;
		.DSEG
.ORG	0x60

t:						.byte	 2
d0:						.byte	 1
d1:						.byte	 1
d2:						.byte	 1
d3:						.byte	 1
d4:						.byte	 1
d5:						.byte	 1
d6:						.byte	 1
d7:						.byte	 1
crc:					.byte	 1
		
		.CSEG
.ORG	0x0000

_Reset:
		ldi		yl,byte1(RAMEND)
		out		SPL,yl
		sbiw	yl,32
		rcall	LcdIni

;******	USERS BASIC CODE **********************

;-Line--0021----Lcd "DS1820 T="--
		ldi		zl,byte1(S000*2)
		ldi		zh,byte2(S000*2)
		rcall	_LSc

;-Line--0023----Do--
L0000:

;-Line--0024----If 1Wreset Then--
		rcall	_1Wrs0
		cpi		zl,0x01
		brsh	PC+0x02
		rjmp	L0003
L0004:

;-Line--0025----1Wwrite &hcc; &h44--
		ldi		zl,byte1(204)
		rcall	_1Ww0
		ldi		zl,byte1(68)
		rcall	_1Ww0

;-Line--0026----WaitMs 250--
		ldi		zl,byte1(250)
		rcall	_Wms

;-Line--0027----1Wreset--
		rcall	_1Wrs0

;-Line--0028----1Wwrite &hcc; &hbe--
		ldi		zl,byte1(204)
		rcall	_1Ww0
		ldi		zl,byte1(190)
		rcall	_1Ww0

;-Line--0029----Read1820()--
		rcall	read1820

;-Line--0030----Else--
		rjmp	L0002
L0003:

;-Line--0031----Locate 1,10: Lcd "---"--
		ldi		r24,0x7F
		push	r24
		ldi		zl,byte1(10)
		pop		r24
		add		r24,zl
		rcall	_LCtr
		ldi		zl,byte1(S001*2)
		ldi		zh,byte2(S001*2)
		rcall	_LSc

;-Line--0032----End If--
L0002:

;-Line--0033----WaitMs 200--
		ldi		zl,byte1(200)
		rcall	_Wms

;-Line--0034----Loop--
		rjmp	L0000
L0001:

;-Line--0037----Sub Read1820()--
read1820:

;-Line--0039----1Wread d0,9				' read all 9bytes--
		ldi		xl,d0
		ldi		zl,byte1(9)
		rcall	_1WrA0

;-Line--0040----If Crc8(d0,9)=0 Then	' check Crc, if OK--
		ldi		xl,d0
		clr		xh
		ldi		zl,byte1(9)
		rcall	_Crc8
		push	zl
		ldi		zl,byte1(0)
		pop		r24
		cp		r24,zl
		breq	PC+0x02
		rjmp	L0007
L0008:

;-Line--0041----CalcTmp()			' calc temp--
		rcall	calctmp

;-Line--0042----Else--
		rjmp	L0006
L0007:

;-Line--0043----Locate 1,10: Lcd "CRC"--
		ldi		r24,0x7F
		push	r24
		ldi		zl,byte1(10)
		pop		r24
		add		r24,zl
		rcall	_LCtr
		ldi		zl,byte1(S002*2)
		ldi		zh,byte2(S002*2)
		rcall	_LSc

;-Line--0044----End If--
L0006:

;-Line--0045----End Sub--
L0005:
		ret

;-Line--0048----Sub CalcTmp()	' calc for 0.1C resolution--
calctmp:

;-Line--0051----If d0.1 Then Decr d0	' if odd decrement--
		lds		r24,d0
		sbrs	r24,1
		rjmp	L0011
L0012:
		lds		zl,d0
		dec		zl
		sts		d0,zl
L0011:

;-Line--0052----T=(50*d0-25+(100*(d7-d6))/d7)/10--
		ldi		zl,byte1(50)
		ldi		zh,byte2(50)
		push	zh
		push	zl
		lds		zl,d0
		clr		zh
		pop		r24
		pop		r25
		rcall	Mp16u
		push	zh
		push	zl
		ldi		zl,byte1(25)
		ldi		zh,byte2(25)
		pop		r24
		pop		r25
		sub		r24,zl
		sbc		r25,zh
		mov		zl,r24
		mov		zh,r25
		push	zh
		push	zl
		ldi		zl,byte1(100)
		ldi		zh,byte2(100)
		push	zh
		push	zl
		lds		zl,d7
		clr		zh
		push	zh
		push	zl
		lds		zl,d6
		clr		zh
		pop		r24
		pop		r25
		sub		r24,zl
		sbc		r25,zh
		mov		zl,r24
		mov		zh,r25
		pop		r24
		pop		r25
		rcall	Mp16u
		push	zh
		push	zl
		lds		zl,d7
		clr		zh
		pop		r24
		pop		r25
		rcall	Di16u
		pop		r24
		pop		r25
		add		zl,r24
		adc		zh,r25
		push	zh
		push	zl
		ldi		zl,byte1(10)
		ldi		zh,byte2(10)
		pop		r24
		pop		r25
		rcall	Di16u
		sts		t,zl
		sts		t+1,zh

;-Line--0053----Locate 1,10: Lcd T--
		ldi		r24,0x7F
		push	r24
		ldi		zl,byte1(10)
		pop		r24
		add		r24,zl
		rcall	_LCtr
		lds		zl,t
		lds		zh,t+1
		rcall	_W2Str
		rcall	_LBW

;-Line--0054----End Sub--
L0009:
		ret

;****** END OF USER BASIC CODE ****************

; String constants:
S000:	.db	"DS1820 T=", 0
S001:	.db	"---", 0
S002:	.db	"CRC", 0


;////// LcdInit ///////////////////////////
LcdIni:	in		zl,DDRD
		ori		zl,0xf0
		out		DDRD,zl
		sbi		DDRB,4
		sbi		DDRB,5
		cbi		PORTB,4
		cbi		PORTB,5
		ldi		zl,0x18
		rcall	_Wms
		ldi		r24,0x03
		rcall	_LOut
		ldi		zl,0x08
		rcall	_Wms
		rcall	_LEN
		ldi		zl,0x0d
		rcall	_Wus
		rcall	_LEN
		cbi		PORTD,4
		rcall	_LEN
		ldi		r24,0x28
		rcall	_LCtr
		ldi		r24,0x06
		rcall	_LCtr
		ldi		r24,0x0c
		rcall	_LCtr
		ldi		r24,0x01
		rcall	_LCtr
		ldi		zl,0x04
		rcall	_Wms
		ret

_Lch:	sbi		PORTB,4
		rjmp	_LNib
_LCtr:	cbi		PORTB,4
_LNib:	mov		r21,r24
		swap	r24
		rcall	_LOut
		mov		r24,r21
_LOut:	in		r23,PORTD
		andi	r23,0x0f
		swap	r24
		andi	r24,0xf0
		or		r24,r23
		out		PORTD,r24
		rcall	_LEN
		ret

;////// LcdEN /////////////////////////////
_LEN:	sbi		PORTB,5
		Nop
		Nop
		cbi		PORTB,5
		push	zl
		ldi		zl,0x04
		rcall	_Wus
		pop		zl
		ret

;////// LCD Byte & Word ///////////////////
_LBW:	ld		r24,Z+
		tst		r24
		breq	_LBW1
		rcall	_Lch
		rjmp	_LBW
_LBW1:	ret

;////// LCD string constants //////////////
_LSc:	lpm
		adiw	zl,0x01
		tst		r0
		breq	_LSc1
		mov		r24,r0
		rcall	_Lch
		rjmp	_LSc
_Lsc1:	ret

;////// 1Wreset ///////////////////////////
_1Wrs0:	sbi		DDRD,3
		cbi		PORTD,3
		ldi		zl,50
		rcall	_Wus
		cbi		DDRD,3
		ldi		zl,7
		rcall	_Wus
		sbic	PIND,3
		ret
		ldi		zl,50
		rcall	_Wus
		ldi		zl,1
		ret

;////// 1Wwrite ///////////////////////////
_1Ww0:	mov		r24,zl
		ldi		zh,8
		sbi		DDRD, 3
_1Ww10:	cbi		PORTD,3
		rcall	_W5
		ror		r24
		brcc	_1Ww20
		sbi		PORTD,3
_1Ww20:	ldi		zl,5
		rcall	_Wus
		sbi		PORTD,3
		rcall	_W5
		dec		zh
		brne	_1Ww10
		ret

;////// 1Wread ////////////////////////////
_1Wr0:	ldi		r24,8
_1Wr10:	cbi		PORTD,3
		rcall	_W5
		cbi		DDRD,3
		ldi		zl,2
		rcall	_Wus
		clc
		sbic	PIND,3
		sec
		ror		zh
		ldi		zl,5
		rcall	_Wus
		sbi		PORTD,3
		sbi		DDRD,3
		rcall	_W5
		dec		r24
		brne	_1Wr10
		mov		zl,zh
		ret

;////// 1WireReadAll //////////////////////
_1WrA0:	mov		r25,zl
_1rA10:	rcall	_1Wr0
		st		X+,zl
		dec		r25
		brne	_1rA10
		ret

;////// CalcCrc8 //////////////////////////
_Crc8:	mov		r25,zl
		clr		zl
		ldi		r21,0x8c
_Cr81:	ldi		r24,8
		ld		zh,X+
_Cr82:	mov		r23,zh
		andi	r23,0x01
		mov		r22,zl
		andi	r22,0x01
		eor		r22,r23
		lsr		zl
		lsr		zh
		sbrc	r22,0
		eor		zl,r21
		dec		r24
		brne	_Cr82
		dec		r25
		brne	_Cr81
		ret

;////// IntToStr //////////////////////////
_B2str:	clr	zh
		clt
		rjmp	_W2st4
_W2str:	clt
		rjmp	_W2st4
_I2str:	clt
		sbrs	zh,0x07
		rjmp	_W2st4
		com		zl
		com		zh
		subi	zl,-0x01
		sbci	zh,-0x01
		Set
_W2st4:	push	yl
		push	r6
		clr		r6
		st		-Y,r6
_N2str:	ldi		r21,0x10
		sub		r22,r22
_N2st1:	lsr		r6
		rol		zl
		rol		zh
		rol		r22
		rol		r6
		cpi		r22,0x0a
		brcs	_N2st2
		sbci	r22,0x0a
		inc		zl
_N2st2:	dec		r21
		brne	_N2st1
		subi	r22,-0x30
		st		-Y,r22
		mov		r22,zl
		or		r22,zh
		brne	_N2str
_N2st5:	brtc	_N2st3
		ldi		zl,0x2d
		st		-Y,zl
_N2st3:	mov		zl,yl
		pop		r6
		pop		yl
		ret

;////// _Waitms ///////////////////////////
_Wms:	ldi		r20,0x14
_Wms1:	ldi		r21,0x3D
_Wms2:	dec		r21
		brne	_Wms2
		dec		r20
		brne	_Wms1
		dec		zl
		brne	_Wms
		ret

;////// _waitus ///////////////////////////
_wus:	ldi		r22,11
_wus1:	dec		r22
		brne	_wus1
		dec		zl
		brne	_wus
		ret

;////// Wait 5us //////////////////////////
_W5:	ldi		r21,3
_W51:	dec		r21
		brne	_W51
		ret

;////// 16x16 unsigned multiplay //////////
Mp16u:	clr		r23
		clr		r22
		ldi		r21,0x10
		lsr		zh
		ror		zl
m16u1:	brcc	m16u2
		add		r22,r24
		adc		r23,r25
m16u2:	ror		r23
		ror		r22
		ror		zh
		ror		zl
		dec		r21
		brne	m16u1
		ret

;////// 16/16 unsigned division ///////////
Di16u:	mov		r22,zl
		mov		r23,zh
		mov		zl,r24
		mov		zh,r25
		clr		r24
		sub		r25,r25
		ldi		r20,0x11
d16u1:	rol		zl
		rol		zh
		dec		r20
		brne	d16u2
		ret
d16u2:	rol		r24
		rol		r25
		sub		r24,r22
		sbc		r25,r23
		brcc	d16u3
		add		r24,r22
		adc		r25,r23
		clc
		rjmp	d16u1
d16u3:	sec
		rjmp	d16u1

;System Global Variables: 0  bytes
;User   Global Variables: 11  bytes
Прошивка:

Код: Выделить всё

:020000020000FC
:10000000CFEDCDBFA0979AD0EAE2F1E0D3D0DAD01D
:10001000E13008F40DC0ECECE2D0E4E4E0D0EAEF2B
:1000200043D1D0D0ECECDBD0EEEBD9D00DD009C071
:100030008FE78F93EAE08F918E0FA0D0E4E3F1E099
:10004000B9D0E8EC31D1E3CFA2E6E9E0EAD0A2E60C
:10005000BB27E9E0ECD0EF93E0E08F918E1709F039
:1000600002C00BD009C08FE78F93EAE08F918E0F0B
:1000700085D0E8E3F1E09ED008958091620081FF91
:1000800005C0E0916200EA95E0936200E2E3F0E0EF
:10009000FF93EF93E0916200FF278F919F9117D11B
:1000A000FF93EF93E9E1F0E08F919F918E1B9F0BFF
:1000B000E82FF92FFF93EF93E4E6F0E0FF93EF933F
:1000C000E0916900FF27FF93EF93E0916800FF271D
:1000D0008F919F918E1B9F0BE82FF92F8F919F91EE
:1000E000F6D0FF93EF93E0916900FF278F919F91E6
:1000F000FDD08F919F91E80FF91FFF93EF93EAE0F6
:10010000F0E08F919F91F2D0E0936000F093610056
:100110008FE78F93EAE08F918E0F30D0E0916000EF
:10012000F09161009AD040D0089544533138323074
:1001300020543D002D2D2D0043524300E1B3E06FCC
:10014000E1BBBC9ABD9AC498C598E8E1ADD083E004
:100150001AD0E8E0A9D01FD0EDE0AFD01CD0949821
:100160001AD088E20BD086E009D08CE007D081E07D
:1001700005D0E4E099D00895C49A01C0C498582FDE
:10018000829501D0852F72B37F708295807F872BF7
:1001900082BB01D00895C59A00000000C598EF9376
:1001A000E4E08BD0EF9108958191882311F0E4DF92
:1001B000FBCF0895C8953196002019F0802DDCDF23
:1001C000F9CF08958B9A9398E2E377D08B98E7E084
:1001D00074D083990895E2E370D0E1E008958E2F02
:1001E000F8E08B9A93986FD0879508F4939AE5E09E
:1001F00064D0939A68D0FA95A9F7089588E0939807
:1002000062D08B98E2E059D0889483990894F7954E
:10021000E5E053D0939A8B9A56D08A9581F7EF2FC9
:1002200008959E2FEBDFED939A95E1F708959E2FA9
:10023000EE275CE888E0FD917F2F71706E2F617072
:100240006727E695F69560FDE5278A95A9F79A95C3
:1002500089F70895FF27E8940AC0E89408C0E89455
:10026000F7FF05C0E095F095EF5FFF4F6894CF93DF
:100270006F9266246A9250E1661B6694EE1FFF1F20
:10028000661F661C6A3010F06A40E3955A95A9F71C
:10029000605D6A936E2F6F2B71F716F4EDE2EA93AF
:1002A000EC2F6F90CF91089544E15DE35A95F1F7FB
:1002B0004A95D9F7EA95C1F708956BE06A95F1F789
:1002C000EA95D9F7089553E05A95F1F708957727FD
:1002D000662750E1F695E79510F4680F791F77953A
:1002E0006795F795E7955A95B9F708956E2F7F2F83
:1002F000E82FF92F8827991B41E1EE1FFF1F4A9530
:1003000009F40895881F991F861B970B20F4860F08
:0A031000971F8894F2CF0894F0CFF5
:00000001FF

Как видим, юзается камень At90S2313, прога в нем занимает 61 % флеша (397 инструкций).

Во вложении исходник на бейсике, асм файл и прошивка.
Вложения
Бейсик.rar
(3.87 КБ) 164 скачивания
Реклама
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Сообщение eufs »

Ну и чему радоваться? Для такой простой программы 1.2Кб прошивка. По меньшей мере вдвое короче будет, если на асме написать. Например поясните назначение подпрограмм умножения 16х16 и деления 16/16 для конечного результата. Даже если они нужны(что сомнительно), все равно размерность всех необходимых переменных не превышает байта для той точности показаний, которая выбрана. Крайне коряво написана пп вывода числа на дисплей,как и его инициализация(избыточно). Фигня вобщем.
Посмотрите как выглядит на асме перевод НЕХ-ДЕС(0-999) вместе с выводом на дисплей

Код: Выделить всё

;подпрограмма перевода шестнадцатиричного числа (r16 L,r17 H) и вывода на дисплей
hexd3:	andi r17,$03

	ldi r20,$30
gexx5:	mov r18,r16		;сохраним
	mov r19,r17
	subi r16,100		;вычитаем сотню
	sbci r17,0
	brcs gexx6		;проверка
	inc r20			
	rjmp gexx5

gexx6:	mov r17,r20
	rcall d_out

	mov r16,r18		;восст сохраненное

	ldi r20,$30
gexx7:	mov r18,r16		;сохраним
	subi r16,10		;вычитаем десять
	brcs gexx8		;проверка
	inc r20			
	rjmp gexx7

gexx8:	mov r17,r20
	rcall d_out
	ldi r17,$30
	add r17,r18
	rcall d_out
	ret
Последний раз редактировалось eufs Вт июн 28, 2011 00:55:04, всего редактировалось 2 раза.
C0FFEE=‭12648430‬
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

eufs писал(а):По меньшей мере вдвое короче будет, если на асме написать.
Вы не с асмом сравнивайте, а с одним из языков высокого уровня.
eufs писал(а):Например поясните назначение подпрограмм умножения 16х16 и деления 16/16 для конечного результата. Даже если они нужны(что сомнительно), все равно размерность всех необходимых переменных не превышает байта для той точности показаний, которая выбрана.
Смотрите, в программе есть вычисление температуры:

Код: Выделить всё

T=(50*d0-25+(100*(d7-d6))/d7)/10
и при том, переменная T типа Word (2 байта).

Код: Выделить всё

Dim T As Word
Ноги именно отсюда растут.

eufs писал(а):Крайне коряво написана пп вывода числа на дисплей,как и его инициализация(избыточно).
Ну на асме я могу нормально написать, но языки высокого уровня не способны "вылизывать" код.
eufs писал(а):Фигня вобщем.
Ждем не фигню на Си, который вы нахваливали
eufs писал(а):Если сишный компилятор еще более менее компактно создает
Ждемс, и посмотрим.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар

Сообщение Кислый »

зреет холивар :)))
пошел за попкорном. хочу увидеть сишный код, чтобы сходить за колой
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Контактная информация:
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Сообщение eufs »

Мурик писал(а):Смотрите, в программе есть вычисление температуры:

Код: Выделить всё

T=(50*d0-25+(100*(d7-d6))/d7)/10
и при том, переменная T типа Word (2 байта).

Код: Выделить всё

Dim T As Word
Ноги именно отсюда растут.
Ну на асме я могу нормально написать, но языки высокого уровня не способны "вылизывать" код.
Ждем не фигню на Си, который вы нахваливали
eufs писал(а):Если сишный компилятор еще более менее компактно создает
Ждемс, и посмотрим.
Откуда и что берется я видел. Вы сознательно применяете арифметические операции, и вордовые переменные чтобы код был длинее? И еще утверждаете что на асме можете писать компактно?
Никто Си не нахваливал. Я против языков высокого уровня впринципе, но могу еще рассматривать как представителя оных компилятор Си. И именно потому что смотрел скомпилированный код. Ваш пример на бейсике меня не убедил.
eufs писал(а):PS. Я программирую на асме. На си писал, когда была необходимость
Сейчас этой необходимости нет, поэтому могу выложить модули работы с дисплеем и далласом на асме. Перевод чисел и вывод на дисплей уже есть.
C0FFEE=‭12648430‬
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

eufs писал(а):Вы сознательно применяете арифметические операции, и вордовые переменные чтобы код был длинее?
Нет, это пример из дистрибутива компилятора. Просто взял не банальный, типа мигания светодиодом, а посложнее.

Ну тогда пример по проще - бегущий огонек на PORTB

Код: Выделить всё

$Device= 8515			' used device
$Stack = 32				' stack depth
$Clock = 7.3728				' used crystal
$Source= On				' basic source in Asm

Dim n As Byte

DDRB=&hff				' PortB is output
n=&hfe					' init n

Do   					' never ending loop
	PORTB=n				' n out to port
	Rotate(Left, 1, n)	' rotate n left one bit
	WaitMs 100			' 100ms delay
Loop					' back to start of loop
Ассемблерный листинг

Код: Выделить всё

.include	"inc\8515DEF.INC"
;
		.DSEG
.ORG	0x60

n:						.byte	 1
		
		.CSEG
.ORG	0x0000

_Reset:
		ldi		yl,byte1(RAMEND)
		out		SPL,yl
		ldi		yh,byte2(RAMEND)
		out		SPL+1,yh
		sbiw	yl,32

;******	USERS BASIC CODE **********************

;-Line--0012----DDRB=&hff				' PortB is output--
		ldi		zl,byte1(255)
		out		DDRB,zl

;-Line--0013----n=&hfe					' init n--
		ldi		zl,byte1(254)
		sts		n,zl

;-Line--0015----Do   					' never ending loop--
L0000:

;-Line--0016----PORTB=n				' n out to port--
		lds		zl,n
		out		PORTB,zl

;-Line--0017----Rotate(Left, 1, n)	' rotate n left one bit--
		lds		zl,n
		ldi		r24,1 
		rcall	_RotBL
		sts		n,zl

;-Line--0018----WaitMs 100			' 100ms delay--
		ldi		zl,byte1(100)
		rcall	_Wms

;-Line--0019----Loop					' back to start of loop--
		rjmp	L0000
L0001:

;****** END OF USER BASIC CODE ****************


;////// RotateLeftByte ////////////////////
_RotBL:	lsl		zl
		brcc	_RtBL1
		sbr		zl,1
_RtBL1:	dec		r24
		brne	_RotBL
		ret

;////// _Waitms ///////////////////////////
_Wms:	ldi		r20,0x14
_Wms1:	ldi		r21,0x7A
_Wms2:	dec		r21
		brne	_Wms2
		dec		r20
		brne	_Wms1
		dec		zl
		brne	_Wms
		ret

;System Global Variables: 0  bytes
;User   Global Variables: 1  bytes
HEX.

Код: Выделить всё

:020000020000FC
:10000000CFE5CDBFD2E0DEBFA097EFEFE7BBEEEFCD
:10001000E0936000E0916000E8BBE091600081E067
:1000200005D0E0936000E4E607D0F4CFEE0F08F4CB
:10003000E1608A95D9F7089544E15AE75A95F1F7B6
:0A0040004A95D9F7EA95C1F7089533
:00000001FF
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Сообщение eufs »

Код: Выделить всё

		.include "m8515def.inc"

begin:	ser r16
		out ddrb,r16
		clr r17
		clr r18
		ldi r16,1
loop:	out portb,r16
		rol r16
tr0:	dec r17
		brne tr0
		dec r18
		brne tr0
		rjmp loop	
И код 12 команд

Код: Выделить всё

:020000020000FC
:100000000FEF07BB1127222701E008BB001F1A953D
:08001000F1F72A95E1F7F9CFA1
:00000001FF
В чем и кого Вы хотите убедить?
C0FFEE=‭12648430‬
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

eufs писал(а):И код 12 команд
Вы на Си покажите этот код в 12 команд.
Вы же писали что
eufs писал(а):Если сишный компилятор еще более менее компактно создает, хотя и с избыточностью, то бейсик формирует полный бред вообще.
Вот покажите не бред на Си, иначе это были пустые слова!
А асм с языком высокого уровня глупо сравнивать!
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Сообщение eufs »

Мурик писал(а):
eufs писал(а):И код 12 команд
Вы на Си покажите этот код в 12 команд.
Вы же писали что
eufs писал(а):Если сишный компилятор еще более менее компактно создает, хотя и с избыточностью, то бейсик формирует полный бред вообще.
Вот покажите не бред на Си, иначе это были пустые слова!
А асм с языком высокого уровня глупо сравнивать!
С чего вы взяли что я что-то буду писать на Си, декомпилировать? Я могу выложить тот файл после бейсика, который видел сам (кодировка дос!). Попробуйте хоть что-то там понять. Бейсик по определению язык более высокого уровня чем си, из-за этого более избыточен при компилировании. Я написал вам код на асме в три раза короче - и это элементарная программа. Пишите на асме - и не будет споров что лучше - си или бейсик. АСМ forever!
Вложения
prb.asm
(31.92 КБ) 210 скачиваний
Последний раз редактировалось eufs Вт июн 28, 2011 21:07:42, всего редактировалось 1 раз.
C0FFEE=‭12648430‬
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

eufs писал(а):Я могу выложить тот файл после бейсика, который видел сам.
Зачем? Ведь я выложил проги на бейсике и их ассемблерные листинги.
Разве в асм. листинге есть очень много избыточного кода, что можно сказать что это полный бред?
eufs писал(а):Бейсик по определению язык более высокого уровня чем си, из-за этого более избыточен при компилировании.
Ну вот опять за старое.
Дайте код на Си и его асм. листинг и будем сравнивать, а без кода это всего лишь пустые слова!
Или вы реально считаете что те проги что я выложил на бейсике слишком избыточны учитывая что созданы с помощью языка высокого уровня и на Си можно сделать во много раз компактнее и оптимальнее? Если да, то примеры встудию, а если нет, то в чем предмет спора?
eufs писал(а):Пишите на асме - и не будет споров что лучше - си или бейсик. АСМ forever!
Понимаете, я могу написать на бейсике и получу почти тоже самое, ведь код довольно оптимальный учитывая что это язык высокого уровня.
В крайнем случае, асм. вставки не отменяли и если заметили, бейсик создает ассемблерный листинг, который можно скормить avrasm32.exe, а это значит что можно написать программу на бейсике, при необходимости оптимизировать ее асм. код и скомпилировать с помощью avrasm32.exe.
Это будет проще и быстрее чем писать полностью на ассемблере. 8)
Так что не нужно хаять бейсик - он хороший. :)

Бейсиков для компа это тоже касается, т. к. есть весьма достойные компиляторы, но их списывают со счетов только лишь потому что это бейсик.
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Вот покажите не бред на Си

Код: Выделить всё

void main(void)
{
  register volatile unsigned char x=1;

  DDRB=0xFF;

  while (1)
  {
    PORTB=x;
	x=(x)?(x<<1):(1);
	_delay_ms(100);
  }
}
->

Код: Выделить всё

---- test.c ---------------------------------------------------------------------------------------
6:          register volatile unsigned char x=1;
+00000028:   E081        LDI     R24,0x01         Load immediate
+00000029:   8389        STD     Y+1,R24          Store indirect with displacement
8:          DDRB=0xFF;
+0000002A:   EF8F        SER     R24              Set Register
+0000002B:   B984        OUT     0x04,R24         Out to I/O location
---- d:\WinAVR\avr\include\util\delay_basic.h -----------------------------------------------------
105:      	__asm__ volatile (
+0000002C:   EC28        LDI     R18,0xC8         Load immediate
+0000002D:   E030        LDI     R19,0x00         Load immediate
---- test.c ---------------------------------------------------------------------------------------
12:           PORTB=x;
+0000002E:   8189        LDD     R24,Y+1          Load indirect with displacement
+0000002F:   B985        OUT     0x05,R24         Out to I/O location
13:       	x=(x)?(x<<1):(1);
+00000030:   8189        LDD     R24,Y+1          Load indirect with displacement
+00000031:   2388        TST     R24              Test for Zero or Minus
+00000032:   F411        BRNE    PC+0x03          Branch if not equal
+00000033:   E081        LDI     R24,0x01         Load immediate
+00000034:   C002        RJMP    PC+0x0003        Relative jump
+00000035:   8189        LDD     R24,Y+1          Load indirect with displacement
+00000036:   0F88        LSL     R24              Logical Shift Left
+00000037:   8389        STD     Y+1,R24          Store indirect with displacement
+00000038:   EE88        LDI     R24,0xE8         Load immediate
+00000039:   E093        LDI     R25,0x03         Load immediate
+0000003A:   01F9        MOVW    R30,R18          Copy register pair
+0000003B:   9731        SBIW    R30,0x01         Subtract immediate from word
+0000003C:   F7F1        BRNE    PC-0x01          Branch if not equal
---- d:\WinAVR\avr\include\util\delay.h -----------------------------------------------------------
124:      			__ticks --;
+0000003D:   9701        SBIW    R24,0x01         Subtract immediate from word
120:      		while(__ticks)
+0000003E:   F7D9        BRNE    PC-0x04          Branch if not equal
+0000003F:   CFEE        RJMP    PC-0x0011        Relative jump
+00000040:   94F8        CLI                      Global Interrupt Disable
+00000041:   CFFF        RJMP    PC-0x0000        Relative jump
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Сообщение eufs »

Мурик писал(а):Или вы реально считаете что те проги что я выложил на бейсике слишком избыточны учитывая что созданы с помощью языка высокого уровня и на Си можно сделать во много раз компактнее и оптимальнее? Если да, то примеры встудию, а если нет, то в чем предмет спора?
Что Си, что бейсик одного поля ягоды. Они дают скорость в разработке программ в ущерб их оптимальности в плане длины и скорости работы. Если вы преднамеренно с этим соглашаетесь - спора нет. Бейсик в этом плане ХУЖЕ. Даже по определению. Вот и все.

Понимаете, я могу написать на бейсике и получу почти тоже самое, ведь код довольно оптимальный ......skip.....Это будет проще и быстрее чем писать полностью на ассемблере. 8)
Вы заблуждаетесь. О какой опитмальности идет речь, если программы получаются в разы дленнее. Вставки на асме не безобидная вещь, так как требует вмешательства в конечный код. При этом существует проблема передачи значений переменных и сохранения регистров.
И вы забыли, что в асме тоже можно использовать готовые модули и библиотеки с незначительной корректировкой а то и вовсе без нее. Это сильно ускоряет работу почти без ущерба. И тут бабка надвое говорит, что будет быстрее - я буду писать при помощи модульного программирования или вы на бейсике. А вот глючить начнет - я разберусь быстрее, да и в кристалл влезет больше
Так что не нужно хаять бейсик - он хороший. :)

Бейсиков для компа это тоже касается, т. к. есть весьма достойные компиляторы, но их списывают со счетов только лишь потому что это бейсик.
Я преставляю себе ядро Windows на бейсике. Не смешите. Всему свое применение.
To YS. 25 инструкций, однако. Надо бы сдвиг переделать :roll: (сложением: х=1; цикл по 8; x=x+x )
Последний раз редактировалось eufs Вт июн 28, 2011 22:14:38, всего редактировалось 1 раз.
C0FFEE=‭12648430‬
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

YS, при таком подходе, на бейсике можно сделать так:

Код: Выделить всё

Dim n As Byte

DDRB=&hff				' PortB is output
n=1					' init n

Do   					' never ending loop
	PORTB=n				' n out to port
	Shift(Left, 1, n)	' rotate n left one bit
	WaitMs 100			' 100ms delay
Loop
Ассемблерный листинг:

Код: Выделить всё

;******	USERS BASIC CODE **********************

;-Line--0012----DDRB=&hff				' PortB is output--
		ldi		zl,byte1(255)
		out		DDRB,zl

;-Line--0013----n=1					' init n--
		ldi		zl,byte1(1)
		sts		n,zl

;-Line--0015----Do   					' never ending loop--
L0000:

;-Line--0016----PORTB=n				' n out to port--
		lds		zl,n
		out		PORTB,zl

;-Line--0017----shift(Left, 1, n)	' rotate n left one bit--
		lds		zl,n
		lsl		zl
		sts		n,zl

;-Line--0018----WaitMs 100			' 100ms delay--
		ldi		zl,byte1(100)
		rcall	_Wms

;-Line--0019----Loop--
		rjmp	L0000
L0001:

;****** END OF USER BASIC CODE ****************


;////// _Waitms ///////////////////////////
_Wms:	ldi		r20,0x14
_Wms1:	ldi		r21,0x11
_Wms2:	dec		r21
		brne	_Wms2
		dec		r20
		brne	_Wms1
		dec		zl
		brne	_Wms
		ret
А теперь давайте посчитаем инструкции.
На Си их 26
На бейсике - 21

Вывод?
eufs писал(а):Они дают скорость в разработке программ в ущерб их оптимальности в плане длины и скорости работы. Если вы преднамеренно с этим соглашаетесь - спора нет.
Я по моему не писал что на языке высокого уровня получаются проги оптимальнее чем на асме, хотя тут многое зависит от прокладки между креслом и монитором. Если нет опыта, то на асме можно создать прогу похуже чем на языке высокого уровня, но сейчас речь не об этом.
eufs писал(а):Бейсик в этом плане ХУЖЕ. Даже по определению.
Выше показал что на бейсике прога содержит меньше инструкций. Тогда чем хуже? Только лишь тем что это бейсик? А если бы назывался по другому то сразу стал-бы намного ЛУЧШЕ?
eufs писал(а):Я преставляю себе ядро Windows на бейсике.
Хм, бейсик это всего лишь название языка программирования и что мешает создать для него компилятор, с помощью которого можно создать ядро ОС? Другое дело что этим вряд ли будут заморачиваться.
Но про комп я питал не имея в виду глубокое системное программирование, а программирование на уровне пользователя (гуй, игры, работа с портами COM, LPT, USB и т. д.).
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар

Сообщение Кислый »

Мне ситуация напомнила о геях. Вроде и конкуренция меньше ( на самочек не притендуют ), а в голову всёравно хочется дать. :kill:
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Контактная информация:
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Сообщение eufs »

Последний пример, во всяком случае, уже кое-что. Но боюсь (глядя на пример с далласом) это скорее исключение, ввиду простоты программы.
Мурик писал(а):
Я по моему не писал что на языке высокого уровня получаются проги оптимальнее чем на асме, хотя тут многое зависит от прокладки между креслом и монитором.
Как раз от этой прокладки зависит выбор среды програмирования, ибо от этого зависят возможности, краткость реализации, а в конечном итоге - полнота использования ресурсов МК. А это называется профессионализмом. На пионерском бейсике - пионерское и получается. Спорьте или нет, ежу понятно, что на асме можно сделать на том же кристалле и с теми же ножками больше и лучше. Но если вам хватает бейсика - никто не против.
Ресурсов (скорости работы, объемы памяти) аж занадто, например в ПК, скоро программеры расслабятся и появятся ОСы на бейсике. А кто от этого выиграет?
Кислый писал(а):Мне ситуация напомнила о геях. Вроде и конкуренция меньше ( на самочек не притендуют ), а в голову всёравно хочется дать. :kill:
Это к чему? Попкорн закончился?
C0FFEE=‭12648430‬
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Каждый язык хорош для своих задач. На С удобно реализовывать общую логику работы (сверхскорость и сверхкомпактность жизненно необходимы не везде), а ассемблерными вставками логично реализовывать критичные места. Это позволяет добиться удобства разработки и эффективности кода.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»