0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 140
|
|
1 | |
Ассемблер STM825.12.2012, 04:40. Показов 55912. Ответов 87
Метки нет (Все метки)
В связи с тем что ассемблер этих контроллеров описан очень плохо, и с ошибками открываю эту тему, и сразу же имеется вопрос:
как осуществить вычитание с переносом байта(константы) из слова с помощью sub и sbc? Дело в том что пока я гружу в аккумулятор байт, т.к. sub и sbc работают только с аккумулятором, флаг переноса теряется. В результате получаю сложение слова с инвертированным байтом. Пока выкрутился так: Код
ld xh,a subw x,#$003c
0
|
25.12.2012, 04:40 | |
Ответы с готовыми решениями:
87
Ассемблер STM8 Еще один ассемблер для STM8 (ST7) Ищу людей кто может помочь протестировать ассемблер для STM8 кто сделает экспорт SDCC STM8 -> IAR STM8 ? STM8 SWIM |
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 569
|
|
12.01.2013, 23:26 | 21 |
В том случае как раз можно было отследить, откуда и куда. В общем-то это было прерывание от таймера, который занимался миганием и бибиканьем в устройстве телефонного назначения, в зависимости от текущего режима работы бибикало и мигало оно по-разному. Но вот в том же устройстве встретил подпрограммку подсчёта 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
|
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
Регистрация: 12.04.2010
Сообщений: 3,260
|
|
25.01.2013, 14:09 | 28 |
Сообщение от sosus
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
реально жесть, если конечно не шутка))) Интересно, а обнаружение цели пассивное, по звуку?
0
|
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 140
|
|
31.01.2013, 01:03 | 31 |
Опять есть вопрос: при входе в прерывания, регистры ложатся в стек, при выходе выковыреваются. Можно ли какнить пропустить встроенный pop-push?
0
|
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
|
|
31.01.2013, 12:01 | 32 |
[QUOTE="sosus"][QUOTE="Цитата:[/QUOTE]
Опять есть вопрос: при входе в прерывания, регистры ложатся в стек, при выходе выковыреваются. Можно ли какнить пропустить встроенный pop-push? Нет. А зачем?
0
|
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 219
|
|
31.01.2013, 15:17 | 33 |
Сообщение от sosus
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 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
<Изображение удалено> :)
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 | |
06.12.2014, 21:10 | |
Помогаю со студенческими работами здесь
40
IAR for STM8 V2.10 Не прошивается STM8 STM8 прошивка stm8 bootloader stm8 и little-endian ШИМ STM8 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства
Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
|
Что такое NullReferenceException и как исправить?
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-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
|