Например TDA7294

Форум РадиоКот • Просмотр темы - Котуинко
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср июл 30, 2025 23:06:05

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 2247 ]     ... , , , 44, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 12:21:52 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Речь о том, что ЛЮБАЯ вставка на ассемблере в Си подчиняется правилам проекта в целом

еще раз вставки НЕТ - есть файлы (можно только ассемблерные), а сборка всего проекта проводится по предельно простым правилам:
Код:
1)# Assemble: create object files from assembler source files.
2)# Compile: create object files from C source files.
3)# Link: create ELF output file from object files.

гуглеперевод:
Код:
1) # Assemble: создание объектных файлов из исходных файлов на ассемблере.
2) # Компиляция: создание объектных файлов из исходных файлов Си.
3) # Link: создать выходной файл ELF из объектных файлов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 13:11:30 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15118
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Запускаем полный комплект ассемблер - линкер - библиотекарь, да еще относительно компилятора СИ?
Он же будет планировку для Си делать.
Да и указанное в приведенном Вами выше файле не выходит за рамки типичной подпрограммы, которую можно разместить в рамках проекта ЛЮБОГО компилятора (хоть ассемблер хоть Си).
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 13:29:09 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
полный комплект состоит всего из одного файлика avr-gcc.exe - он компилирует и си и асм файлы и линкует вдобавок, все просто:
Код:
asmfunc.S :
avr-gcc -c -mmcu=attiny85 -I. -x assembler-with-cpp -DF_CPU=16000000 -DMODE=2 -Wa,-gstabs,-gdwarf-2 asmfunc.S -o obj_hr/asmfunc.o

xitoa.S :
avr-gcc -c -mmcu=attiny85 -I. -x assembler-with-cpp -DF_CPU=16000000 -DMODE=2 -Wa,-gstabs,-gdwarf-2 xitoa.S -o obj_hr/xitoa.o

main.c :
avr-gcc -c -std=gnu89 -gdwarf-2 -mmcu=attiny85 -Os -mcall-prologues -Wall -Wextra  -DF_CPU=16000000 -DMODE=2 -Wp,-M,-MP,-MT,obj_hr/main.o,-MF,obj_hr/main.d main.c -o obj_hr/main.o

pff.c :
avr-gcc -c -std=gnu89 -gdwarf-2 -mmcu=attiny85 -Os -mcall-prologues -Wall -Wextra  -DF_CPU=16000000 -DMODE=2 -Wp,-M,-MP,-MT,obj_hr/pff.o,-MF,obj_hr/pff.d pff.c -o obj_hr/pff.o

mmc.c :
avr-gcc -c -std=gnu89 -gdwarf-2 -mmcu=attiny85 -Os -mcall-prologues -Wall -Wextra  -DF_CPU=16000000 -DMODE=2 -Wp,-M,-MP,-MT,obj_hr/mmc.o,-MF,obj_hr/mmc.d mmc.c -o obj_hr/mmc.o

Linking...
avr-gcc -std=gnu89 -gdwarf-2 -mmcu=attiny85 -Os -mcall-prologues -Wall -Wextra  -DF_CPU=16000000 -DMODE=2 -Wp,-M,-MP,-MT,obj_hr/sd8p_hr.o,-MF,obj_hr/sd8p_hr.d obj_hr/asmfunc.o obj_hr/xitoa.o obj_hr/main.o obj_hr/pff.o obj_hr/mmc.o --output obj_hr/sd8p_hr.elf


was ist das "планировку для Си"?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 14:33:40 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
oleg110592 писал(а):
полный комплект состоит всего из одного файлика avr-gcc.exe - он компилирует и си и асм файлы и линкует вдобавок
ой ли? по-моему, он всего лишь вызывает соответствующие модули из папки bin тулчейна, передавая между ними параметры... или нет?

Добавлено after 7 minutes 58 seconds:
сам себе отвечаю: не прав был... действительно, один файл все делать может... во всяком случае для однофайлового проекта, на котором протестировал.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 14:55:05 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
скорее всего вызывает - из документа:
https://www.eit.lth.se/fileadmin/eit/co ... rview.html
Цитата:
GCC также известен как программа-драйвер, поскольку он знает о ней и легко управляет другими программами для создания конечного результата. Ассемблер и компоновщик являются частью другого проекта с открытым исходным кодом, называемого GNU Binutils. GCC знает, как заставить GNU-ассемблер (газ) собирать выходные данные компилятора. GCC знает, как управлять компоновщиком GNU (ld), чтобы связать все объектные модули в конечный исполняемый файл.

но вопрос странноватый был;
Цитата:
Запускаем полный комплект ассемблер - линкер - библиотекарь, да еще относительно компилятора СИ?

ответ (тоже странный) - запускаем один файлик.
з.ы. BOB51 бы ручками позапускал бы компилятор в командной строке и много вопросов отпало бы и ардуино оказалось не нужным бы :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 15:26:33 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15118
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Да запускал и запускаю.
Только ассемблер относительно 51-й и из батника.
8)
Можно было бы попробовать Ваш вариант подключения с готовой АВРкиной прожкой, но она у меня несколько на слэнге сделана - под "чистокровный ассемблер" придется перелопатить...
Вложение:
tnX5_2812.zip [83.53 KiB]
Скачиваний: 178

Это всего-то тест светиков.
Попробуйте его вставкой в Сишный проект сделать. Допустим ... как исполнительный драйвер индикации для проекта какого-либо прикладного назначения (индикация при сработке будильника к примеру).
:roll:
Вернее даже не всю прожку, а только обработчик вывода - trd2812_m.txt....
С учетом его особенностей...
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 18:28:46 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
файл main.c
Спойлер
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <string.h>

void bob51_func();   /* Defined in trd2812_m.S*/

int main (void)
{
   bob51_func();
   while (1)
   {
      /* code */
   }
}

файл trd2812_m.S
Спойлер
Код:
#include <avr/io.h>   // Include device specific definitions.

#define   port_out   _SFR_IO_ADDR(PORTB)
#define out_line  0

.section .bss
.global bufout   ; xfunc_out must be initialized before using this module.
bufout:   .ds.w   5
.section .text       

.global bob51_func   
.func bob51_func
   bob51_func:
   rjmp mass_trm
   slot0:
   ; 6/14 (6-4=2 посему роль остатка выполняет CBI)
   cbi port_out, out_line ; 2 цикла
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   ret ; 4 цикла
   slot1:
   nop ; 13/7 (13-4=9)
   nop
   nop
   nop
   nop
   nop
   nop
   cbi port_out,out_line ; 2 цикла
   nop
   nop
   ret ; 4 цикла
   xslot0:
   ; 6/14 (6-5=1 посему роль остатка выполняет CBI с избытком в 1 nop)
   cbi port_out,out_line ; 2 цикла
   cbr zl,(1<<6) ; модификация указателя 1 цикл
   nop
   nop
   nop
   nop
   nop
   nop ; -2 цикла на ld R16,x+
   dec R17 ; 1 цикл
   brbs SREG_Z,ends_trd ; 1 цикл при неисполнении (в цикле)
   rjmp trasstt ; 2 цикла
   xslot1:
   nop ; 13/7 (13-5=8)
   cbr zl,(1<<6) ; модификация указателя 1 цикл
   nop
   nop
   nop
   nop
   nop
   cbi port_out,out_line ; 2 цикла
   ; -2 цикла на ld R16,x+
   dec R17 ; 1 цикл
   brbs SREG_Z,ends_trd ; 1 цикл при неисполнении (в цикле)
   rjmp trasstt ; 2 цикла
   ;
   ends_trd:
   pop R16
   pop R17
   pop xl
   pop xh
   pop zl
   pop zh ; восстановить рабочую область из стека
   ret
   ;----------
   ;
   ; предварительно:
   ; линия out_line настроена на вывод
   ; исходный уровень out_line =0
   ; указатель стека усатновлен на RAMEND
   ; массив данных (bufout:bufout_size) предварительно загружен
   ; флаг готовности массива данных установлен
   ;
   mass_trm:
   push zh
   push zl
   push xh
   push xl
   push R17
   push R16 ; храним рабочую область в стеке
   res_line:
   ldi R16, 4
   ser R17
   cbi port_out,out_line
   res_time:
   dec R17
   brne res_time
   dec R16
   brne res_time ; =>50uS time out
   ldi XH,hi8(bufout)
   ldi XL,lo8(bufout) ; загрузка начального адреса массива
   ; в указатель
   ldi R17, 5 ;bufout_size
   ldi ZL, lo8(slot0) ; адрес начала таблицы в указателе
   ldi ZH, hi8(slot0)
   ;----------
   trasstt:
   ld R16,x+ ; 2 цикла
   slot_0:
   sbi port_out,out_line ; 2 цикла реально до установки 3 цикла
   bst R16,7 ; 1 цикл
   bld zl,4 ; 1 цикл
   icall ; 3 цикла = 4 цикла от out_line=1
   ;----------
   slot_1:
   sbi port_out,out_line
   bst R16,6 ; 1 цикл
   bld zl,4 ; 1 цикл
   icall ; 3 цикла
   ;----------
   slot_2:
   sbi port_out,out_line
   bst R16,5 ; 1 цикл
   bld zl,4 ; 1 цикл
   icall ; 3 цикла
   ;----------
   slot_3:
   sbi port_out,out_line
   bst R16,4 ; 1 цикл
   bld zl,4 ; 1 цикл
   icall ; 3 цикла
   ;----------
   slot_4:
   sbi port_out,out_line
   bst R16,3 ; 1 цикл
   bld zl,4 ; 1 цикл
   icall ; 3 цикла
   ;----------
   slot_5:
   sbi port_out,out_line
   bst R16,2 ; 1 цикл
   bld zl,4 ; 1 цикл
   icall ; 3 цикла
   ;----------
   slot_6:
   sbi port_out,out_line
   bst R16,1 ; 1 цикл
   bld zl,4 ; 1 цикл
   icall ; 3 цикла
   ;----------
   slot_7:
   sbi port_out,out_line
   sbr zl,(1<<6) ; модификация указателя под завершающий фрагмент
   ; 1 цикл
   bst R16,0 ; 1 цикл
   bld zl,4 ; 1 цикл
   ijmp ; 3 цикла
   ;----------                 
.endfunc

Makefile
Спойлер
Код:
### Project name (also used for output file name)
PROJECT = BOB51_test

### Source files and search directory
CSRC    = main.c
ASRC    = trd2812_m.S
VPATH   =

### Target device
DEVICE  = attiny85

### Optimization level (0, 1, 2, 3, 4 or s)
OPTIMIZE = s

### C Standard level (c89, gnu89, c99 or gnu99)
CSTD = gnu89

### Include dirs, library dirs and definitions
LIBS   =
LIBDIRS   =
INCDIRS   =
DEFS   = F_CPU=16000000 MODE=1
ADEFS   = $(DEFS)

### Warning contorls
WARNINGS = all extra

### Output directory
OBJDIR = obj_bob51

### Output file format (hex, bin or both) and debugger type
OUTPUT   = hex
HEXFMT  = ihex
DEBUG   = dwarf-2


### Programs to build porject
CC      = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE    = avr-size
NM      = avr-nm


# Define all object files
COBJ      = $(CSRC:.c=.o)
AOBJ      = $(ASRC:.S=.o)
COBJ      := $(addprefix $(OBJDIR)/,$(COBJ))
AOBJ      := $(addprefix $(OBJDIR)/,$(AOBJ))
PROJECT   := $(OBJDIR)/$(PROJECT)


# Flags for C files
CFLAGS += -std=$(CSTD)
CFLAGS += -g$(DEBUG)
CFLAGS += -mmcu=$(DEVICE)
CFLAGS += -O$(OPTIMIZE) -mcall-prologues
CFLAGS += $(addprefix -W,$(WARNINGS))
CFLAGS += $(addprefix -I,$(INCDIRS))
CFLAGS += $(addprefix -D,$(DEFS))
CFLAGS += -Wp,-M,-MP,-MT,$(OBJDIR)/$(*F).o,-MF,$(OBJDIR)/$(*F).d


# Assembler flags
ASFLAGS += $(addprefix -D,$(ADEFS)) -Wa,-gstabs,-g$(DEBUG)
ALL_ASFLAGS = -mmcu=$(DEVICE) -I. -x assembler-with-cpp $(ASFLAGS)


# Linker flags
LDFLAGS += -Wl,-Map,$(PROJECT).map


# Default target.
all: version build size

ifeq ($(OUTPUT),hex)
build: elf hex lst sym
hex: $(PROJECT).hex
else
ifeq ($(OUTPUT),bin)
build: elf bin lst sym
bin: $(PROJECT).bin
else
ifeq ($(OUTPUT),both)
build: elf hex bin lst sym
hex: $(PROJECT).hex
bin: $(PROJECT).bin
else
$(error "Invalid format: $(OUTPUT)")
endif
endif
endif

elf: $(PROJECT).elf
lst: $(PROJECT).lst
sym: $(PROJECT).sym


# Display compiler version information.
version :
   @$(CC) --version

# Create final output file from ELF output file.
%.hex: %.elf
   @echo
   $(OBJCOPY) -j .text -j .data -j .eeprom -j .fuse -O $(HEXFMT) $< $@

%.bin: %.elf
   @echo
   $(OBJCOPY) -j .text -j .data -O binary $< $@

# Create extended listing file from ELF output file.
%.lst: %.elf
   @echo
   $(OBJDUMP) -h -S -C $< > $@

# Create a symbol table from ELF output file.
%.sym: %.elf
   @echo
   $(NM) -n $< > $@

# Display size of file.
size:
   @echo
   $(SIZE) -C --mcu=$(DEVICE) $(PROJECT).elf


# Link: create ELF output file from object files.
%.elf:  $(AOBJ) $(COBJ)
   @echo
   @echo Linking...
   $(CC) $(CFLAGS) $(AOBJ) $(COBJ) --output $@

# Compile: create object files from C source files. ARM or Thumb(-2)
$(COBJ) : $(OBJDIR)/%.o : %.c
   @echo
   @echo $< :
   $(CC) -c $(CFLAGS) $< -o $@

# Assemble: create object files from assembler source files. ARM or Thumb(-2)
$(AOBJ) : $(OBJDIR)/%.o : %.S
   @echo
   @echo $< :
   $(CC) -c $(ALL_ASFLAGS) $< -o $@


# Target: clean project.
clean:
   @echo
   rm -f -r $(OBJDIR) | exit 0


# Include the dependency files.
-include $(shell mkdir $(OBJDIR) 2>/dev/null) $(wildcard $(OBJDIR)/*.d)

все собирается
Спойлер
Цитата:
avr-gcc (GCC) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
trd2812_m.S :
avr-gcc -c -mmcu=attiny85 -I. -x assembler-with-cpp -DF_CPU=16000000 -DMODE=1 -Wa,-gstabs,-gdwarf-2 trd2812_m.S -o obj_bob51/trd2812_m.o
Linking...
avr-gcc -std=gnu89 -gdwarf-2 -mmcu=attiny85 -Os -mcall-prologues -Wall -Wextra -DF_CPU=16000000 -DMODE=1 -Wp,-M,-MP,-MT,obj_bob51/BOB51_test.o,-MF,obj_bob51/BOB51_test.d obj_bob51/trd2812_m.o obj_bob51/main.o --output obj_bob51/BOB51_test.elf
avr-objcopy -j .text -j .data -j .eeprom -j .fuse -O ihex obj_bob51/BOB51_test.elf obj_bob51/BOB51_test.hex
avr-objdump -h -S -C obj_bob51/BOB51_test.elf > obj_bob51/BOB51_test.lst
avr-nm -n obj_bob51/BOB51_test.elf > obj_bob51/BOB51_test.sym
avr-size -C --mcu=attiny85 obj_bob51/BOB51_test.elf
AVR Memory Usage
----------
Device: attiny85
Program: 264 bytes (3.2% Full)
(.text + .data + .bootloader)
Data: 10 bytes (2.0% Full)
(.data + .bss + .noinit)
Сборка прошла успешно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 19:03:11 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15118
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
ЖУТЬ...
:facepalm:
И для простенького фрагмента выписывать тот Makefile?...
Легче уж под чистым ассемблером несколько файликов настрочить.
8)
Надеюсь обратили внимание, что там точки входа с жестко заданными адресами (или с определенным пропуском)
даже если использовать вариант перемещаемого кода
slot1=slot0+16
А не линейное продолжение как в Вашем примере.
:wink:
на всякий случай оригинал, чтоб понятнее было в чем ловушка:
Спойлер
Код:
;
;
;         trd2812_m.txt
;
;         файл обработчика передачи массива
; из буфера вывода в линейку на основе WS2812B
; базовый МК из линейки АТМЕЛ при тактовой частоте
; от 16 Мегагерц ( 0,000000062 S)
;
; требуемые интервалы по даташиту WS2812B
;
;Data transfer time( TH+TL=1.25µs±600ns)
;  T0H  0 code ,high voltage time  0.4us   ±150ns
;  T1H  1 code ,high voltage time  0.8us   ±150ns
;  T0L  0 code ,low voltage time   0.85us  ±150ns
;  T1L  1 code ,low voltage time   0.45us  ±150ns
;  RES  low voltage time  Above 50µs
; исходный уровень линии связи = 0
; данные передаются пакетами из трех байт на точку
; старшими битами вперед в последовательности
; соответствующей G - R - B цветам точки
; количество блоков должно соответствовать
; количеству точек в ленте
;
; реальные данные согласно тест - отладки дебаггером (версия1!)
; авр-студио 4.19
;
; Data transfer time( TH+TL=1.38µs -10ns)
;  T0H  0 code ,high voltage time  0.44us  ±10ns
;  T1H  1 code ,high voltage time  0.88us  ±10ns
;  T0L  0 code ,low voltage time   0.94us  ±10ns
;  T1L  1 code ,low voltage time   0.50us  ±10ns
;  RES  low voltage time  192,88uS (Above 50µs)
;
; длина прерывания с пакетом загрузки (x60*3) = 2175uS (0.002175)
; интервал между прерываниями (irq t/c0) = 0.004S (4000uS)
;
;             define datas
; .equ port_out = PORTB ; порт вывода (по усмотрению)
; .equ out_line = 0 ; линия вывода данных
; .equ bufout = SRAM_START ; начальный адрес буфера вывода
; .equ pixel = 60 ; количество точек в линейке/ленте
; .equ bufout_size = (pixel * 3) ; не может быть более объема ОЗУ - стек!!!


;таблица обьявленных имен - переназначение регистров РОН
;
; .def name = r31 ; ZH регистр (полный)
; .def name = r30 ; ZL регистр (полный)
; .def name = r29 ; YH регистр (полный)
; .def name = r28 ; YL регистр (полный)
; .def name = r27 ; XH регистр (полный) указатель текущей ячейки массива bufout
; .def name = r26 ; XL регистр (полный) указатель текущей ячейки массива bufout
; .def name = r25 ; регистр (полный) BH
; .def name = r24 ; регистр (полный) BL
; .def name = r23 ; регистр (полный)
; .def name = r22 ; регистр (полный)
; .def name = r21 ; регистр (полный)
; .def name = r20 ; регистр (полный)
; .def name = r19 ; регистр (полный)
; .def name = r18 ; регистр (полный)
; .def tmp1 = r17 ; регистр (полный) счетчик байт вывода
; .def tmp0 = r16 ; регистр (полный) буфер выводимого байта
; .def regn = r15 ; регистр (урезан)
; .def regn = r14 ; регистр (урезан)
; .def regn = r11 ; регистр (урезан)
; .def regn = r10 ; регистр (урезан)
; .def regn = r9 ; регистр (урезан)
; .def regn = r8 ; регистр (урезан)
; .def regn = r7 ; регистр (урезан)
; .def regn = r6 ; регистр (урезан)
; .def regn = r5 ; регистр (урезан)
; .def regn = r4 ; регистр (урезан)
; .def regn = r3 ; регистр (урезан)
; .def regn = r2 ; регистр (урезан)
; .def matr = r1 ; регистр (урезан) r1 по возможности не использовать!!!
; .def madr = r0 ; регистр (урезан) r0 по возможности не использовать!!!
;
;----------
;  .macro   ;; ввод и предобработка данных
;     
;     
;    .endmacro
;
;----------
;
; определение буфера вывода в области данных
;  .dseg
;  .org bufout
;point0: .byte 3 ; g:r:b
;point1: .byte 3 ; g:r:b
;point2: .byte 3 ; g:r:b
;point3: .byte 3 ; g:r:b
;point4: .byte 3 ; g:r:b
;point5: .byte 3 ; g:r:b
;point6: .byte 3 ; g:r:b
;point7: .byte 3 ; g:r:b
;point8: .byte 3 ; g:r:b
;point9: .byte 3 ; g:r:b
;point10: .byte 3 ; g:r:b
;point11: .byte 3 ; g:r:b
;point12: .byte 3 ; g:r:b
;point13: .byte 3 ; g:r:b
;point14: .byte 3 ; g:r:b
;point15: .byte 3 ; g:r:b
;point16: .byte 3 ; g:r:b
;point17: .byte 3 ; g:r:b
;point18: .byte 3 ; g:r:b
;point19: .byte 3 ; g:r:b
;point20: .byte 3 ; g:r:b
;point21: .byte 3 ; g:r:b
;point22: .byte 3 ; g:r:b
;point23: .byte 3 ; g:r:b
;point24: .byte 3 ; g:r:b
;point25: .byte 3 ; g:r:b
;point26: .byte 3 ; g:r:b
;point27: .byte 3 ; g:r:b
;point28: .byte 3 ; g:r:b
;point29: .byte 3 ; g:r:b
;point30: .byte 3 ; g:r:b
;point31: .byte 3 ; g:r:b
;point32: .byte 3 ; g:r:b
;point33: .byte 3 ; g:r:b
;point34: .byte 3 ; g:r:b
;point35: .byte 3 ; g:r:b
;point36: .byte 3 ; g:r:b
;point37: .byte 3 ; g:r:b
;point38: .byte 3 ; g:r:b
;point39: .byte 3 ; g:r:b
;point40: .byte 3 ; g:r:b
;point41: .byte 3 ; g:r:b
;point42: .byte 3 ; g:r:b
;point43: .byte 3 ; g:r:b
;point44: .byte 3 ; g:r:b
;point45: .byte 3 ; g:r:b
;point46: .byte 3 ; g:r:b
;point47: .byte 3 ; g:r:b
;point48: .byte 3 ; g:r:b
;point49: .byte 3 ; g:r:b
;point50: .byte 3 ; g:r:b
;point51: .byte 3 ; g:r:b
;point52: .byte 3 ; g:r:b
;point53: .byte 3 ; g:r:b
;point54: .byte 3 ; g:r:b
;point55: .byte 3 ; g:r:b
;point56: .byte 3 ; g:r:b
;point57: .byte 3 ; g:r:b
;point58: .byte 3 ; g:r:b
;point59: .byte 3 ; g:r:b
;
;----------

  .cseg
      .org 0x0020 ; старовая позиция 0х0020 !!!
slot0:
     ; 6/14 (6-4=2 посему роль остатка выполняет CBI)
    cbi port_out,out_line ; 2 цикла
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    ret ; 4 цикла
    .org (slot0+16)
slot1:
    nop ; 13/7 (13-4=9)
    nop
    nop
    nop
    nop
    nop
    nop
    cbi port_out,out_line ; 2 цикла
    nop
    nop
    ret ; 4 цикла
    .org 0x0060
xslot0:
    ; 6/14 (6-5=1 посему роль остатка выполняет CBI с избытком в 1 nop)
    cbi port_out,out_line ; 2 цикла
    cbr zl,(1<<6) ; модификация указателя 1 цикл
    nop
    nop
    nop
    nop
    nop
    nop ; -2 цикла на ld tmp0,x+
    dec tmp1 ; 1 цикл
    brbs SREG_Z,ends_trd ; 1 цикл при неисполнении (в цикле)
    rjmp trasstt ; 2 цикла
    .org (xslot0+16)
xslot1:
    nop ; 13/7 (13-5=8)
    cbr zl,(1<<6) ; модификация указателя 1 цикл
    nop
    nop
    nop
    nop
    nop
    cbi port_out,out_line ; 2 цикла
           ; -2 цикла на ld tmp0,x+
      dec tmp1 ; 1 цикл
    brbs SREG_Z,ends_trd ; 1 цикл при неисполнении (в цикле)
    rjmp trasstt ; 2 цикла
;
ends_trd:
      pop tmp0
      pop tmp1
      pop xl
      pop xh
         pop zl
         pop zh ; восстановить рабочую область из стека
   ret
;----------
;
; предварительно:
; линия out_line настроена на вывод
; исходный уровень out_line =0
; указатель стека усатновлен на RAMEND
; массив данных (bufout:bufout_size) предварительно загружен
; флаг готовности массива данных установлен
;
mass_trm:
     push zh
     push zl
     push xh
     push xl
     push tmp1
     push tmp0 ; храним рабочую область в стеке
res_line:
     ldi tmp0,4
     ser tmp1
     cbi port_out,out_line
res_time:
     dec tmp1
     brne res_time
     dec tmp0
     brne res_time ; =>50uS time out
     ldi xh,high (bufout)
     ldi xl,low (bufout) ; загрузка начального адреса массива
        ; в указатель
     ldi tmp1,bufout_size
     ldiw z,slot0 ; адрес начала таблицы в указателе
;----------
trasstt:
    ld tmp0,x+ ; 2 цикла
slot_0:
      sbi port_out,out_line ; 2 цикла реально до установки 3 цикла
         bst tmp0,7 ; 1 цикл
         bld zl,4 ; 1 цикл
         icall ; 3 цикла = 4 цикла от out_line=1
;----------
slot_1:
      sbi port_out,out_line
      bst tmp0,6 ; 1 цикл
         bld zl,4 ; 1 цикл
         icall ; 3 цикла
;----------
slot_2:
      sbi port_out,out_line
      bst tmp0,5 ; 1 цикл
         bld zl,4 ; 1 цикл
         icall ; 3 цикла
;----------
slot_3:
      sbi port_out,out_line
      bst tmp0,4 ; 1 цикл
         bld zl,4 ; 1 цикл
         icall ; 3 цикла
;----------
slot_4:
      sbi port_out,out_line
      bst tmp0,3 ; 1 цикл
         bld zl,4 ; 1 цикл
         icall ; 3 цикла
;----------
slot_5:
      sbi port_out,out_line
      bst tmp0,2 ; 1 цикл
         bld zl,4 ; 1 цикл
         icall ; 3 цикла
;----------
slot_6:
      sbi port_out,out_line
      bst tmp0,1 ; 1 цикл
         bld zl,4 ; 1 цикл
         icall ; 3 цикла
;----------
slot_7:
      sbi port_out,out_line
      sbr zl,(1<<6) ; модификация указателя под завершающий фрагмент
                  ; 1 цикл
      bst tmp0,0 ; 1 цикл
         bld zl,4 ; 1 цикл
         ijmp ; 3 цикла
;----------

механизм обработки тайм-слотов основан на фиксированных адресах начала блоков формирования тайм-слотов.
slot0 = 0x0020
slot1 = slot0+16
xslot0 = 0x0060
xslot1 = xslot0+16
Можно конечно то и препроцессору поручить - но тогда переписываем определенные участки обработчика trasstt.
Иначе хоть и соберется - но работать не будет.
:beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 19:53:07 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
makefile скопирован из проекта Чена, легким движением настраивается - тип микроконтроллера и перечень исходников. Теперь он НАВСЕГДА - легко идет в другие проекты и даже под армы подправить можно.
Насчет жестких адресов (никогда не приходилось) - легко решаемо другими способами (имхо), даже любимыми вставками обходятся
https://github.com/lpodkalicki/blog/blo ... t_ws2812.c


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 20:54:56 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
BOB51 писал(а):
на всякий случай оригинал, чтоб понятнее было в чем ловушка
я бегло посмотрел... и понял, в чем ловушка... или догадался. ваш код абсолютно непортируемый. вот это большое количество NOP-ов - это же задержки? чуть поменялась тактовая частота, и надо пересчитывать неизвестно как новое их количество...
жестко привязанные точки входа - это не достоинство, а недостаток: чуть изменился тип МК (например, взяли МК с более чем 64К памяти, чтобы Jmp/call стал четырехбайтным - все, сливай воду... и так далее.

ваш пример как раз хорош в качестве "страшилки" для начинающих программистов: будете дети вот так писать - никто вас на работу не возьмет, так и будете всю жизнь вручную pop-push по 30 раз писать... :)))

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 21:03:40 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15118
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Ну так.. на то и ассемблер, чтоб подобные вопросы решать.
Насчет четырехбайтового вызова - то только при вызове самой программы - в теле используется косвенная адресация (IJMP)- а она НЕИЗМЕННА по времени.
Использование высчитываемых вручную задержек в принципе вполне обосновано в данном случае (фазовая манипуляция с помощью ногодрыга под протокол WS2812 при обеспечении долговременной стабильности комплектов слотов).
Вопрос же был в том - все ли варианты приемов "чистого ассемблера" легко переносятся в Си.
8)
Кроме прочего - алгоритм не только для АВРок... Мне надо иметь возможность однотипные приемы на разных семействах отрабатывать.
Посему и предпочитаю правило - не мешать чистый ассемблер с ЯВУ в варианте разнообразных ассемблерных вставок.
Другое дело приемы работы и алгоритмические решения, если таковое возможно (и за шо меня периодически поцарапывают).
:beer:


Последний раз редактировалось BOB51 Пт мар 20, 2020 21:13:20, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 21:10:39 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
BOB51 писал(а):
все ли варианты приемов "чистого ассемблера" легко переносятся в Си
ну знаете... вопрос из разряда "где взять упряжь для кошки?" - зачем ВСЕ ВАРИАНТЫ переносить? в Си следует переносить лишь то, без чего принципиально невозможно решить задачу!

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 21:15:14 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Ну так.. на то и ассемблер, чтоб подобные вопросы решать

Подобные вопросы в современном мире теперь принято аппаратно решать - см. AN1606:
Using the Configurable Logic Cell (CLC) to Interface a PIC16F1509 and WS2811 LED Driver


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 21:20:22 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15118
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
ARV
Вот и я про то же - не следует пихать в ЯВУ примитивы.
Для того соответствующие средства имеются.
В адуринке следует следовать концепту применения референса, а не пытаться "гибриды" лепить (по крайней мере на уровне "продвинутого пользователя").
А мне рекомендуют скрещивать адуринку с ассемблерными файлами.
Говорю же уже какой раз - в рамках IDE руководствуемся возможностями, предлагаемыми референсом.
А ежли хотим повыделываться - берем нашу DIP микросборку (ту же нанку) и программируем в рамках соответствующего компилятора (хоть Си, хоть ассемблер) - но то уже не ардуино, а конструкция на базе соответствующего МК.
8)

Насчет аппаратных...
Там где много аппаратных модулей понатыкано есть побочный эфект - надо детально изучать начинку на предмет начального состояния МК.
Дабы изолировать неиспользуемые узлы.
А это ужшшш...
Весьма муторное занятие (да и накладно).
Обычно ограничиваемся определенным набором проработанных кристаллов в каждом семействе.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт мар 20, 2020 21:51:25 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
"ту же нанку" - там аппаратный SPI и UART, их народ уже давно приспособил для управления WS-ами. Теория:
http://www.getchip.net/posts/119-umnye- ... neopixels/
И не надо никаких ассемблеров с жесткими адресами


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Сб мар 21, 2020 07:34:26 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15118
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Снова мимо!
8)
А я то думал, найдется таки умная усато-полосатая сущность и покажет решение средствами препроцессора.
Я - то ведь всего лишь "продвинутый пользователь-любитель".
:wink:
В прожке позиционно-программный селектор (аналогия табличного дешифратора для скоростного двоично-десятичного преобразования в диапазоне 0-99 - классического приема при работе под ассемблером).
Это касательно АВРок более актуально - анализ и выдача значения с одинаковым интервалом (оптимизация по скорости и равным интервалам для определения как 0 так и 1).
Для получения ограниченно перемещаемого кода там всего-то надо жестко обусловить начальный адрес подпрограммы.
У стартового адреса допустимы любые из нижеприведенных значений:
0хnn00
0xnn20
0xnn40
0xnn60
:tea:

УПСЬ...!!
Вот это симпатяшки!!!

Вложение:
NCD2100.pdf [342.02 KiB]
Скачиваний: 129

Вложение:
NCD2400M.pdf [404.27 KiB]
Скачиваний: 131

:hunger: :hunger: :hunger:
жаль только снова "вне досягаемости"...
:(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Сб мар 21, 2020 08:49:04 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
покажет решение средствами препроцессора

тут скорее надо дописать "свои" фиксированые секции в линкер скрипте:
Код:
MEMORY
{
  text      (rx)   : ORIGIN = 0, LENGTH = 128K
  data      (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0
  eeprom    (rw!x) : ORIGIN = 0x810000, LENGTH = 64K
  fuse      (rw!x) : ORIGIN = 0x820000, LENGTH = 1K
  lock      (rw!x) : ORIGIN = 0x830000, LENGTH = 1K
  signature (rw!x) : ORIGIN = 0x840000, LENGTH = 1K
}

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Сб мар 21, 2020 09:59:27 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15118
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
А при помощи препроцессора компилятора ассемблера никак?
:roll:
Печалька однако...
Ибо писать скрипты линкера под каждый файл, коих в многофайловом проекте может быть энное количество, весьма муторно...
А в варианте моего "слэнга" практически от такой заморочки я избавлен.
8)
Касательно "других решений" - естественно оные имеются, однако вопрос о некорректности применения "чисто ассемблерных файлов", не учитывающих специфику работы компилятора Си, в проектах заточенных под Си похоже закрыт.
:wink:
Пример, который я привёл выше - всего лишь одна из разновидностей классического решения при работе под " чистым ассемблером". И таких приёмов, некорректных по отношению к "чистому Си" достаточно много встречается.
Просто не стоит "впадать в крайности" - у каждого из компиляторов свои особенности, которые надо учитывать при работе.
:beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Сб мар 21, 2020 10:33:51 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Ибо писать скрипты линкера под каждый файл, коих в многофайловом проекте может быть энное количество, весьма муторно...

ОДИН там скрипт на весь проект, хоть 100500-файловый. И все совсем не муторно, если почитать, тут метод тыка не проходит
https://www.opennet.ru/docs/RUS/gnu_ld/gnuld-3.html
Цитата:
Скрипт может содержать максимум одну команду MEMORY, тем не менее Вы можете определить любое необходимое Вам число блоков памяти внутри этой команды.

хотелось бы увидеть
Цитата:
одна из разновидностей классического решения при работе под " чистым ассемблером"

других авторов. Как-то минула меня чаша сия.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Сб мар 21, 2020 11:07:56 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15118
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Да любых авторов - зависит от самого проекта и рациональности применения.
Просто Вы, почуствовав сложности работы с "чистым ассемблером", пораньше на Си соскочили.
8)
Писанина скриптов и маке-файлов должна быть осознанно - самостоятельной.
А коль такового уровня нету - стараемся в дебри не лазить без особой необходимости.
Существует достаточно много методов, позволяющих обойти подобные осложнения.
:sleep:


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 2247 ]     ... , , , 44, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y