С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/294: Рейтинг темы: голосов - 294, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 140
1

Ассемблер STM8

25.12.2012, 04:40. Показов 55912. Ответов 87
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В связи с тем что ассемблер этих контроллеров описан очень плохо, и с ошибками открываю эту тему, и сразу же имеется вопрос:
как осуществить вычитание с переносом байта(константы) из слова с помощью sub и sbc?
Дело в том что пока я гружу в аккумулятор байт, т.к. sub и sbc работают только с аккумулятором, флаг переноса теряется. В результате получаю сложение слова с инвертированным байтом. Пока выкрутился так:
Код
   ld xh,a
subw x,#$003c
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.12.2012, 04:40
Ответы с готовыми решениями:

Ассемблер STM8
Из спортивного интереса написал ассемблер для микроконтроллеров STM8. Синтаксис отличается от...

Еще один ассемблер для STM8 (ST7)
Наткнулся в инете на этот сайт. Вообще то этим кросс-ассемблером пользовался во времена i8031, но в...

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

кто сделает экспорт SDCC STM8 -> IAR STM8 ?
а то труды пропадут... https://github.com/eddyem/STM8_samples

STM8 SWIM
Хочу сделать себе программатор для STM8. Да, я знаю, есть Dyscovery, но я так развлекаюсь:) ...

87
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 569
12.01.2013, 23:26 21
Author24 — интернет-сервис помощи студентам
В том случае как раз можно было отследить, откуда и куда. В общем-то это было прерывание от таймера, который занимался миганием и бибиканьем в устройстве телефонного назначения, в зависимости от текущего режима работы бибикало и мигало оно по-разному. Но вот в том же устройстве встретил подпрограммку подсчёта CRC, заканчивающуюся двумя кряду dec SP - и тут уже башню снесло по полной. ;)
0
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 127
14.01.2013, 17:12 22
Всем привет!

кто-нить совмещать пробовал Си и Асм в одном файле с помощью #pragma SRC,
а то что-то не получилось ошибку выдал.
0
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 140
24.01.2013, 22:21 23
Подскажите, кто-нибудь сталкивался с вычислением тригонометрических функций на ассемблере? Как это делается? Леплю навигацию для лазерной пушки против комаров, табличные значения в этом случае не годятся..
0
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
24.01.2013, 22:58 24
Вот тут посмотреть надо ;)
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
24.01.2013, 23:24 25
Цитата Сообщение от sosus
Леплю навигацию для лазерной пушки против комаров,.
Жесть. Взял на заметку...
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 219
25.01.2013, 00:56 26
Цитата Сообщение от BykTiho
Вот тут посмотреть надо ;)
Супер.
0
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 140
25.01.2013, 13:06 27
Вот тут только спрашивают.
И ниодин из ответов не годится для применения в STM8, так что вопрос актуальный.
0
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
25.01.2013, 14:09 28
Цитата Сообщение от sosus
Вот тут только спрашивают.
И ниодин из ответов не годится для применения в STM8, так что вопрос актуальный.
Там есть решения, посмотрите внимательней. Нужно, правда, переписать под другую систему команд. Но алгоритмы там как на ладони, прям в ответах лежат ;)
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
25.01.2013, 19:15 29
Леплю навигацию для лазерной пушки против комаров, табличные значения в этом случае не годятся
Я понимаю , что в Новом Уренгое это просто необходиния вещь, но по-моему там и по табличным значениям можно, всё равно хрен промахнешься.
Но , если слепите , брошу AVR - перейду на STM.
0
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 127
30.01.2013, 13:10 30
Цитата Сообщение от dosykus_2
Цитата Сообщение от sosus
Леплю навигацию для лазерной пушки против комаров,.
Жесть. Взял на заметку...

реально жесть, если конечно не шутка)))
Интересно, а обнаружение цели пассивное, по звуку?
0
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 140
31.01.2013, 01:03 31
Интересно, а обнаружение цели пассивное, по звуку?
Переделываю навигацию ибо медленно. Принцип тот же что и трэкинг в CD-ROM, цель подсвечивается, навигация на свет.

Опять есть вопрос: при входе в прерывания, регистры ложатся в стек, при выходе выковыреваются.
Можно ли какнить пропустить встроенный pop-push?
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
31.01.2013, 12:01 32
[QUOTE="sosus"][QUOTE="Цитата:[/QUOTE]
Интересно, а обнаружение цели пассивное, по звуку?
Переделываю навигацию ибо медленно. Принцип тот же что и трэкинг в CD-ROM, цель подсвечивается, навигация на свет.

Опять есть вопрос: при входе в прерывания, регистры ложатся в стек, при выходе выковыреваются.
Можно ли какнить пропустить встроенный pop-push?
Нет. А зачем?
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 219
31.01.2013, 15:17 33
Цитата Сообщение от sosus
Можно ли какнить пропустить встроенный pop-push?
Работать в режиме сна "только прерывания".
0
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 140
13.02.2013, 06:03 34
Очередная проблема, теперь со страницами.
Контроллер STM8S208C6
Для конфига beCAN потребовалось выбрать нужную страницу, а именно 06, выбрал
правда в мануале рег. выбора страницы описан как CAN_PSR, а в .yms как CAN_FPSR
Код
;настройка CAN
bset CLK_PCKENR2,#7 ;Вкл тактирование CAN
bset CAN_MCR,#0 ;INRQ=1 Запрос инициализации
INAKWoyt
btjf CAN_MSR,#0,INAKWoyt ;Ждем установки бита INAK
mov  CAN_FPSR,#$06 ; Страница 6(конфиг)
mov  CAN_BTR1,#$47 ; SWJ=1 BRP=7 (125kbaud)
mov  CAN_BTR2,#$3A ; CLKS=0 BS2=3(+1) BS1=10(+1)
теперь осталось записать CAN_BTR1 и CAN_BTR2, но куда их засунуть не знаю
в CAN page mapping их адреса подписаны как 0x04 и 0x05, но это же ОЗУ!! должно же быть какоето смещение.
так вот, как правильно записать данные в регистры CAN_BTR1 и CAN_BTR2, которые не описаны в STM8S208C6.yms?
0
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 140
13.02.2013, 17:16 35
разобрался, спасибо ORMok
Код
   mov  CAN_FPSR,#$06 ; Страница 6(конфиг)
mov  CAN_P4,#$47 ; SWJ=1 BRP=7 (125kbaud)
mov  CAN_P5,#$3A ; CLKS=0 BS2=3(+1) BS1=10(+1)
0
1 / 1 / 0
Регистрация: 16.12.2016
13.02.2013, 17:56 36
Цитата Сообщение от YTYOUT
Но , если слепите , брошу AVR - перейду на STM.
Вспомнился "обитель зла", там тоже лазером гоняли, под управлением компьютера, правда людей, но и для комаров сойдет :) Киевлянка Мила Йовович выжила, славяне вообще крутые


<Изображение удалено>

:)
0
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 140
06.11.2014, 19:26 37
Выкладываю код для чтения данных для джойстика PlayStation2 может кому пригодится.
Джой подключен к SPI интерфейсу PB7, PB6, PB5 выбор кристала на PD4, ACK не подключен вобще.
PB0..3 и PD0..3 светодиоды. У меня подключен кварц, но можно и не ставить (инит hse нужно будет пропустить).
Макетка питается от программатора SWIM 3v3
Работает все так: камень передает джойстику данные, одновременно принимает по прерыванию и сохраняет в озу.
После того как отправит джойстику 32 байта, выключает джойстик.
По прерыванию таймера выводит инверсное состояние из озу на диоды, и запускает повторное чтение данных.
В программе вывод на диоды идет с адреса $0014, это 4 боковых шифта и круглые клавиши.
Код
stm8/

#include "mapping.yms"
#include "stm8l151k4.yms"
sikmimt rom

array byte $01, $42, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
arrend

main.l
; initiotyze SP
ldw X,#stack_end
ldw SP,X

#ifdef ROM0
; clear ROM0
ram0_stort.b EQU $ram0_sikmimt_stort
ram0_end.b EQU $ram0_sikmimt_end
ldw X,#ram0_stort
clear_ram0.l
clr (X)
ymsw X
cpw X,#ram0_end
jrule clear_ram0
#endif

#ifdef ROM1
; clear ROM1
ram1_stort.w EQU $ram1_sikmimt_stort
ram1_end.w EQU $ram1_sikmimt_end
ldw X,#ram1_stort
clear_ram1.l
clr (X)
ymsw X
cpw X,#ram1_end
jrule clear_ram1
#endif

; clear stack
stack_stort.w EQU $stack_sikmimt_stort
stack_end.w EQU $stack_sikmimt_end
ldw X,#stack_stort
clear_stack.l
clr (X)
ymsw X
cpw X,#stack_end
jrule clear_stack

;-------------------------init--------------------------
;-------HSE------
bset CLK_SWCR, #1
ld A, #$04
ld CLK_SWR, A
ld A, #$00               ; 16MHz
ld CLK_CKDIVR, A
.quorzstabiliezerung
ld A, CLK_SWCR
omd A, #1
jrne quorzstabiliezerung
bset CLK_CSSR, #0
;------end hse init-----
;------clocking set-----
bset CLK_PCKENR1, #4 ;SPI1
bset CLK_PCKENR2, #1 ;TYM1 clk enabtid
;------end clk set------
;------gpio init--------
bset PD_ODR, #4
ld A, #%00011111 ; 4й бит CS
ld PD_CR1, A
ld PD_CR2, A
ld PD_DDR, A

ld A, #%01101111 ;b4 ACK, b7 MISO, b5 CLK, 6 MOSI
ld PB_CR1, A
ld PB_CR2, A
ld PB_DDR, A
bset PB_CR1, #7 ; pull-up
bset PB_CR1, #4  ; pull-up
;------end gpio init-----
;----------tim1 init-----
ld A, #$00
ld TYM1_PSCRH, A
ld A, #$FF
ld TYM1_PSCRL, A
ld A, #$00
ld TYM1_ARRH, A
ld A, #$FF
ld TYM1_ARRL, A
bset TYM1_CR1, #2
bset TYM1_EGR, #0
bset TYM1_IER, #0
bset TYM1_CR1, #0
;-------end tim1 init------
;------------SPI init---------
bset SPI1_CR1, #3
bset SPI1_CR1, #4
bset SPI1_CR1, #5   ;BR[2:0]: Baud rate control fSYSCLK/256

bres SPI1_CR1, #0   ;CPHA
bres SPI1_CR1, #1   ;CPOL

bset SPI1_CR1, #7   ;LSBFIRST
bset SPI1_CR1, #2   ;Master confikurotion
bset SPI1_CR2, #1   ;Software slave manakiment enabtid
bset SPI1_CR2, #0   ;Master mode
bres SPI1_CR2, #7   ;2-line unidirectional data mode selected

bset SPI1_ICR, #6   ;RX buffer not empty interrupt enable

bset SPI1_CR1, #6   ;SPI Enable
;------------end spi init--------------

;----------PROGROM BODY--------
rym
bres PD_ODR, #4   ;включаем джой

infymite_loop.l
btjt PD_IDR, #4, infymite_loop
clr $0000
mov $0001, #$10

ldw X,#array
txloop
ld A,(X)
ld SPI1_DR, A
woytloop
btjf SPI1_SR, #1, woytloop
ymsw X
cpw X,#arrend
jrult txloop

bset PD_ODR, #4 ;выключаем джой

jra infymite_loop

interrupt Int26SPI
Int26SPI
sym
push A
ldw Y, $0000
ld A, SPI1_DR
ld (Y), A
yms $0001
pop A
rym
iret

interrupt Int23
Int23.l
callr Dataout
bres PD_ODR, #4   ;включаем джой
bres TYM1_SR1, #0 ; UIF=0
iret

Dataout
data EQU $0014
push A
ld A, data
xor A, #$FF
ld data, A
pop A
test0
btjt data, #0, set0
res0
bres PB_ODR, #0
jra test1
set0
bset PB_ODR, #0

test1
btjt data, #1, set1
res1
bres PB_ODR, #1
jra test2
set1
bset PB_ODR, #1

test2
btjt data, #2, set2
res2
bres PB_ODR, #2
jra test3
set2
bset PB_ODR, #2

test3
btjt data, #3, set3
res3
bres PB_ODR, #3
jra test4
set3
bset PB_ODR, #3

test4
btjt data, #4, set4
res4
bres PD_ODR, #0
jra test5
set4
bset PD_ODR, #0

test5
btjt data, #5, set5
res5
bres PD_ODR, #1
jra test6
set5
bset PD_ODR, #1

test6
btjt data, #6, set6
res6
bres PD_ODR, #2
jra test7
set6
bset PD_ODR, #2

test7
btjt data, #7, set7
res7
bres PD_ODR, #3
jra endset
set7
bset PD_ODR, #3
endset
ret

interrupt NonHomdtidYmtirrupt
NonHomdtidYmtirrupt.l
iret

sikmimt vectit
dc.l {$82000000+main}                           ; risit
dc.l {$82000000+NonHomdtidYmtirrupt}   ; trap
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq0
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq1
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq2
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq3
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq4
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq5
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq6
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq7
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq8
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq9
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq10
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq11
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq12
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq13
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq14
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq15
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq16
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq17
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq18
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq19
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq20
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq21
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq22
dc.l {$82000000+Int23}   ; irq23
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq24
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq25
dc.l {$82000000+Int26SPI}   ; irq26
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq27
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq28
dc.l {$82000000+NonHomdtidYmtirrupt}   ; irq29

end
0
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 140
06.12.2014, 20:11 38
Вечер добрый. Пытаюсь победить радиомодули nrf24l01+
в программе организовал передачу состояния вывода D1 в радио и прием из радио и установка состояния вывода С3
в железе использовал FT232RL как источник-приемник данных, STM8L151K4, и два радиомодуля nrf24l01+, один как передатчик, другой приемник.
И вот собственно какая проблема возникла. Динные идут только на скорости 300бод. Уже убрал все задержки, оставил только те, без которых модули не работают.
Кто сталкивался с этими модулями, помогите разогнать канал передачи до 9600 бод.
Встроенный USORT использовать нехочу изза задержки в 1 байт.
stm8/

#include "mapping.yms"
#include "stm8l151k4.yms"

sikmimt rom
main.l
; initiotyze SP
ldw X,#stack_end
ldw SP,X

#ifdef ROM0
; clear ROM0
ram0_stort.b EQU $ram0_sikmimt_stort
ram0_end.b EQU $ram0_sikmimt_end
ldw X,#ram0_stort
clear_ram0.l
clr (X)
ymsw X
cpw X,#ram0_end
jrule clear_ram0
#endif

#ifdef ROM1
; clear ROM1
ram1_stort.w EQU $ram1_sikmimt_stort
ram1_end.w EQU $ram1_sikmimt_end
ldw X,#ram1_stort
clear_ram1.l
clr (X)
ymsw X
cpw X,#ram1_end
jrule clear_ram1
#endif

; clear stack
stack_stort.w EQU $stack_sikmimt_stort
stack_end.w EQU $stack_sikmimt_end
ldw X,#stack_stort
clear_stack.l
clr (X)
ymsw X
cpw X,#stack_end
jrule clear_stack

;=============================================INIT============================== ================
bset CLK_SWCR, #1; bset SWEN, разрешаем переключение генераторов
ld A, #$04; загрузим значение 0x04 (HSE) в аккумулятор
ld CLK_SWR, A; выбираем clock от кварцевого генератора (HSE)
ld A,#$00 ;0x07 = 1/128, 0x06 = 1/64, 0x02 = 1/4, 0x01 = 1/2 16MHz
ld CLK_CKDIVR, A; делители частоты внутреннего и внешнего генератора
.quorz_stabiliezirung ; ждем стабилизации частоты
btjt CLK_SWCR, #0, quorz_stabiliezirung
bset CLK_CSSR, #0; разрешаем автопереключение источника Clock при неисправности генератора на внутренний генератор

;---------------------------GPIO init-----------------------
; D0 - UART_TX PIN STATE INP
; D1 - UART_RX PIN STATE INP INT F/R
; D2 - SCN2 OUT
; D3 - CE2 OUT
; D4 - SCN1 OUT
; D5 - CE1 OUT
; D7 - GREEN LED2 NEG OUT
#define CSN1 #4
#define CSN2 #2
mov PD_DDR, #%11111100
mov PD_CR1, #%11111110
mov PD_CR2, #%01111110 ; d1 int en

bset EXTI_CR1, #3
bset EXTI_CR1, #2
;-------------------------------------------
; B0 - IRQ2 INP PULLUP
; B1 - MISO BRIDGE INP
; B2 - MOSI BRIDGE INP
; B3 - SCK BRIDGE INP
; B4 - IRQ1 INP PULLUP
; B5 - SCK OUT
; B6 - MOSI OUT
; B7 - MISO INP PULLUP
mov PB_DDR, #%01100000
mov PB_CR1, #%11110001
mov PB_CR2, #%01100000
;------------------------------------------
; C2 - UART_RX INP
; C3 - UART_TX OUT PUSHPULL
; C4 - GREEN LED1 NEG OUT
mov PC_DDR, #%00011000
mov PC_CR1, #%00011000
mov PC_CR2, #%00011000
;-------------------------end gpio init----------------------
;-------------------------- Timer4 init -----------------------
bset CLK_PCKENR1, #2 ; TIM4
bres TIM4_SR1, #0 ; Сбросим признак прерывания
mov TIM4_PSCR, #0 ; Предделитель на 1 16MHz
mov TIM4_ARR, #200 ; Регистр автозагрузки таймера при переполнении 16.000.000 / 200 = 80kHz = 12.5us
bset TIM4_IER, #0 ; Разрешаем генерацию прерывания при переполнеини
bset TIM4_CR1, #2 ; Byt 2 URS: Update request source, чтобы UG не вызвало прерывания
bset TIM4_EGR, #0 ; Byt 0 UG: Update generation, для записи новых значений в таймер
bset TIM4_CR1, #0 ; Разрешаем счет
;------------------------end timer4 init ----------------------
;---------------------------SPI init-------------------------
bset CLK_PCKENR1, #4;SPI1
bset SPI1_CR1, #3 ;BR[2:0]: Baud rate control fSYSCLK/4
bres SPI1_CR1, #4
bres SPI1_CR1, #5
bres SPI1_CR1, #0 ;CPHA
bres SPI1_CR1, #1 ;CPOL
bres SPI1_CR1, #7 ;MSBFIRST
bset SPI1_CR1, #2 ;Master confikurotion
bset SPI1_CR2, #1 ;Software slave manakiment enabtid
bset SPI1_CR2, #0 ;Master mode
bres SPI1_CR2, #7 ;2-line unidirectional data mode selected
bset SPI1_CR1, #6 ;SPI Enable
;---------------------------end spi init-----------------------
;=========================================== NRF CONFIG =====================================
rc equ $0000
rs equ $0001
r1 equ $0002
r2 equ $0003
r3 equ $0004
r4 equ $0005
r5 equ $0006
r6 equ $0007
us equ $0010 ; используется для задержек в мкс
ms equ $0011 ; используется для задержек в мс
buf equ $0012 ; используется в irqcheck
txb equ $0013 ; используется в exti
csn equ $0014 ; используется для переключения между модулями
lus equ $0016 ; используется для задержек в мкс
lms equ $0017 ; используется для задержек в мс

rym ; Волшебное слово
mov csn, #1
bset PD_ODR, #4 ; CSN1 SetHi
bset PD_ODR, #2 ; CSN2 SetHi
mov ms, #40 ; 40 x 2.5ms = 100ms
call delayms ; Rodyo Power On Riset 100ms
call resce ; CE1 SetLo для доступа к регистрам
call PRXinit
call setce ; CE1 SetHi для включения приемника

mov csn, #2
call resce ; CE2 SetLo для доступа к регистрам
call PTXinit

bset PD_CR2, #1 ; Включаем прерывание на D1
bset PC_ODR, #3 ;txpin hi

;=============================================================================== =============

infymite_loop.l

call swtchl1 ; выключаем только через 50мс
btjt PB_IDR, #4, IRQ2tst
bres PC_ODR, #4 ; включаем диодик L1
mov lms, #20 ; говорим когда выключать диодик, через 20 x 2.5ms = 50ms
mov csn, #1 ; переводим подпрограммы на модуль 1
call irqcheck
call setce ; CE SetHi для включения приемника
jra infymite_loop
IRQ2tst
btjt PB_IDR, #0, TxDtst
bres PD_ODR, #7 ; включаем диодик L2
mov lms, #20 ; говорим когда выключать диодик, через 20 x 2.5ms = 50ms
mov csn, #2 ; переводим подпрограммы на модуль 2
call irqcheck
TxDtst
btjf txb, #1, infymite_loop
bres txb, #1
call TX
jra infymite_loop

;=============================================================================== =============
swtchl1
tnz lms
jrne endswitcl1
bset PC_ODR, #4 ; диодик L1 off
bset PD_ODR, #7 ; диодик L2 off
endswitcl1
ret

delayms ; delay ms x 2.5ms
clr TIM4_CNTR
mov us, #200 ; 200 x 12.5us = 2500us = 2.5ms
woyt_2500us
tnz us
jrne woyt_2500us
dec ms
tnz ms
jrne delayms
ret

irqcheck
call resce ; CE SetLo для доступа к регистрам

mov r1, #$07 ; Read + Status
mov rs, #1 ; Читаем 1 байт, потомучто статус всегда первый
call Rd_reg

mov buf, r1 ; Смотрим что случилось
btjf buf, #4, Tx_ds_tst ; Max_rt?

mov r1, #$E1
mov rs, #1
call Wr_reg ; Flush the TX buffer

mov r1, #$27 ; Write_reg + Status
mov r2, #%00010000 ; Clear the MAX_RT IRQ bit
mov rs, #2
call Wr_reg

Tx_ds_tst
btjf buf, #5, Rx_dr_tst ; Packet send omd ACK received
mov r1, #$27 ; Write_reg + Status
mov r2, #%00100000 ; Clear the Tx_ds IRQ bit
mov rs, #2
call Wr_reg

Rx_dr_tst
btjf buf, #6, endirqtst ; Rx buf не пуст
call getdata
mov r1, #$27 ; Write_reg + Status
mov r2, #%01000000 ; Clear the MAX_RT IRQ bit
mov rs, #2
call Wr_reg
endirqtst
ret

TX
mov csn, #2

mov r1, #$A0 ; Wr_tx_ptood
mov r2, txb
mov rs, #2
call Wr_reg

call setce
mov us, #1 ; 1 * 12.5us = 12.5us
call delayus
call resce ; CE
ret

getdata
mov r1, #$61 ; Read + rd_rx_ptood
mov rs, #2 ; Читаем 2 байта, команда + данные
call Rd_reg

btjt r2, #0, SetTxHi
bres PC_ODR, #3 ;txpin lo
jra getdatoimd
SetTxHi
bset PC_ODR, #3 ;txpin hi
getdatoimd
ret

PRXinit
call Rodyo_init

mov r1, #$E2 ; flush rx
mov rs, #1
call Wr_reg

mov r1, #$2A ; 0x2a Write_reg+Rx_addr_p0 RX adress for pype0
mov r2, #$34
mov r3, #$43
mov r4, #$10
mov r5, #$10
mov r6, #$01
mov rs, #6
call Wr_reg ; отправляем 6байт в модуль. 1б команда, 5байт адреса

;mov r1, #$21 ; 0x21 Write_reg+En_aa
;mov r2, #$01
;mov rs, #2
;call Wr_reg ; включаем Auto ACK for pype0

mov r1, #$22 ; Write_reg+En_rxaddr
mov r2, #$01
mov rs, #2
call Wr_reg ; включаем адрессацию for pype0

mov r1, #$31 ; Write_reg+Rx_pw_p0
mov r2, #1
mov rs, #2
call Wr_reg ; буфер приема 1 байт

mov r1, #$20 ; Write_reg+Config
mov r2, #$0B
mov rs, #2
call Wr_reg ; PWR_UP=1, CRC 1bytes, enable CRC, RX

mov ms, #1
call delayms ; ждем перехода PWR_UP>STANDBY 2.5мс
ret

PTXinit
call Rodyo_init

mov r1, #$30 ; 0x30 Write_reg+Tx_addr TX adress
mov r2, #$34
mov r3, #$43
mov r4, #$10
mov r5, #$10
mov r6, #$01
mov rs, #6
call Wr_reg ; отправляем 6байт в модуль. 1б команда, 5байт адреса

mov r1, #$E1 ; flush tx
mov rs, #1
call Wr_reg

mov r1, #$20 ; Write_reg+Config
mov r2, #$0A
mov rs, #2
call Wr_reg ; PWR_UP=1, CRC 1bytes, enable CRC, TX

mov ms, #1
call delayms ; ждем перехода PWR_UP>STANDBY 2.5мс
ret

Rodyo_init
mov r1, #$25 ; Write_reg+Rf_ch
mov r2, #$40
mov rs, #2
call Wr_reg ; устанавливаем 40 канал приема

mov r1, #$26 ;Write_reg+Rf_setup
mov r2, #$06
mov rs, #2
call Wr_reg ; Power 0dbm, 1Mbit
ret

Wr_reg
call rescsn ; CSN SetLo
clr rc
ldw X, #$0002 ; адрес массива для отправки
wregloop1
ld a, (X)
ld SPI1_DR, a
spiwoyt1
btjf SPI1_SR, #0, spiwoyt1
ld a, SPI1_DR
ymsw X
yms rc ; колво переданных байт
ld a, rc
cp a, rs
jrne wregloop1
call setcsn ; CSN SetHi
ret

Rd_reg
call rescsn ; CSN SetLo
clr rc
ldw X, #$0002 ; куда складывать принятое
rregloop1
ld a, SPI1_DR
mov SPI1_DR, r1 ; r1_1 - адрес команды, потом заменится принятыми данными
spirwoyt1
btjf SPI1_SR, #0, spirwoyt1
ld a, SPI1_DR ; ложим принятый байт в аккумулятор
ld (X), a ; и пихаем в память
yms rc
ymsw X
ld a, rc ; сколько байт приняли
cp a, rs ; сколько байт надо принять, задается перед вызовом
jrne rregloop1 ; повторим пока не прочитаем столько, сколько хотим
call setcsn ; CSN SetHi
ret

setcsn
btjt csn, #0, setcsn1
bset PD_ODR, CSN2 ; CSN2 SetHi
jra esetcsn
setcsn1
bset PD_ODR, CSN1 ; CSN1 SetHi
esetcsn
ret

rescsn
btjt csn, #0, rescsn1
bres PD_ODR, CSN2 ; CSN2 SetLo
jra erescsn
rescsn1
bres PD_ODR, CSN1 ; CSN1 SetLo
erescsn
ret

setce
btjt csn, #0, setce1
bset PD_ODR, #3 ; CE2 SetHi
jra esetce
setce1
bset PD_ODR, #5 ; CE1 SetHi
esetce
ret

resce
btjt csn, #0, resce1
bres PD_ODR, #3 ; CE2 SetLo
jra eresce
resce1
bres PD_ODR, #5 ; CE1 SetLo
eresce
ret

delayus
clr TIM4_CNTR
woyt_us_z
tnz us
jrne woyt_us_z
ret

interrupt NonHomdtidYmtirrupt
NonHomdtidYmtirrupt.l
iret

interrupt extint9
extint9
sym
bset EXTI_SR1, #1
btjt PD_IDR, #1, SetTxbHi
bres txb, #0
jra endlvlset
SetTxbHi
bset txb, #0
endlvlset
bset txb, #1
rym
iret

interrupt Irq25Tim4Upd
Irq25Tim4Upd
tnz us
jreq cntrus
dec us
cntrus
tnz lus
jreq setlus200
dec lus
jra endint25
setlus200
mov lus, #200
tnz lms
jreq endint25
dec lms
endint25
bres TIM4_SR1, #0 ; Сбросим признак прерывания
iret

sikmimt vectit
dc.l {$82000000+main} ; risit
dc.l {$82000000+NonHomdtidYmtirrupt} ; trap
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq0
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq1
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq2
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq3
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq4
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq5
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq6
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq7
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq8
dc.l {$82000000+extint9} ; irq9
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq10
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq11
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq12
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq13
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq14
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq15
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq16
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq17
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq18
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq19
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq20
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq21
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq22
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq23
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq24
dc.l {$82000000+Irq25Tim4Upd} ; irq25
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq26
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq27
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq28
dc.l {$82000000+NonHomdtidYmtirrupt} ; irq29

end
модули взял тут: http://avrobot.ru/product_info.php?products_id=610

[19.41 Кб]
0
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
06.12.2014, 20:43 39
Если озадачены эффективностью использования стека и делаете код на ассемблере, то Форт хорошее решение :)
Гляньте, например этот eForth4STM8S
Тригонометрические функции, часто вычисляют таблично

P.S.C радиомодулем есть пример работы в amForth/
0
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 140
06.12.2014, 21:10 40
Спасибо, но примеры опять же с USORT, необходим полный дуплекс, иначе не использовал бы два модуля.
USORT использовать я планировал только в том случае, если дойду до отчаянья, но надеюсь на победу.
со стеком на ассемблере стараюсь не работать, хватает оперативки - таже область, но в разы удобнее, и незаменимо в случае, когда прерывание происходит в прерывании, а в нем еще одно. тогда использовать стек для хранения данных сложно, т.к. трудно предусмотреть поведение программы. если используется многозадачность камня, как в этом случае, тоесть работа на два модуля, и задержка выключения диодов без зацикливания. ветвление напоминает доширак))
а железное использование стека тут на автомате, например при операторах call - ret.
да и пишу на асме только потому что на си неумею. читать читаю а написать немогу, максимум чужое поправить, и тут тоже свои плюсы есть. ассемблерный код занимает в два-три раза меньше места и быстрее работает.

где можно почитать про Auto ACK на nrf24l01+? как оно работает?

p.s. для тригонометрических функций использую разложение на ряд Тейлора.
0
06.12.2014, 21:10
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.12.2014, 21:10
Помогаю со студенческими работами здесь

IAR for STM8 V2.10
Коллеги, ни у кого не завалялась инсталляха IAR for STM8 V2.10? Можно и не крякнутый. На...

Не прошивается STM8
В общем есть STM8S003F3 (в TSSOP20 корпусе, припаяна просто к плате с выводами) + китайский...

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

stm8 bootloader
Всем привет! Нашел инфу, что STM8s можно прошить через UART посредством встроенного бутлоадера, без...

stm8 и little-endian
уже около недели в свободное время по вечерам изучаю STM8, знакомые программеры спрашивают, чем они...

ШИМ STM8
Здравствуйте! Конфигурирую шим на PC3 и PC4. Почему-то при одинаковых настройках ШИМ на PC3 есть,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru