10.02.2011, 03:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от luxin
|
Если нет, то какой тип присваивается вашей переменной по умолчанию?
|
int - 16 бит. У меня возврат uint32_t прекрасно работает.
|
|
|
|
10.02.2011, 04:25
|
|
Частый гость
Регистрация: 29.04.2007
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: STM8(S/L), первые впечатления
Сообщение от kison
|
int - 16 бит. У меня возврат uint32_t прекрасно работает.
|
А никто и не говорит, что плохо работают.
Человек писал:
Сообщение от qwerky
|
нет, после вызова функции сразу вызывается c_itolx, то есть слово в Х расширяется в long, старшие 16бит пропадают.
|
т.е. результат получается 16р.(старшие уже потеряны разряды), а потом просто происходит преобразование типов. Поэтому спросил какой тип по умолчанию b32.
|
|
|
|
10.02.2011, 09:50
|
|
Вид на жительство
Регистрация: 21.11.2009
Сообщений: 342
Сказал спасибо: 4
Сказали Спасибо 149 раз(а) в 66 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Цитата:
|
какой тип по умолчанию b32
|
извиняюсь, пропустил
static volatile unsigned long b32;
Цитата:
|
У меня возврат uint32_t прекрасно работает.
|
а где там stdint.h ? я не нашел
|
|
|
|
10.02.2011, 13:05
|
|
Вид на жительство
Регистрация: 21.11.2009
Сообщений: 342
Сказал спасибо: 4
Сказали Спасибо 149 раз(а) в 66 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
чудеса, немного перегруппировал вызов функций, и результат в отладчике получился правильный...
32-битный BIN-BCD (сдвиг + коррекция):
Код:
|
U32 bin2bcd_U32(U32 bin) {
#asm
clrw X ; result in stack
pushw X
pushw X
push #32 ; bit counter
bin2bcd_U32_01: ; bit shift loop
; BCD correction
add SP,#5 ; SP points to result MSB
ldw X,#4 ; result byte counter
bin2bcd_U32_02:
ld A,#0x33
add A,(0,SP)
bcp A,#0x08
jrne bin2bcd_U32_03
sub A,#0x03
bin2bcd_U32_03:
bcp A,#0x80
jrne bin2bcd_U32_04
sub A,#0x30
bin2bcd_U32_04:
push A
decw X ; decrement byte counter
jrne bin2bcd_U32_02
sub SP,#1
; shift bits
sll (11,SP) ; bin
rlc (10,SP)
rlc (9,SP)
rlc (8,SP)
rlc (5,SP) ; bcd
rlc (4,SP)
rlc (3,SP)
rlc (2,SP)
dec (1,SP) ; decrement bit counter
jrne bin2bcd_U32_01
pop A
popw X ; copy result to c_lreg
ldw c_lreg,X
popw X
ldw c_lreg+2,X
#endasm
} |
Последний раз редактировалось qwerky; 10.02.2011 в 13:13.
|
|
|
|
10.02.2011, 15:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от qwerky
|
а где там stdint.h ? я не нашел
|
Нету. Пришлось сделать.
|
|
|
|
10.02.2011, 16:26
|
|
Частый гость
Регистрация: 29.04.2007
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: STM8(S/L), первые впечатления
Сообщение от qwerky
|
U32 bin2bcd_U32(U32 bin) {
#asm clrw X ; result in stack
pushw X
pushw X
push #32 ; bit counter
bin2bcd_U32_01: ; bit shift loop ; BCD correction
add SP,#5 ; SP points to result MSB
|
А не стремно так делать? Я понимаю, что со стеком очень хорошо работает данный контроллер, но ...
Как вы думаете, как Ваша функция выполнится, если произойдет вызов прерывания?
|
|
|
|
10.02.2011, 16:28
|
|
Вид на жительство
Регистрация: 21.11.2009
Сообщений: 342
Сказал спасибо: 4
Сказали Спасибо 149 раз(а) в 66 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Цитата:
|
Как вы думаете, как Ваша функция выполнится, если произойдет вызов прерывания?
|
прерывание должно сохранить состояние регистров и стека, нет ?
а, понял. прерывание может затереть данные на вершине стека.
Последний раз редактировалось qwerky; 10.02.2011 в 16:35.
|
|
|
|
10.02.2011, 16:41
|
|
Частый гость
Регистрация: 29.04.2007
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: STM8(S/L), первые впечатления
Сообщение от qwerky
|
а, понял. прерывание может затереть данные на вершине стека.
|
Молодец
Тоже произойдет, если вы захотите внутри добавить вызов какой-то функции. Возможно была у Вас проблема подобного типа
Последний раз редактировалось luxin; 10.02.2011 в 16:45.
|
|
|
|
10.02.2011, 19:24
|
|
Вид на жительство
Регистрация: 21.11.2009
Сообщений: 342
Сказал спасибо: 4
Сказали Спасибо 149 раз(а) в 66 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
модификация:
Код:
|
U32 bin2bcd_U32(U32 bin) {
#asm
clrw X ; result in stack
pushw X
pushw X
ldw X,SP
push #32 ; bit counter
bin2bcd_U32_01:
push #4 ; byte counter
; BCD correction
bin2bcd_U32_02:
ld A,#0x33
add A,(1,X)
bcp A,#0x08
jrne bin2bcd_U32_03
sub A,#0x03
bin2bcd_U32_03:
bcp A,#0x80
jrne bin2bcd_U32_04
sub A,#0x30
bin2bcd_U32_04:
ld (1,X),A
incw X
dec (1,SP)
jrne bin2bcd_U32_02
subw X,#4
pop A
; shift bits
sll (11,SP) ; bin
rlc (10,SP)
rlc (9,SP)
rlc (8,SP)
rlc (5,SP) ; bcd
rlc (4,SP)
rlc (3,SP)
rlc (2,SP)
dec (1,SP)
jrne bin2bcd_U32_01
pop A
popw X ; copy result to c_lreg
ldw c_lreg,X
popw X
ldw c_lreg+2,X
#endasm
} |
p.s.достали глюки отладчика - не всегда правильно отображает регистры и память
Последний раз редактировалось qwerky; 10.02.2011 в 19:26.
|
|
|
|
10.02.2011, 19:58
|
|
Частый гость
Регистрация: 29.04.2007
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: STM8(S/L), первые впечатления
Сообщение от qwerky
|
p.s.достали глюки отладчика - не всегда правильно отображает регистры и память
|
Я тоже заметил. Пробовал Raisonance - были глюки. Попробовал STVD - тоже. Я как понял причина в том, что локальные переменные находятся в стеке. Когда SP изменяется, то и локальные переменные некорректно отображаются
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:22.
|
|