Сб ноя 13, 2010 11:04:10
Ой, так не годится. Я то думал, что Ц-шные исходники более читаемые и эти определения уже поставляются производителем кристаллов. Вот пользую микрочиповский MPASM или GNUшный GPUTILS - там подключаешь инклюд и всё там есть - и регистры и биты. И мне не надо ничего помнить (ну за исключением в какой странице памяти оно находится), просто пишу bsf intcon, 1<<GIE.EugenyAM писал(а):пишем:
- Код:
CLK_ECKR |= (1<<0);
либо просто:
- Код:
CLK_ECKR |= 0x01;
Сб ноя 13, 2010 12:26:47
Сб ноя 13, 2010 14:04:50
Уже обосновывал своё нежелание этим заниматься.Zheleznjakov писал(а):С другой стороны ни кто не мешает вам создать свои заголовочники, у них будет одна проблема актуальность (обновление).
Такая мысль была промелькнувши, но не хотелось делать кашу. А то будет так, что напишу своё, а точно то же оказывается написано рядом. Хотя, я несколько уже разочаровался. Каждый компилятор организует интерфейс по-своему. И не могу придумать к чему приткнуться. Но это первые шаги - всегда трудные.Zheleznjakov писал(а):Хотя используя заголовочники из либы конструкция получается вроед не такой уж и страшной:
Сб ноя 13, 2010 14:27:56
Сб ноя 13, 2010 19:32:41
Сб ноя 13, 2010 19:37:19
Zheleznjakov писал(а):Если вы вязли заголовочник из либы, то у вас будет один стил во всех компиляторах:
CLK->ECKCR = CLK_HSE_ON;
Сб ноя 13, 2010 20:08:01
#include "stm8s.h"
/* #define HSEEN 0 // бит регистра CLK_ECKR
#define SWEN 1 // бит регистра CLK_SWCR
*/
#define LED_OUT 0
int main()
{
long i;
CLK->ECKR |= CLK_ECKR_HSEEN; // Разрешаем работу генератора с внешним кварцем (HSEEN).
CLK->SWCR |= CLK_SWCR_SWEN; // Автопереключение источника Clock при неисправности HSE (SWEN).
CLK->SWR=0xB4; // Включаем clock от кварцевого генератора (HSE).
CLK->CKDIVR=0; // Делители частоты внутреннего и внешнего генератора на 1 (частота максимальная).
//Инициализируем GPIO. На Discovery светодиод подключен на PD0, активный уровень - 0
GPIOD->DDR |= (1<<LED_OUT); //PD0 - на вывод.
GPIOD->CR1 |= (0<<LED_OUT); //PD0 - открытый сток.
GPIOD->CR2 |= (0<<LED_OUT); //PD0 - ограничение скорости отключено.
while (1) {
GPIOD->ODR &= (0<<LED_OUT); //Включим светодиод
for(i=0;i<50000;i++); //Подождем...
GPIOD->ODR |= (1<<LED_OUT); //Выключим светодиод
for(i=0;i<50000;i++); //Подождем...
GPIOD->ODR &= (0<<LED_OUT); //Включим светодиод
for(i=0;i<50000;i++); //Подождем...
GPIOD->ODR |= (1<<LED_OUT); //Выключим светодиод
for(i=0;i<200000;i++); //Подождем...
};
return 0;
Сб ноя 13, 2010 20:30:48
Сб ноя 13, 2010 20:56:59
GPIOD->ODR &= (0<<LED_OUT); //Включим светодиод
GPIOD->ODR &= ~(1<<LED_OUT); //Включим светодиод
Сб дек 04, 2010 12:11:18
Сб дек 04, 2010 20:50:58
Сб дек 04, 2010 20:56:56
DrWatson писал(а):Пошаговая трассировка? да 2 такта, т.к. конвеер походу при пошаговом выполнении сбрасывается.
А, если верить моим экспериментам, число тактов на команду соответствует даташиту (для некоторых методов адресации может быть (и есть) больше).
Сб дек 04, 2010 21:15:28
Сб дек 04, 2010 22:24:19
DrWatson писал(а):Хм, у меня в даташите 1 такт на эти команды. Rev2 от 5-Jun-2008
Один такт они занимают, просто при пошаговом прогоне с отладчиком, конвеер команд сбрасывается, поэтому добавляется 1 такт на чтение очередной команды, а при нормальной работе сколько написано тактов в даташите, столько они и занимают времени на выполнение.
main.c:37 LED1=~LED1;
0x8109 BCPL _PB_ODR,#1
0x810d JRT 0x8109
main.c:38 LED1=1;
0x8109 BSET _PB_ODR,#1
main.c:39 LED1=0;
0x810d BRES _PB_ODR,#1
0x8111 JRT 0x8109
Сб дек 04, 2010 22:36:04
Сб дек 04, 2010 22:52:36
DrWatson писал(а):При выполнении переходов конвейер сбрасывается, для чистоты эксперимента попробуй увеличить число BCPL, пар BSET/BRES хотя бы до десятка, тогда можно будет с уверенностью говорить об опечатке в даташите.
dosikus писал(а):Может и ошибаюсь ( хорошо бы) .
Сб дек 04, 2010 23:20:19
unsigned char A, B, C;
main()
{
PD_DDR|=1;
PD_CR1|=1;
PD_CR2|=1;
TIM1_PSCRH=0;
TIM1_PSCRL=0;
TIM1_ARRH=0xFF;
TIM1_ARRL=0xFF;
TIM1_CR1|=1;
while(1)
{
#asm
bcpl _PD_ODR, #0
bcpl _A, #2
bcpl _B, #1
bcpl _C, #3
bcpl _PD_ODR, #0
bcpl _A, #2
bcpl _B, #1
bcpl _C, #3
bcpl _PD_ODR, #0
bcpl _A, #2
bcpl _B, #1
bcpl _C, #3
bcpl _PD_ODR, #0
bcpl _A, #2
bcpl _B, #1
bcpl _C, #3
bcpl _PD_ODR, #0
bcpl _A, #2
bcpl _B, #1
bcpl _C, #3
#endasm
}
while (1);
}
Вс дек 05, 2010 06:29:51
Вс дек 05, 2010 07:33:20
Вс дек 05, 2010 12:18:41
inc var1 ; 2 такта
ld a,#23 ; 1-1 такт
inc var2 ; 2 такта
dec a ; 1-1 такт
; Всего 4 такта
inc var1 ; 2 такта
inc var2 ; 2 такта
dec a ; 1-1 такт
; Всего 4 такта