Програмирование pic на СИ.

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

Re: Програмирование pic на СИ.

Сообщение Roman Venom »

вопрос следующий. есть функция

Код: Выделить всё

itoa (tmr1_value, &tmr_lcd_string_value);

первая переменная лонг, вторая чар

Код: Выделить всё

char *itoa (auto int value, auto char *s
);
когда значение лонга не более 8бит - всё отлично. когда больше - преобразование в строку происходит неправильно (что в общем, логично).

Посоветуйте как сделать строковую переменную объёмом лонг. Ну и чтобы itoa не ругалась.
Успех - императив!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

Roman Venom писал(а):вопрос следующий. есть функция

Код: Выделить всё

itoa (tmr1_value, &tmr_lcd_string_value);

первая переменная лонг, вторая чар

Код: Выделить всё

char *itoa (auto int value, auto char *s
);
когда значение лонга не более 8бит - всё отлично. когда больше - преобразование в строку происходит неправильно (что в общем, логично).

Посоветуйте как сделать строковую переменную объёмом лонг.


Вы сами то поняли что написали ?
Это что за бред?
значение лонга не более 8бит

строковую переменную объёмом лонг


itoa по стандарту передаются в качестве аргументов int и указатель на массив char .
Для особо одаренных - входные данные и буфер куда выводится результат. Есть вариации с основанием .
Выкладывайте реализацию Вашей itoa , или если это встроенная в компилятор функция, указывайте компилятор.
В настройках компиля возможны опции ...
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

Re: Програмирование pic на СИ.

Сообщение 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 получает отрицательное значение.
Успех - императив!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

Roman Venom писал(а): Когда больше - tmr_lcd_string_value получает отрицательное значение.


А что хотим то ? :)))
Аргумент у itoa знаковый , превышаете максимальное допустимое положительное значение для int и получаете знаковый результат .
Что в итоге хотим получить? Сколько знаков выводить и куда?
Написать свою реализацию или если думать лень использовать sprintf ... :)))

А для начала читать K&R , на тему типов данных . :)))
ЗЫ и где реализация itoa , не прототип а сама реализация ?
У меня нет PICC18 , ибо все последние продукты HI Tech один сплошной глюк ...

ЗЫ насколько помню itoa в stdio не было .
Значит itoa у вас самописная , и явно не вами.
Посему выкладывайте тело функции .
Скорей всего там достаточно сменить типы на беззнаковые...
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

Re: Програмирование pic на СИ.

Сообщение 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
Успех - императив!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

Замени везде - и в прототипе и в определении .

Код: Выделить всё

char *itoa (auto int value, auto char *s);


на

Код: Выделить всё

char *itoa (unsigned  int value, auto char *s);
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

Re: Програмирование pic на СИ.

Сообщение Roman Venom »

не, так не компилится. А копаться в чужом asm коде - можно голову сломать. (т.е. компилится, но результат не меняется, т.е. дело в коде всё же) Думаю, проще будет преобразовывать long частями.
Последний раз редактировалось Roman Venom Пн ноя 25, 2013 12:41:55, всего редактировалось 1 раз.
Успех - императив!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

Roman Venom писал(а):Думаю, проще будет преобразовывать long частями.


sprintf
Пока не сможешь свою реализацию воплотить...
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

Re: Програмирование pic на СИ.

Сообщение Roman Venom »

ltoa работает :idea: Но с глюком небольшим

Код: Выделить всё

char *ltoa (long value, char *s);


- вот так не работет, выводит белиберду.

Код: Выделить всё

char *ltoa (-long value, char *s);


а с "-" работает! В общем, это меня устраивает. Убрать "-" уже не проблема. Всем спасибо за внимание.

sprintf сразу отбросил, т.к. он сильно много кушает ресурсов.
Успех - императив!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Roman Venom писал(а):sprintf сразу отбросил, т.к. он сильно много кушает ресурсов.
Ну правильно, он немного не для этих целей и помощнее любых ltoa. Его назначение - форматировать строку.

ЗЫ: Я бы на Вашем месте лучше разобрался с глюком, чем с минусами заморачиваться. Проблема на 99.9% не в ltoa.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

Аlex писал(а):Ну правильно, он немного не для этих целей и помощнее любых ltoa. Его назначение - форматировать строку.


А поподробней с этого места. :)))
sprintf - форматный вывод чисел , а не форматирование строк.
С
помощнее любых ltoa
согласен , остальное надумки.


Аlex писал(а): Проблема на 99.9% не в ltoa.

Конечно не в ней , а в данной реализации - если отрабатывает только знаковые числа...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

dosikus писал(а):sprintf - форматный вывод чисел
Форматирование чисел - это, как раз, и есть всякие itoa, ftoa, ... А sprintf - форматированный вывод строк, только не в поток (как printf), а в буфер.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

Вынужден послать тебя на вики http://ru.wikipedia.org/wiki/Printf
Дабы ускорить процесс -
printf и ее производные используются не только для вывода строк в поток , а sprintf в буфер,
но и для вывода(преобразования) числовых переменных в строку .
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

dosikus писал(а):но и для вывода(преобразования) числовых переменных в строку .
Вот он - волшебный союз "и" :)
Естественно, sprintf может выводить в строку числа, этого никто не отрицал :)
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

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


Значится можно считать эти твои слова просто опиской ? :)))

Аlex писал(а):Форматирование чисел - это, как раз, и есть всякие itoa, ftoa, ... А sprintf - форматированный вывод строк, только не в поток (как printf), а в буфер.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Можно считать, что ты неправильно понял меня :))) Суть моего поста была в том, что sprintf намного мощнее и, соответственно, включает в себя форматированный вывод чисел.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Програмирование pic на СИ.

Сообщение HHIMERA »

Аlex... А не проще тебе признать свою ошибку, чем неумело выкручиваться??? :))

ОФФТОП
Последний раз редактировалось AlekseyEnergo Вт ноя 26, 2013 08:55:42, всего редактировалось 1 раз.
Причина: .
"Я не даю готовых решений, я заставляю думать!"(С)
Shershnyov
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Чт фев 07, 2013 10:46:46
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Shershnyov »

Есть ли у кого то пример на Си интервального таймера ? Или принцип реализации кнопок пуск/стоп и установка? Начал писать программу и завис на описании кнопок. И реализации остановки таймера при динамической индикации. Заранее спасибо!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

Shershnyov писал(а): И реализации остановки таймера при динамической индикации.


О какой остановке таймера идет речь? :)))
Что опрос кнопок, что динамика реализуется на установке флага в прерывании от таймера с последующим поллингом и сбросе сего флага в основном цикле .
Ответить

Вернуться в «PIC»