08.02.2011, 08:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от qwerky
|
те кто писали delay.h.
|
Он таки есть? Прикрепил бы кто нибудь.
Я эти файлы так и не нашел. Может это не к дискавери, а что нибудь типа стандартных либ от IAR?
Последний раз редактировалось kison; 13.04.2011 в 16:34.
|
|
|
|
08.02.2011, 09:25
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kison
|
ALL - Вообще народ, давайте закончим тут разговоры "в пользу бедных". Хотите сравнить STM8 с тем же АВР - давайте примеры. Я сделаю на STM8 аналог. Хотя ассемблер STM8 практически не знаю - еще пара дней всего как дискавери распечатал.
|
Маленький рабочий пример для Discovery.
Код:
|
#include "stm8s207k.h"
switch .bss
count: ds.b 1
switch .text
xdef InitTimers, TIM3int, TIM4int
InitTimers:
mov TIM3_PSCR, 0x0F ; Set prescaler
mov TIM3_ARRH, #0xff ; Set auto-reload register
mov TIM3_ARRL, #0xFF ;
bset UIE3 ; Enable TIM3 update interrupts
bset URS3
bset CEN3 ; Run TIM3
ret
;
; ***** Timer interrupt handlers *****
;
;
; ** TIM4 overflow ISR
;
TIM4int:
iret
;
; ** TIM3 overflow ISR
;
TIM3int:
bres UIF3 ; Reset interrupt flag
dec count ; Additional program delay
jrne 1$ ;
mov count, #0x4 ; Reload dlay counter
bcpl PD_ODR, #PD0 ; Toggle LED port
1$: iret
end |
Последний раз редактировалось Falconist; 13.04.2011 в 23:54.
|
|
|
|
08.02.2011, 09:48
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от niXto
|
И мне самому интересно стало - давайте напишем подпрограмму преобразования 4-байтного (32 бита) двоичного числа в двоично-десятичное. Эта подпрограмма будет многим полезна, и она дает максимальную нагрузку на ядро - тут и сдвиги, и арифметика, и косвенная адресация. В стек и пр. ничего не сохраняем - предполагаем что у нас ВСЕ регистры и ячейки ОЗУ свободны. Согласны?
|
Несколько упрощенный пример, заранее известно, что двоичное число не может быть больше 9999 (четыре десятичных цифры.
Код:
|
extern BCDcount, Count
;
; ** Bin2BCD -- подпрограмма преобразования двоичног значения
; в его эквивалентное двоично-десятичное представление
;
public Bin2BCD
Bin2BCD:
ldw x, Count ; Взять двоичное значение счетчика
ld a, #10 ; Вычислить значение младшей цифры
div x, a ;
ld BCDcount+0, a ; Запомнить цифру
ld a, #10 ; Вычислить значение следующей цифры
div x, a ;
ld BCDcount+1, a ; Запомнить цифру
ld a, #10 ; Вычислить значение следующей цифры
div x, a ;
ld BCDcount+2, a ; Запомнить цифру
ld a, xl ; Зваомнить старшую цифру
ld BCDcount+3, a ;
ret |
PS: Взял готовую п/п для 16-разрядного числа вместо 32-разрядного. Над последним не думал, не было необходимости. Но я думаю, что для данного случая пример наглядный. Или нет?
Последний раз редактировалось Falconist; 13.04.2011 в 23:54.
|
|
|
|
08.02.2011, 10:24
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Или да! ![Рот до ушей](images/smilies/icon_doushei.gif)
Приветствую, Bill!
|
|
|
|
08.02.2011, 10:38
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от EugVor
|
С трудом вспоминал AVR ассемблер, но в итоге:
Несложное задание для STM8:
Исходные условия: Три восьмиразрядные переменные A, B и C разместить в SRAM.
Задание: Как можно быстрее:
1. Установить весь PORTA на выход;
2. Установить бит 0 в PORTA;
3. Проинициализировать переменную A = 1;
4. Проинициализировать переменную B = 2;
5. Уйти в подпрограмму;
В подпрограмме:
6. Сложить переменные A и B, результат поместить в C;
7. Вернуться из подпрограммы.
8. Если установлен бит 0 в PORTA, сбросить его.
Исходный код для AVR:
Код:
|
************************************************** *************************
.include "m16def.inc"
.equ A= $70 ;Адрес переменной A в SRAM.
.equ B= $71 ;Адрес переменной B в SRAM.
.equ C= $72 ;Адрес переменной C в SRAM.
.def rA= r16 ;РОН для переменной A.
.def rB= r17 ;РОН для переменной B.
.def rC= r18 ;РОН для переменной C.
;_________________________________________________ ____________________________
.org 0 ;Вектор сброса
rjmp reset
;_________________________________________________ ____________________________
reset: ;Инициализация програмного стека.
ldi RA,low(ramend)
out spl,rA
ldi RA,high(ramend)
out sph,rA
ldi rA,$ff ;НАЧАЛО ОТСЧЁТА ЦИКЛОВ
out ddra,rA ;PortA на выход.
sbi porta,0 ;Установить PortA.0
ldi rA,$01
sts A,rA ;Переменная A=1;
ldi rA,$02
sts B,rA ;Переменная B=2;
rcall SubRoutine ;Уход в подпрограмму.
sbic pina,0 ;Пропустить следующую команду, если PortA.0 сброшен.
cbi porta,0 ;Сбросить PortA.0 - КОНЕЦ ОТСЧЁТА ЦИКЛОВ
SubRoutine: lds rA,A ;Загрузить переменную A в РОН rA.
lds rB,B ;Загрузить переменную B в РОН rB.
add rA,rB ;Сложить rB+rA, результат в rA.
sts C,rA ;Сохранить результат сложения в переменную С в SRAM.
ret ;Возврат из подпрограммы. |
ATmega16 справился за 26 тактов.
Начало замера - PortA физически установился на выход (сброс счётчика циклов в ноль перед командой out ddra,rA).
Окончание - PortA.0 сбросился в единицу.
Применены инструкции непосредственного сброcа, установки и проверки бита в порту, которых у STM8 возможно нет. Тогда это будет не очень честно. Просьба повторить для STM8.
Можно тоже самое или что-то посложнее написать на Си для IAR
|
Примерно то же самое для STM8
Код:
|
reset: ldw x, #ramend ;Инициализация програмного стека.
ldw sp, x
;НАЧАЛО ОТСЧЁТА ЦИКЛОВ
mov PA_DDR,#0xff ;PortA на выход.
bset PA_ODR,,#0 ;Установить PortA.0
mov _A, #1 ;Переменная A=1;
mov _B,#2 ;Переменная B=2;
rcall SubRoutine ;Уход в подпрограмму.
btjf PA_IDR,#0, 1$ ;Пропустить следующую команду, если PortA.0 сброшен.
bres PA_ODR,#0 ;Сбросить PortA.0 - КОНЕЦ ОТСЧЁТА ЦИКЛОВ
1$:
SubRoutine:
ld a,_A ;Загрузить переменную A в РОН rA.
add a, _B ;Сложить rB+rA, результат в rA.
ld _C,a ;Сохранить результат сложения в переменную С в SRAM.
ret ;Возврат из подпрограммы. |
Количество тактов - примерно 19-20
Последний раз редактировалось Falconist; 13.04.2011 в 23:53.
|
|
|
|
08.02.2011, 11:19
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от niXto
|
А еще у STM только 1 регистр косвенной адресации... Это тоже сильно раздувает код. Вот пример сложения двух 4-байтных массивов ODIN и DVA и помещения результата в массив SYMMA
Занимает 16 слов (32 байта) памяти и выполняется 55 циклов. Все-таки 3 регистра косвенной адресации - лучше чем 1...
кто-нибудь может портировать на STM?
|
Код:
|
clrw x ; 1/1
mov count, #4 ; 4/1
loop:
ld a, (ODIN, x) ; 3/1
add a, (DVA, x) ; 3/1
ld (SUMMA, x), a ; 3/1
incw x ; 1/1
dec count ; 1/1
jrne loop ; 2/2 |
В комментариях - длина команды (байт)/кол-во циклов
Последний раз редактировалось Falconist; 13.04.2011 в 23:53.
|
|
|
|
08.02.2011, 11:54
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kison
|
И вообще я тут подумал - тестировать то нужно на типичных задачах для 8-ми битного процессора. Например софтовый SPI какой нибудь - народ любит подключать экранчики от сотовых с таким интерфейсом.
|
Хм... Маленький пример
Код:
|
;
; ** OutDDS -- the subroutine outputs data to AD9834 device
;
; Input: - the 16-bit data in register X
; Output: - none
;
xdef OutDDS
OutDDS:
ld a, #16 ; Set bit counter
bres FSYN_BIT ; Output start
1$: sllw x ; Copy MSB to carry
bccm SDAT_BIT ; Output it to the port
bres SCLK_BIT ; Form a clock pulse
nop ;
bset SCLK_BIT ;
dec a ; Bump counter
jrne 1$ ; and loop if not done yet
bset FSYN_BIT ; Output end
ret |
Последний раз редактировалось Falconist; 13.04.2011 в 23:54.
|
|
|
|
08.02.2011, 12:29
|
|
Прописка
Регистрация: 15.11.2007
Адрес: СПБ
Сообщений: 214
Сказал спасибо: 37
Сказали Спасибо 42 раз(а) в 34 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kison
|
Он таки есть? Прикрепил бы кто нибудь.
Я эти файлы так и не нашел. Может это не к дискавери, а что нибудь типа стандартных либ от IAR?
|
Странно, что Вы не нашли... Вот они.
Учтите, что функции используют таймер4, если он занят - нужно делать по другому. И вместо ожидаемой delay_us там delay_10us
Последний раз редактировалось Falconist; 13.04.2011 в 23:53.
|
|
|
|
08.02.2011, 12:53
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от a-fisher
|
Странно, что Вы не нашли... Вот они.
|
Действительно странно. Сегодня утром я тоже попытался найти... не получилось, ни в Космике, ни в ИАРе.
|
|
|
|
08.02.2011, 13:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от a-fisher
|
Странно, что Вы не нашли.
|
Ну судя по #include "stm8l15x_clk.h" искать надо было в паке под 8L. Впрочем неинтересные функции - разрешение низкое, частота процессора только 16МГц. А может мне 2МГц надо. Или вообще 1МГц. Ну и ходовые задержки в 1-2-3мкс не получить. При чем все равно цикл ожидания, что с таймером, что просто в цикле вертеться. ИМХО бесполезные они.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:10.
|
|