Страница 19 из 103
Re: Програмирование pic на СИ.
Добавлено: Пт ноя 22, 2013 18:21:05
Roman Venom
вопрос следующий. есть функция
первая переменная лонг, вторая чар
);
когда значение лонга не более 8бит - всё отлично. когда больше - преобразование в строку происходит неправильно (что в общем, логично).
Посоветуйте как сделать строковую переменную объёмом лонг. Ну и чтобы
itoa не ругалась.
Re: Програмирование pic на СИ.
Добавлено: Пт ноя 22, 2013 18:39:32
dosikus
Roman Venom писал(а):вопрос следующий. есть функция
первая переменная лонг, вторая чар
);
когда значение лонга не более 8бит - всё отлично. когда больше - преобразование в строку происходит неправильно (что в общем, логично).
Посоветуйте как сделать строковую переменную объёмом лонг.
Вы сами то поняли что написали ?
Это что за бред?
значение лонга не более 8бит
строковую переменную объёмом лонг
itoa по стандарту передаются в качестве аргументов
int и указатель на массив
char .
Для особо одаренных - входные данные и буфер куда выводится результат. Есть вариации с основанием .
Выкладывайте реализацию Вашей
itoa , или если это встроенная в компилятор функция, указывайте компилятор.
В настройках компиля возможны опции ...
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 10:36:52
Roman Venom
Такс. Давайте по порядку.
Код: Выделить всё
long tmr1_value;
char tmr_lcd_string_value [10];
char *itoa (auto int value, auto char *s);
void main (void)
{itoa (tmr1_value, &tmr_lcd_string_value);}
Компилятор PICC18. Когда
tmr1_value<32767 - всё работает корректно. Когда больше -
tmr_lcd_string_value получает отрицательное значение.
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 10:50:05
dosikus
Roman Venom писал(а): Когда больше - tmr_lcd_string_value получает отрицательное значение.
А что хотим то ?
Аргумент у
itoa знаковый , превышаете максимальное допустимое положительное значение для
int и получаете знаковый результат .
Что в итоге хотим получить? Сколько знаков выводить и куда?
Написать свою реализацию или если думать лень использовать
sprintf ...
А для начала читать K&R , на тему типов данных .

ЗЫ и где реализация
itoa , не прототип а сама реализация ?
У меня нет PICC18 , ибо все последние продукты HI Tech один сплошной глюк ...
ЗЫ насколько помню
itoa в stdio не было .
Значит
itoa у вас самописная , и явно не вами.
Посему выкладывайте тело функции .
Скорей всего там достаточно сменить типы на беззнаковые...
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 11:10:50
Roman Venom
А что хотим то ?
Ну дык

Может, у кого есть модифицированная версия. Вот тело. Оно библиотечное.
Спойлер
Код: Выделить всё
; RCS Header $Id: itoa.asm,v 1.2 2009/02/17 08:16:03 guptan Exp $
#include "P18CXXX.INC"
#include "P18MACRO.INC"
; @name itoa
;The {\bf itoa} function converts the {\bf int} value {\bf value} to
;a radix 10 string representation, storing the resultant string into
;the location pointed to by {\bf s}.
; * The {\bf itoa} function is an MPLAB-Cxx extension to the ANSI required
;libraries and may not be present in other implementations.
;@param value value to convert
;@param s pointer to destination string object
;@return The {\bf itoa} function returns the value of {\bf s}.
;
; char *itoa (int value, char *s);
STDLIB CODE
itoa FUSTART
global itoa
extern itoBCD
; Proceedure: Use FSR2 for 's'. Call itoBCD to convert ASCII to BCD.
; Stack Offsets from top:
#define OffValue -4 ; Value
; Save FSR2 on the stack.
Stk2PushFromReg FSR2L
; Load FSR2 with the 's' pointer
Stk2CpyToReg -6,FSR2L
; Test for sign
movlw LOW(OffValue+1)
stkadj 1 ; added STKADJ PSEUDO-INSTRUCTION for stack analysis
movf PLUSW1, F, ACCESS ; sets N flag
bnn jTstSign1
; Value is negative. Store minus sign and negate Value
movlw '-'
movwf POSTINC2,ACCESS
Stk2Negate OffValue
jTstSign1:
; Convert number to BCD
; void itoBCD( int Value, unsigned char *pBCD)
; Allocate space for BCD[3} on stack
stkadj 1 ; added STKADJ PSEUDO-INSTRUCTION for stack analysis
movf POSTINC1, F, ACCESS ; make space for BCD
stkadj 1 ; added STKADJ PSEUDO-INSTRUCTION for stack analysis
movf POSTINC1, F, ACCESS ; make space for BCD
stkadj 1 ; added STKADJ PSEUDO-INSTRUCTION for stack analysis
movf POSTINC1, F, ACCESS ; make space for BCD
StkPushPtrToOffset -3 ; ptr to BCD
stkadj 1 ; added STKADJ PSEUDO-INSTRUCTION for stack analysis
Stk1CpyToReg OffValue-5,POSTINC1 ; push ValueL on stack
stkadj 1 ; added STKADJ PSEUDO-INSTRUCTION for stack analysis
Stk1CpyToReg OffValue-5,POSTINC1 ; push ValueH on stack
call itoBCD
; Set FSR0 == pBCD
StkSetPtrToOffset FSR0L,-7
call TstLower ; lower nibble
bnz jDo5
call TstUpper ; upper nibble
bnz jDo4
call TstLower ; lower nibble
bnz jDo3
call TstUpper ; upper nibble
bnz jDo2
bra jDo1 ; must have at least one digit
jDo5: call ProcLower ; lower nibble
jDo4: call ProcUpper ; upper nibble
jDo3: call ProcLower ; lower nibble
jDo2: call ProcUpper ; upper nibble
jDo1: call ProcLower ; lower nibble
clrf POSTINC2,ACCESS ; terminate string
; fixup stack
StkAddStackPtr -7
; Restore FSR2 from stack.
Stk2PopToReg FSR2L
; Set FSR0 to point to *s
StkSetPtrToOffset FSR0L,-4
; FIXME - temporary solution for change in calling convention
; return value in PRODL instead of *FSR0
movff POSTINC0, PRODL
movff INDF0, PRODH
FUEND
return
; Test for zero nibble
TstUpper swapf INDF0,W,ACCESS ; upper nibble
andlw 0x0F
return
; Test for zero nibble
TstLower movf INDF0,W,ACCESS ; lower nibble
andlw 0x0F
bnz jTstLowZ1
movf POSTINC0,F,ACCESS ; increment pointer
bsf STATUS,Z ; indicate zero nibble
jTstLowZ1 return
; Convert nibble to ASCII character
ProcUpper swapf INDF0,W,ACCESS ; upper nibble
andlw 0x0F
addlw 0x30 ; make into ASCII
movwf POSTINC2,ACCESS ; put it into string
return
; Convert nibble to ASCII character
ProcLower movf POSTINC0,W,ACCESS ; lower nibble
andlw 0x0F
addlw 0x30 ; make into ASCII
movwf POSTINC2,ACCESS ; put it into string
return
end
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 11:34:22
dosikus
Замени везде - и в прототипе и в определении .
на
Код: Выделить всё
char *itoa (unsigned int value, auto char *s);
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 12:20:46
Roman Venom
не, так не компилится. А копаться в чужом asm коде - можно голову сломать. (т.е. компилится, но результат не меняется, т.е. дело в коде всё же) Думаю, проще будет преобразовывать long частями.
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 12:28:18
Аlex
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 13:24:12
dosikus
Roman Venom писал(а):Думаю, проще будет преобразовывать long частями.
sprintf
Пока не сможешь свою реализацию воплотить...
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 15:38:52
Roman Venom
ltoa работает

Но с глюком небольшим
- вот так не работет, выводит белиберду.
а с "-" работает! В общем, это меня устраивает. Убрать "-" уже не проблема. Всем спасибо за внимание.
sprintf сразу отбросил, т.к. он сильно много кушает ресурсов.
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 15:50:49
Аlex
Roman Venom писал(а):sprintf сразу отбросил, т.к. он сильно много кушает ресурсов.
Ну правильно, он немного не для этих целей и помощнее любых
ltoa. Его назначение - форматировать строку.
ЗЫ: Я бы на Вашем месте лучше разобрался с глюком, чем с минусами заморачиваться. Проблема на 99.9% не в
ltoa.
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 17:55:38
dosikus
Аlex писал(а):Ну правильно, он немного не для этих целей и помощнее любых ltoa. Его назначение - форматировать строку.
А поподробней с этого места.
sprintf - форматный вывод чисел , а не форматирование строк.
С
помощнее любых ltoa
согласен , остальное надумки.
Аlex писал(а): Проблема на 99.9% не в ltoa.
Конечно не в ней , а в данной реализации - если отрабатывает только знаковые числа...
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 18:26:24
Аlex
dosikus писал(а):sprintf - форматный вывод чисел
Форматирование чисел - это, как раз, и есть всякие
itoa,
ftoa, ... А
sprintf - форматированный вывод строк, только не в поток (как
printf), а в буфер.
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 18:36:23
dosikus
Вынужден послать тебя на вики
http://ru.wikipedia.org/wiki/Printf
Дабы ускорить процесс -
printf и ее производные используются не только для вывода строк в поток , а
sprintf в буфер,
но и для вывода(преобразования) числовых переменных в строку .
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 18:39:17
Аlex
dosikus писал(а):но и для вывода(преобразования) числовых переменных в строку .
Вот он - волшебный союз "и"

Естественно,
sprintf может выводить в строку числа, этого никто не отрицал

Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 18:50:09
dosikus
Аlex писал(а):
Естественно,
sprintf может выводить в строку числа, этого никто не отрицал

Значится можно считать эти твои слова просто опиской ?
Аlex писал(а):Форматирование чисел - это, как раз, и есть всякие itoa, ftoa, ... А sprintf - форматированный вывод строк, только не в поток (как printf), а в буфер.
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 18:59:47
Аlex
Можно считать, что ты неправильно понял меня

Суть моего поста была в том, что
sprintf намного мощнее и, соответственно, включает в себя форматированный вывод чисел.
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 19:30:04
HHIMERA
Аlex... А не проще тебе признать свою ошибку, чем неумело выкручиваться???
ОФФТОП
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 19:53:03
Shershnyov
Есть ли у кого то пример на Си интервального таймера ? Или принцип реализации кнопок пуск/стоп и установка? Начал писать программу и завис на описании кнопок. И реализации остановки таймера при динамической индикации. Заранее спасибо!
Re: Програмирование pic на СИ.
Добавлено: Пн ноя 25, 2013 20:03:48
dosikus
Shershnyov писал(а): И реализации остановки таймера при динамической индикации.
О какой остановке таймера идет речь?
Что опрос кнопок, что динамика реализуется на установке флага в прерывании от таймера с последующим поллингом и сбросе сего флага в основном цикле .