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

Динамическая индикация на ассемблере


Юстас

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

Из моего проекта. Я использую программные таймеры и конечные автоматы. Макрос Proc_7_Segm_Ind запускается либо в прерывании таймера, либо как у меня в основном цикле. Я выстраиваю свои программы так, что у меня итерация основного цикла впаковывается в системный тик 1 мс с запасом. Псевдопараллельность процессов.

На си это будет так:

//========================================================================
#include "seven_segm_led_ind.h"
//========================================================================

//========================================================================
struct index_inds __flash tab_index_inds [] =
{
   {1,      IND_2_MASK},
   {2,      IND_3_MASK},
   {3,      IND_4_MASK},
   {0,      IND_1_MASK},
};

struct tab_char_7_segm_cod_t __flash tab_char_7_segm_cod [] =
{
#ifdef __SEGMENT_METHOD_ONE__

#endif

#ifdef __SEGMENT_METHOD_ZERO__
   {'0',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F))},         // 0
   {'1',   (0xFF ^ (SEG_B | SEG_C))},                                         // 1
   {'2',   (0xFF ^ (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G))},                 // 2
   {'3',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G))},                 // 3
   {'4',   (0xFF ^ (SEG_B | SEG_C | SEG_F | SEG_G))},                         // 4
   {'5',   (0xFF ^ (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G))},                 // 5
   {'6',   (0xFF ^ (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G))},         // 6
   {'7',   (0xFF ^ (SEG_A | SEG_B | SEG_C))},                                 // 7
   {'8',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G))}, // 8
   {'9',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G))},         // 9
   {'A',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G))},         // 10
   {'B',   (0xFF ^ (SEG_C | SEG_D | SEG_E | SEG_F | SEG_G))},                 // 11
   {'C',   (0xFF ^ (SEG_A | SEG_D | SEG_E | SEG_F))},                         // 12
   {'D',   (0xFF ^ (SEG_B | SEG_C | SEG_D | SEG_E | SEG_G))},                 // 13
   {'E',   (0xFF ^ (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G))},                 // 14
   {'F',   (0xFF ^ (SEG_A | SEG_E | SEG_F | SEG_G))},                         // 15
   {'G',   (0xFF ^ (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F))},                 // 16
   {'H',   (0xFF ^ (SEG_B | SEG_C | SEG_E | SEG_F | SEG_G))},                 // 17
   {'L',   (0xFF ^ (SEG_D | SEG_E | SEG_F))},                                 // 18
   {'N',   (0xFF ^ (SEG_C | SEG_E | SEG_G))},                                 // 19
   {'O',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F))},         // 20
   {'P',   (0xFF ^ (SEG_A | SEG_B | SEG_E | SEG_F | SEG_G))},                 // 21
   {'П',   (0xFF ^ (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F))},                 // 22
   {'-',   (0xFF ^ (SEG_G))},                                                 // 23
   {' ',   0xFF},                                                             // 24
#endif

   {0xFF,   0xFF},
};
//========================================================================

//========================================================================
u08 dsp_buf [MAX_LED_INDS];
//------------------------------------------------------------------------
// Очистка буфера дисплея.

u08 dsp_buf [MAX_LED_INDS];

void clr_dsp_buf (void)
{
   for (u08 i = 0; i < MAX_LED_INDS; i++)
      dsp_buf [i] = ' ';
}
//========================================================================

//========================================================================
u08 recod_char_7_segm_cod (u08 data)
{
   struct tab_char_7_segm_cod_t __flash *ptr = tab_char_7_segm_cod;

   for (; ptr -> Char != 0xFF; ptr++)
   {
      if (ptr -> Char == data)
         return ptr -> seven_segm_cod;
   }

   return false;
}
//========================================================================

//========================================================================
static u08 _proc_7_segm_ind;

void set_proc_7_segm_ind_on (void)
{
   _proc_7_segm_ind = 1;
}

void set_proc_7_segm_ind_off (void)
{
  _oe_disable ();

   _proc_7_segm_ind = 0;
}

void proc_7_segm_ind (void)
{
   static soft_timer ST_PROC_7_SEGM_IND;

   static u08 cnt_7_segm_ind;

   u08 a;

   u08 inds;
   u08 segments;

   switch (_proc_7_segm_ind)
   {
      case 0:
         break;

      case 1:
         spi_init ();

         cnt_7_segm_ind = 0;

         set_soft_timer (ST_PROC_7_SEGM_IND, 1, 1);
         _proc_7_segm_ind = 2;
         break;

      case 2:
         if (handle_soft_timer (ST_PROC_7_SEGM_IND))
         {
            u08 cnt = cnt_7_segm_ind;

            cnt_7_segm_ind = tab_index_inds [cnt].i;
            inds = tab_index_inds [cnt].ind;

            segments = recod_char_7_segm_cod (dsp_buf [cnt_7_segm_ind]);

            spi_transf_buf [0] = inds;

            a = segments;

            if ((get_dp_flag () == true) && (cnt_7_segm_ind == 2))
            {
               #ifdef __SEGMENT_METHOD_ONE__
               a |= SEG_H;
               #endif

               #ifdef __SEGMENT_METHOD_ZERO__
               a &= (0xFF ^ SEG_H);
               #endif
            }

            spi_transf_buf [1] = a;

            strob_latch_in ();

            for (u08 i = 0; i < SPI_BYTES; i++)
            {
               spi_transf (i);
               spi_receive_buf [i] = SPDR;
            }

            _oe_disable ();

            strob_latch_out ();

            _oe_enable ();
         }
         break;

      default:
         break;
   }
}
//========================================================================

 

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

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

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

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

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

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

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

Держите кучей мои наработки:

.macro	clrb
	cbr		@0,1<<@1
.endmacro

.macro	setb
	sbr		@0,1<<@1
.endmacro

.macro	clrf
	cbr		FLAGS,1<<@0
.endmacro

.macro	setf
	sbr		FLAGS,1<<@0
.endmacro

.macro   chfc
	sbrc	FLAGS,@0
.endmacro

.macro   chfs
	sbrs	FLAGS,@0
.endmacro

.macro	ldiw
	ldi		@0,High(@2)
	ldi		@1,Low(@2)
.endmacro

.macro	ldx
	ldi		XH,High(@0)
	ldi		XL,Low(@0)
.endmacro

.macro	ldy
	ldi		YH,High(@0)
	ldi		YL,Low(@0)
.endmacro

.macro	ldz
	ldi		ZH,High(@0)
	ldi		ZL,Low(@0)
.endmacro

.macro	pushx
	push	XL
	push	XH
.endmacro

.macro	pushy
	push	YL
	push	YH
.endmacro

.macro	pushz
	push	ZL
	push	ZH
.endmacro

.macro	popx
	pop		XH
	pop		XL
.endmacro

.macro	popy
	pop		YH
	pop		YL
.endmacro

.macro	popz
	pop		ZH
	pop		ZL
.endmacro

.macro	stsi
	ldi		r16,@1
	sts		@0,r16
.endmacro

.macro	stsiw
	ldi		r16,high(@1)
	sts		@0+1,r16
	ldi		r16,low(@1)
	sts		@0,r16
.endmacro

.macro	outi
	ldi		r16,@1
	out		@0,r16
.endmacro

.macro outiw
	ldi		r16,high(@1)
	out		@0H,r16
	ldi		r16,low(@1)
	out		@0L,r16
.endmacro

.macro addi
	subi	@0,-@1
.endmacro

.macro adci
	sbci	@0,-@1
.endmacro

.macro addiw
	subi	@0L,LOW(-@1)
	sbci	@0H,HIGH(-@1)
.endmacro

.macro cpw
	cp		@0,@1
	cpc		@2,@3
.endmacro

.macro subiw
	subi	@0L,LOW(@1)
	sbci	@0H,HIGH(@1)
.endmacro

.macro addw
	add		@0L,@1
	adc		@0H,@2
.endmacro

.macro shiftlwz
	lsl		ZL
	rol		ZH
.endmacro

.macro shiftrw
	lsr		@0H
	ror		@0L
.endmacro

.macro			Init_Stack
.ifdef	SPH
	outi	SPH,HIGH(RAMEND)
.endif
	outi	SPL,LOW(RAMEND)
.endmacro

.macro	INIT_WDT
	outi	WDTCR,1<<WDTOE | 1<<WDE ;  | 1<<WDP2 | 1<<WDP1 | 1<<WDP0
.endmacro

.macro	INIT_SLEEP_MODE
	in		r16,MCUCR
	sbr		r16,1<<SE
	out		MCUCR,Temp
.endmacro

.macro	INIT_EXT_INT0
	in		r16,MCUCR
	sbr		r16,1<<ISC00 | 1<<ISC01
	out		MCUCR,Temp
	in		r16,GICR
	sbr		r16,1<<INT0
	out		GICR,r16
.endmacro

.macro	INIT_EXT_INT1
	in		r16,MCUCR
	sbr		r16,1<<ISC10 | 1<<ISC11
	out		MCUCR,Temp
	in		r16,GICR
	sbr		r16,1<<INT1
	out		GICR,r16
.endmacro

.macro	INIT_EXT_INT2
	in		r16,MCUCR
	sbr		r16,1<<SE
	out		MCUCR,Temp
	in		r16,MCUCSR
	sbr		r16,1<<ISC2
	out		MCUCSR,Temp
	in		r16,GICR
	sbr		r16,1<<INT2
	out		GICR,r16
.endmacro

.macro	INIT_TIMER0
	out		TCNT0,RCLR
	in		r16,TIMSK
	sbr		r16,1<<OCIE0
	out		TIMSK,r16
	outi	OCR0,(XTAL/64/1000)
	outi	TCCR0,1<<CS00 | 1<<CS01
.endmacro

.macro	INIT_TIMER1
	in		r16,TIMSK
	sbr		r16,1<<OCIE1A
	out		TIMSK,r16
	out		TCNT1H,Zero
	out		TCNT1L,Zero

	ldi		r16,High(36)
	out		OCR1AH,r16
	ldi		r16,Low(36)
	out		OCR1AL,r16 ; При частоте кварца 7,3728 Мгц число 72=10 мс.

	ldi		r16,0x05
	out		TCCR1B,r16
.endmacro

.macro	INIT_TIMER2
	out		TCNT2,RCLR
	in		r16,TIMSK
	sbr		r16,1<<OCIE2
	out		TIMSK,r16
	outi	OCR2,(XTAL/64/1000)
	outi	TCCR2,4
.endmacro

.macro	Case
	cpi		STREG,@0
	brne	Exit_Case
	rjmp	@1
Exit_Case:
.endmacro

.macro	Case_Not_Equal
	cpi		STREG,@0
	breq	Exit_Case
	rjmp	@1
Exit_Case:
.endmacro

.macro	Read_State
	lds		r16,@0
.endmacro

.macro	Set_State
	ldi		r16, @1
	rjmp	@0
.endmacro

.macro	Set_Mode
	ldi		r16,@1
	sts		@0,r16
.endmacro

.macro	Check_States
	cpi		r16,@0
	brlo	Check_States_Exit
	rjmp	@1
Check_States_Exit:
.endmacro

.macro	Read_Last_State
	lds		r17,@0
.endmacro

.macro Clear_Registers
	clr		r0
	ldz		1
Clear_Register_Cycle:
	st		Z+,r0
	cpi		ZL,30
	brne	Clear_Register_Cycle
	st		Z,r0
.endmacro

;*************************************************************************
;============================= SRAM ======================================
;*************************************************************************

.macro	OUT_SRAM
	ldi		XH,HIGH(@0)
	ldi		XL,LOW(@0)
	ldi		Data_H,HIGH(@1)
	ldi		Data_L,LOW(@1)
	rcall	_OUT_SRAM
.endmacro

.macro	OUTI_SRAM
	ldi		XH,HIGH(@0)
	ldi		XL,LOW(@0)
	ldi		r17,@1
	ldi		r16,@2
	rcall	_OUT_SRAM
.endmacro

_OUT_SRAM:
	st		X+,r16
	dec		r17
	brne	_OUT_SRAM
	ret

.macro	Copy_SRAM
.if @3==YES
	push	YH
	push	YL
.endif
	ldi		XH,HIGH(@0)
	ldi		XL,LOW(@0)
	ldi		YH,HIGH(@1)
	ldi		YL,LOW(@1)
	ldi		r17,@2
	rcall	_Copy_SRAM
.if @3==YES
	pop		YL
	pop		YH
.endif
.endmacro

_Copy_SRAM:
	ld		r16,X+
	st		Y+,r16
	dec		r17
	brne	_Copy_SRAM
	ret

.macro	Clear_SRAM
	ldx		SRAM_START
Clear_SRAM_Cycle:
	st		X+,RCLR
	cpi		XL,LOW(SRAM_START+SRAM_SIZE)
	brne	Clear_SRAM_Cycle
	cpi		XH,HIGH(SRAM_START+SRAM_SIZE)
	brne	Clear_SRAM_Cycle
.endmacro
;*************************************************************************

;*************************************************************************
;============================ EEPROM =====================================
;*************************************************************************

;Так как возможна случайная запись в EEPROM в случае сбоя питания, то:
;1 - В микроконтроллере включить контроль снижения напряжения питания. 
;2 - Первый (0x00) байт никогда не используется. 
;3 - После ресета обнулить указатель адреса EEPROM. 
;Решения для увеличения ресурса EEPROM:
;4 - Перед записью считывается байт, предназначенный для записи,
;проверяется на равенство с записываемым, если байты равны, то переход
;к записи следующего байта. 
;5 - В конце работы с EEPROM обнулить указатель адреса. 

#if (EEPROM==YES)

.macro Read_EEPROM
	ldix	@0 ; Указатель адреса EEPROM.
	ldiy	@1 ; Указатель адреса SRAM.
	ldi		r17,@2
	rcall	_Read_EEPROM
.endmacro

_Read_EEPROM:
	sbic	EECR,EEWE
	rjmp	_Read_EEPROM
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	sbi		EECR,EERE
	sbi		EECR,EERE
	in		EEDREG,EEDR
	st		Y+,EEDREG
	adiw	XL,1
	dec		r17
	brne	_Read_EEPROM
_Read_EEPROM_0:
	sbic	EECR,EEWE
	rjmp	_Read_EEPROM_0
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

EERead:
	sbic	EECR,EEWE
	rjmp	EERead
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	sbi		EECR,EERE
	sbi		EECR,EERE
	in		EEDREG,EEDR
EERead_1:
	sbic	EECR,EEWE
	rjmp	EERead_1
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

EEWrite:
	sbic	EECR,EEWE
	rjmp	EEWrite
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	out		EEDR,EEDREG
	sbi		EECR,EEMWE
	sbi		EECR,EEWE
EEWrite_1:
	sbic	EECR,EEWE
	rjmp	EEWrite_1
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

.macro Write_EEPROM
	ldiy	@0 ; Указатель адреса SRAM.
	ldix	@1 ; Указатель адреса EEPROM.
	ldi		r17,@2
	rcall	_Write_EEPROM
.endmacro

_Write_EEPROM:
	sbic	EECR,EEWE
	rjmp	_Write_EEPROM
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	ld		EEDREG,Y+
	out		EEDR,EEDREG
	sbi		EECR,EEMWE
	sbi		EECR,EEWE
	adiw	XL,1
	dec		r17
	brne	_Write_EEPROM
_Write_EEPROM_0:
	sbic	EECR,EEWE
	rjmp	_Write_EEPROM_0
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

.macro	Clear_EEPROM
	ldx		@0
	ldy		@1
	rcall	_Clear_EEPROM
.endmacro

_Clear_EEPROM:
	sbic	EECR,EEWE
	rjmp	_Clear_EEPROM
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	out		EEDR,RCLR
	sbi		EECR,EEMWE
	sbi		EECR,EEWE
	adiw	XL,1
	sbiw	YL,1
	brne	_Clear_EEPROM
_Clear_EEPROM_0:
	sbic	EECR,EEWE
	rjmp	_Clear_EEPROM_0
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

#endif
;*************************************************************************

/************************************************************************/
#if (BCD==YES)

.dseg

HEX_DEC_BUFFER:
.equ	HEX_DEC_BUFFER_LENGHT = 5
.byte	HEX_DEC_BUFFER_LENGHT

.cseg

Hex_Dec:
	ldx		HEX_DEC_BUFFER
	ldz		Tab_10_16*2

	ldi		r19, 4

Hex_Dec_Cycle:
	lpm		r17, Z+
	lpm		r16, Z+

	rcall	Hex_Dec_Digit
	st		X+, r18

	dec		r19
	brne	Hex_Dec_Cycle

	mov		r16, r14
//	ori		r16, 0x30
	st		X+, r16
Hex_Dec_End:
	ret

Hex_Dec_Digit:
	ldi		r18,-1
Hex_Dec_Digit_Cycle:
	inc		r18
	sub		r14,r16
	sbc		r15,r17
	brsh	Hex_Dec_Digit_Cycle
	add		r14,r16
	adc		r15,r17
//	ori		r18,0x30
	ret


Tab_10_16:
.db tab_h (10000)
.db tab_h (1000)
.db tab_h (100)
.db tab_h (10)

#endif
//========================================================================

//========================================================================
.def	drem8u	=r19
.def	dcnt8u	=r18

div8u:
	cp		r16, r17
	brsh	div8u_1
	eor		r16, r17
	eor		r17, r16
	eor		r16, r17
div8u_1:
	sub		drem8u, drem8u
	ldi		dcnt8u, 9
div8u_2:
	rol		r16
	dec		dcnt8u
	brne	div8u_3
	ret
div8u_3:
	rol		drem8u
	sub		drem8u, r17
	brcc	div8u_4
	add		drem8u, r17
	clc
	rjmp	div8u_2
div8u_4:
	sec
	rjmp	div8u_2

.undef	drem8u
.undef	dcnt8u
//************************************************************************

//************************************************************************
Empty_Action:
	ret
//************************************************************************

//************************************************************************
Table_Bits:
.db 0b00000001, 0b00000010, 0b00000100, 0b00001000
.db 0b00010000, 0b00100000, 0b01000000, 0b10000000
//************************************************************************

//************************************************************************
.macro end_array
.db 0xFF,0xFF
.endmacro
//************************************************************************

 

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

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

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

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

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

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

Вы не делали многоуровневые меню... Не надо говорить в ответ, что вы что-то делали. Я перебрал много вариантов. Дальнейший шаг только переход на си. Мне многие говорили, что пора переходить на си. Я их не слушал. Когда я перешел на си, спустя некоторое время я сам себя материл, что не слушал их раньше.

Довод, что компилятор живет своей жизнью не совсем верен. Если научиться, то можно заставить компилятор компилировать код приемлемым выхлопом. Да, не всегда оптимально. Но экономия байтов была целесообразна, когда у МК было мало памяти. На данный момент цена-объем памяти и пинов позволяет не задумываться об этом...

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

Откуда Вы знаете мои проекты, что я делал, а что нет?

Если Вам не удалось найти оптимального решения, то это не повод ставить крест на всех и вся. На этом и закончим, неуместную в данной теме дискуссию.
 

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

Геннадий, мне достаточно было ваших слов про флаг. И дело не в том, что не нашел оптимальный вариант. Как раз и нашел. Но этот вариант подразумевает переход на ЯВУ.

Пример, MicroMenu :

//=======================================================================================================================================================================================================================================================
//         NAME                               PARENT                          NEXT_LEVEL                         NEXT_ITEM                      PREV_ITEM                      ENTER_FUNC         PLUS_FUNC                 MINUS_FUNC                MENU_INIT_FUNC                  TEXT
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MAKE_MENU (L_OUT_I_ABC,                       NULL_ENTRY,                     L_MENU_TIME,                       NULL_ENTRY,                    NULL_ENTRY,                    NULL_FUNC,         NULL_FUNC,                NULL_FUNC,                info_service_out_i_init,       "ПАРАМЕТРЫ");

MAKE_MENU (L_MENU_TIME,                       L_OUT_I_ABC,                    L_MENU_SET_TIME,                   L_MENU_CURRENT,                NULL_ENTRY,                    NULL_FUNC,         NULL_FUNC,                NULL_FUNC,                menu_init,                     "ВРЕМЯ");
MAKE_MENU (L_MENU_CURRENT,                    L_OUT_I_ABC,                    L_MENU_MIN_CURR,                   L_MENU_CYCLE,                  L_MENU_TIME,                   NULL_FUNC,         NULL_FUNC,                NULL_FUNC,                menu_init,                     "ТОК");
MAKE_MENU (L_MENU_CYCLE,                      L_OUT_I_ABC,                    L_MENU_QUANT_PASS,                 NULL_ENTRY,                    L_MENU_CURRENT,                NULL_FUNC,         NULL_FUNC,                NULL_FUNC,                menu_init,                     "ЦИКЛ");

 

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

@demiurg1978 Полностью с вами согласен (о переходе с asm на Си), мало того сейчас нечто подобное происходит, по крайней мере со мной, по переходу с Си на С++. Пробую перевести небольшой проект на С++. Так вот начало очень даже ничего получается, код ни чем не уступает ни по объёму flash ни по объёму RAM. Кусок кода с флагами в прерывании и обработки в main (о чём здесь шла речь) работает прекрасно, не поверите, уже нет желания в Си писать данный код, хочется уже подключить этот класс и продолжить дальше творить.

Хотелось даже обратиться к модераторам создать раздел "С++ для микроконтроллеров" и в нём не обсуждать достоинства и недостатки Си и С++, а именно приводить удачный код и давать различные советы по переходу на С++

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

1 минуту назад, demiurg1978 сказал:

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

я хотел бы собрать все наработки по С++ для микроконтроллеров в одном месте

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

я в этом только начинающий

понравилась в интернете одна статья по работе с портами ввода вывода http://easyelectronics.ru/rabota-s-portami-vvoda-vyvoda-mikrokontrollerov-na-si.html

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

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

Цитата

Хотелось даже обратиться к модераторам создать раздел "С++ для микроконтроллеров"

Зачем вам плюсы в контроллерах, когда они используются чаще всего как "Си и классами". Чтобы эффективно использовать что-то более специфичное, надо ДЕЙСТВИТЕЛЬНО хорошо понимать как это работает. Но такой код будет бесполезен для 90% разработчиков.

Да и вводить подразделы для всякой экзотики (С++, Паскаль, Бейсик), ИМХО, лишнее.

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

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

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

8 часов назад, COKPOWEHEU сказал:

Зачем вам плюсы в контроллерах, когда они используются чаще всего как "Си и классами". Чтобы эффективно использовать что-то более специфичное, надо ДЕЙСТВИТЕЛЬНО хорошо понимать как это работает. Но такой код будет бесполезен для 90% разработчиков.

читаем ещё раз

18 часов назад, dm37 сказал:

и в нём не обсуждать достоинства и недостатки Си и С++, а именно приводить удачный код и давать различные советы по переходу на С++

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

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

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

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

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

Геннадий, спасибо вам за помощь, и за код на асме. До нового года я так и не управился. Написал код всё-таки сам, но на языке BASCOM, сегодня провёл первые испытания, всё заработало как надо, в качестве дисплея, использовал ЖК-модуль. Если интересно, ссылка на мои приключения)) 

 

 

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

Ребят, вопрос. Знакомый сделал в прерывании изменение SPL. Соответственно, программа из прерывания прыгает не туда, где остановилась, а по новому адресу. Можно так делать? 

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

просто смотрю чужую программу и удивляюсь - предусмотрены выходы из основного цикла в подпрограмму без  общепринятого возврата RET, подпрограмма "упирается " еще в один бесконечный цикл, который ждет прерывания по переполнению таймера, а в прерывании замена адреса SPL, для того, чтобы вернуться в то место, откуда был выход в подпрограмму:mellow: гениально:). Мозг у человека работает не стандартно)) Просто для меня шок- зачем так извращаться. Есть же стандартные инструменты

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

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

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

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

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

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

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

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

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

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

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

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