| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| Ringo42 
 
 
 Joined: 07 May 2004
 Posts: 263
 
 
 
			    
 
 | 
			
				| Why does this code stop |  
				|  Posted: Wed Feb 25, 2015 12:32 pm |   |  
				| 
 |  
				| Can someone please look at this and tell me why it stops after line 71. On the output I get the initial stuff then I get to "RSSI 3" and then nothing.
 If I comment out lines 75 to 85 then it runs. What is killing it there?
 
 Thanks
 Ringo
 
 
  	  | Code: |  	  | #include "18f452.h"
 #fuses hs,WDT8,noprotect,put,nolvp
 #device adc=10
 #device HIGH_INTS=TRUE
 #use delay(clock=20000000,restart_wdt)
 #include <stdlib.h>
 
 #define LED1_PIN    PIN_B6
 #define LED2_PIN    PIN_B7
 #define TX_PIN      PIN_C6
 #define RX_PIN      PIN_C7
 #define BAUD_RATE 19200
 #define Mux_sel     PIN_E2
 
 #use rs232(baud=BAUD_RATE,xmit=TX_PIN,rcv=RX_PIN,errors,bits=8,parity=N,restart_wdt)
 ///Macros
 #define LED1_ON output_high(LED1_PIN)
 #define LED2_ON output_high(LED2_PIN)
 #define LED1_OFF output_low(LED1_PIN)
 #define LED2_OFF output_low(LED2_PIN)
 
 
 void CheckRssi();
 void InitPic();
 void main()
 {
 setup_wdt(WDT_ON);
 setup_timer_0(RTCC_INTERNAL);
 
 printf("ABC\r\n   >");
 
 InitPic();
 printf("\r\n\nMotherboard RX, firmware 3n   >\r\n");
 printf("\r\n>");
 
 set_adc_channel( 5 );
 delay_ms(1);
 while (1)
 {
 CheckRssi();
 restart_wdt();
 }
 }
 
 void CheckRssi()
 {
 int channel;
 int RSSI=0;
 int RSSIcounter=0;
 set_adc_channel( 5 );
 delay_ms(1);
 RSSI = Read_ADC();
 delay_ms(100);
 printf("RSSI!!!!!!!!!!!! \r\n");
 
 if(RSSI >100) // If radio is detected, but up counter a bunch
 {
 RSSIcounter+=10;
 output_high(PIN_E1);
 }
 else
 {
 RSSIcounter-=1;//else slowly count down to make sure radio is really off
 output_low(PIN_E1);
 }
 printf("RSSI 2\r\n");
 if(RSSIcounter >244)
 RSSIcounter=244;
 if(RSSIcounter <2)
 RSSIcounter=2;
 printf("RSSI 3 \r\n");
 
 
 
 if(RSSIcounter > 30)//if the radio is seen a few times
 {
 output_high(MUX_Sel);//radio
 output_high(PIN_B2);
 }
 
 else
 {
 output_low(MUX_sel);//usb
 output_low(PIN_B2);
 }
 
 printf("RSSI 4 \r\n");
 
 printf("RSSI= %u    RSSIcounter= %u \r\n",RSSI,RSSIcounter);
 
 }
 
 void InitPic()
 {
 short int dummy_variable;
 setup_adc_ports(All_ANALOG);
 setup_adc( ADC_CLOCK_INTERNAL );
 setup_spi(FALSE);
 setup_psp(PSP_DISABLED);
 setup_timer_2(T2_DIV_BY_4,128,16);// 18.6 khz 0-512 int every 8ms //
 setup_timer_0(RTCC_Internal|RTCC_div_2);
 
 //    enable_interrupts(INT_RDA);    // Serial Data Available IRQ
 enable_interrupts(INT_TIMER2); // Timer 2 Overflow
 //    enable_interrupts(global);     // Enable IRQs
 
 dummy_variable = input(PIN_E0);
 output_low(PIN_E1);
 output_low(PIN_B2);
 output_low(PIN_E2);//mux_sel
 
 input(pin_a4);//RTS
 port_b_pullups(false);
 }
 
 | 
 _________________
 Ringo Davis
 |  |  
		|  |  
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9588
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 1:04 pm |   |  
				| 
 |  
				| first..... 
 
  	  | Quote: |  	  | If I comment out lines 75 to 85 then it runs. What is killing it there? | 
 We have NO idea what  these lines are, without seeing the actual listing ( filename.lst)
 
 
 2nd. You have the WDT enabled which during the 'debugging' phase of code creation could( will) cause no end of problems.
 
 3rd. You should post compiler version..might be a bug...
 
 4th. RSSI looks like a 'radio peripheral' is connected to the PIC. Now if the PIC is running off 5 volts and the 'radio' is running off 3 volts, that can be a HUGE issue.
 
 5th...
 setup_adc( ADC_CLOCK_INTERNAL );
 
 best check the datasheet, adc section, at 20MHz this won't be a valid value..
 
 It'd be nice to see a schematic or more info as to what the hardware is(mfr/model/etc.)
 
 The more info you give us, the faster/better the responses.
 
 Jay
 |  |  
		|  |  
		| Ringo42 
 
 
 Joined: 07 May 2004
 Posts: 263
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 1:32 pm |   |  
				| 
 |  
				| Thanks for the help, I narrowed it down to the line
 //output_high(MUX_Sel);//radio
 
 with it commented out it runs.
 
 The .lst file is below.
 
 I'll disable watchdog for now
 
 Compiler Version 4.007
 
 I'll change the ADc to ADC_CLOCK_DIV_32. It is listed as have a max freq of 20mhz. In the pic datasheet there is a div/64 but I dont see that option in the CCS manual, should I use something else?
 
 You are correct the radio is 3.3V and the pic is 5V, but the only problem I see with this is not getting full range correct? The Rssi is a PWM value that I filter into an analog signal.
 
 I can send a schematic, but don't see how to attach it here. Am I missing an attachment  button somewhere?
 
 
 
 
 
 
 [code:1:392b684fcf]
 CCS PCH C Compiler, Version 4.007, 34836               25-Feb-15 13:42
 
 Filename: C:\Users\Hardware\Dropbox\21st century\Firmware\21_Rx_V3N_rssi_test.lst
 
 ROM used: 884 bytes (3%)
 Largest free fragment is 31884
 RAM used: 14 (1%) at main() level
 23 (1%) worst case
 Stack:    3 locations
 
 *
 0000:  GOTO   029C
 .................... #include "18f452.h"
 .................... //////// Standard Header file for the PIC18F452 device ////////////////
 .................... #device PIC18F452
 .................... #list
 ....................
 .................... #fuses hs,WDT8,noprotect,put,nolvp
 .................... #device adc=10
 .................... #device HIGH_INTS=TRUE
 .................... #use delay(clock=20000000,restart_wdt)
 *
 00F4:  CLRF   FEA
 00F6:  MOVLW  0F
 00F8:  MOVWF  FE9
 00FA:  MOVF   FEF,W
 00FC:  BZ    0120
 00FE:  MOVLW  06
 0100:  MOVWF  01
 0102:  MOVLW  BF
 0104:  MOVWF  00
 0106:  CLRWDT
 0108:  DECFSZ 00,F
 010A:  BRA    0106
 010C:  DECFSZ 01,F
 010E:  BRA    0102
 0110:  MOVLW  7A
 0112:  MOVWF  00
 0114:  DECFSZ 00,F
 0116:  BRA    0114
 0118:  BRA    011A
 011A:  CLRWDT
 011C:  DECFSZ FEF,F
 011E:  BRA    00FE
 0120:  RETLW  00
 .................... #include <stdlib.h>
 .................... ///////////////////////////////////////////////////////////////////////////
 .................... ////        (C) Copyright 1996,2003 Custom Computer Services           ////
 .................... //// This source code may only be used by licensed users of the CCS C  ////
 .................... //// compiler.  This source code may only be distributed to other      ////
 .................... //// licensed users of the CCS C compiler.  No other use, reproduction ////
 .................... //// or distribution is permitted without written permission.          ////
 .................... //// Derivative programs created using this software in object code    ////
 .................... //// form are not restricted in any way.                               ////
 .................... ///////////////////////////////////////////////////////////////////////////
 ....................
 .................... #ifndef _STDLIB
 .................... #define _STDLIB
 ....................
 .................... //---------------------------------------------------------------------------
 .................... // Definitions and types
 .................... //---------------------------------------------------------------------------
 ....................
 .................... #ifndef RAND_MAX
 .................... #define RAND_MAX  32767    // The value of which is the maximum value
 ....................                            // ... returned by the rand function
 .................... #endif
 ....................
 .................... typedef struct {
 ....................    signed int quot;
 ....................    signed int rem;
 .................... } div_t;
 ....................
 .................... typedef struct {
 ....................    signed long quot;
 ....................    signed long rem;
 .................... } ldiv_t;
 ....................
 .................... #include <stddef.h>
 .................... ///////////////////////////////////////////////////////////////////////////
 .................... ////        (C) Copyright 1996,2003 Custom Computer Services           ////
 .................... //// This source code may only be used by licensed users of the CCS C  ////
 .................... //// compiler.  This source code may only be distributed to other      ////
 .................... //// licensed users of the CCS C compiler.  No other use, reproduction ////
 .................... //// or distribution is permitted without written permission.          ////
 .................... //// Derivative programs created using this software in object code    ////
 .................... //// form are not restricted in any way.                               ////
 .................... ///////////////////////////////////////////////////////////////////////////
 ....................
 .................... #ifndef _STDDEF
 ....................
 .................... #define _STDDEF
 ....................
 .................... #if sizeof(int *)==1
 .................... #define ptrdiff_t int
 .................... #else
 .................... #define ptrdiff_t long
 .................... #endif
 ....................
 .................... #define size_t int
 .................... #define wchar_t char
 .................... #define NULL 0
 ....................
 .................... #define offsetof(s,f) (offsetofbit(s,f)/8)
 ....................
 .................... #endif
 ....................
 ....................
 .................... //---------------------------------------------------------------------------
 .................... // String conversion functions
 .................... //---------------------------------------------------------------------------
 ....................
 .................... /* Standard template: float atof(char * s)
 ....................  * converts the initial portion of the string s to a float.
 ....................  * returns the converted value if any, 0 otherwise
 ....................  */
 .................... float atof(char * s);
 ....................
 .................... /* Standard template: float atoe(char * s)
 ....................  * converts the initial portion of the string s to a float.
 ....................  * returns the converted value if any, 0 otherwise
 ....................  * also handles E format numbers
 ....................  */
 .................... float atoe(char * s);
 ....................
 .................... /* Standard template: signed int  atoi(char * s)
 ....................  * converts the initial portion of the string s to a signed int
 ....................  * returns the converted value if any, 0 otherwise
 ....................  */
 .................... signed int atoi(char *s);
 ....................
 .................... /* Syntax: signed int32  atoi32(char * s)
 ....................    converts the initial portion of the string s to a signed int32
 ....................    returns the converted value if any, 0 otherwise*/
 .................... signed int32 atoi32(char *s);
 ....................
 .................... /* Syntax: char *  itoa(signed int32 num, int8 base, char * s)
 ....................    converts the signed int32 to a string and
 ....................    returns the converted value if any, 0 otherwise*/
 .................... char * itoa(signed int32 num, int8 base, char * s);
 ....................
 .................... /* Standard template: signed long  atol(char * s)
 ....................  * converts the initial portion of the string s to a signed long
 ....................  * returns the converted value if any, 0 otherwise
 ....................  */
 .................... signed long atol(char *s);
 ....................
 .................... /* Standard template: float strtol(char * s,char *endptr)
 ....................  * converts the initial portion of the string s to a float
 ....................  * returns the converted value if any, 0 otherwise
 ....................  * the final string is returned in the endptr, if endptr is not null
 ....................  */
 .................... float strtod(char *s,char *endptr);
 ....................
 .................... /* Standard template: long strtoul(char * s,char *endptr,signed int base)
 ....................  * converts the initial portion of the string s, represented as an
 ....................  * integral value of radix base  to a signed long.
 ....................  * Returns the converted value if any, 0 otherwise
 ....................  * the final string is returned in the endptr, if endptr is not null
 ....................  */
 .................... signed long strtol(char *s,char *endptr,signed int base);
 ....................
 .................... /* Standard template: long strtoul(char * s,char *endptr,signed int base)
 ....................  * converts the initial portion of the string s, represented as an
 ....................  * integral value of radix base to a unsigned long.
 ....................  * returns the converted value if any, 0 otherwise
 ....................  * the final string is returned in the endptr, if endptr is not null
 ....................  */
 .................... long strtoul(char *s,char *endptr,signed int base);
 ....................
 .................... //---------------------------------------------------------------------------
 .................... // Pseudo-random sequence generation functions
 .................... //---------------------------------------------------------------------------
 ....................
 .................... /* The rand function computes a sequence of pseudo-random integers in
 ....................  * the range 0 to RAND_MAX
 ....................  *
 ....................  * Parameters:
 ....................  *       (none)
 ....................  *
 ....................  * Returns:
 ....................  *       The pseudo-random integer
 ....................  */
 .................... long rand(void);
 ....................
 .................... /* The srand function uses the argument as a seed for a new sequence of
 ....................  * pseudo-random numbers to be returned by subsequent calls to rand.
 ....................  *
 ....................  * Parameters:
 ....................  *       [in] seed: The seed value to start from. You might need to pass
 ....................  *
 ....................  * Returns:
 ....................  *       (none)
 ....................  *
 ....................  * Remarks
 ....................  *          The srand function sets the starting point for generating
 ....................  *       a series of pseudorandom integers. To reinitialize the
 ....................  *       generator, use 1 as the seed argument. Any other value for
 ....................  *       seed sets the generator to a random starting point. rand
 ....................  *       retrieves the pseudorandom numbers that are generated.
 ....................  *       Calling rand before any call to srand generates the same
 ....................  *       sequence as calling srand with seed passed as 1.
 ....................  *          Usually, you need to pass a time here from outer source
 ....................  *       so that the numbers will be different every time you run.
 ....................  */
 .................... void srand(unsigned int32 seed);
 ....................
 .................... //---------------------------------------------------------------------------
 .................... // Memory management functions
 .................... //---------------------------------------------------------------------------
 ....................
 .................... // Comming soon
 ....................
 .................... //---------------------------------------------------------------------------
 .................... // Communication with the environment
 .................... //---------------------------------------------------------------------------
 ....................
 .................... /* The function returns 0 always
 ....................  */
 .................... signed int system(char *string);
 ....................
 .................... //---------------------------------------------------------------------------
 .................... // Searching and sorting utilities
 .................... //---------------------------------------------------------------------------
 ....................
 .................... /* Performs a binary search of a sorted array..
 ....................  *
 ....................  * Parameters:
 ....................  *       [in] key: Object to search for
 ....................  *       [in] base: Pointer to base of search data
 ....................  *       [in] num: Number of elements
 ....................  *       [in] width: Width of elements
 ....................  *       [in] compare: Function that compares two elements
 ....................  *
 ....................  * Returns:
 ....................  *       bsearch returns a pointer to an occurrence of key in the array pointed
 ....................  *       to by base. If key is not found, the function returns NULL. If the
 ....................  *       array is not in order or contains duplicate records with identical keys,
 ....................  *       the result is unpredictable.
 ....................  */
 .................... //void *bsearch(const void *key, const void *base, size_t num, size_t width,
 .................... //              int (*compare)(const void *, const void *));
 ....................
 .................... /* Performs the shell-metzner sort (not the quick sort algorithm). The contents
 ....................  * of the array are sorted into ascending order according to a comparison
 ....................  * function pointed to by compar.
 ....................  *
 ....................  * Parameters:
 ....................  *       [in] base: Pointer to base of search data
 ....................  *       [in] num: Number of elements
 ....................  *       [in] width: Width of elements
 ....................  *       [in] compare: Function that compares two elements
 ....................  *
 ....................  * Returns:
 ....................  *       (none)
 ....................  */
 .................... //void *qsort(const void *base, size_t num, size_t width,
 .................... //              int (*compare)(const void *, const void *));
 ....................
 .................... //---------------------------------------------------------------------------
 .................... // Integer arithmetic functions
 .................... //---------------------------------------------------------------------------
 ....................
 .................... #define labs abs
 ....................
 .................... div_t div(signed int numer,signed int denom);
 .................... ldiv_t ldiv(signed long numer,signed long denom);
 ....................
 .................... //---------------------------------------------------------------------------
 .................... // Multibyte character functions
 .................... //---------------------------------------------------------------------------
 ....................
 .................... // Not supported
 ....................
 .................... //---------------------------------------------------------------------------
 .................... // Multibyte string functions
 .................... //---------------------------------------------------------------------------
 ....................
 .................... // Not supported
 ....................
 ....................
 .................... //---------------------------------------------------------------------------
 .................... // Internal implementation
 .................... //---------------------------------------------------------------------------
 ....................
 .................... #include <stddef.h>
 .................... ///////////////////////////////////////////////////////////////////////////
 .................... ////        (C) Copyright 1996,2003 Custom Computer Services           ////
 .................... //// This source code may only be used by licensed users of the CCS C  ////
 .................... //// compiler.  This source code may only be distributed to other      ////
 .................... //// licensed users of the CCS C compiler.  No other use, reproduction ////
 .................... //// or distribution is permitted without written permission.          ////
 .................... //// Derivative programs created using this software in object code    ////
 .................... //// form are not restricted in any way.                               ////
 .................... ///////////////////////////////////////////////////////////////////////////
 ....................
 .................... #ifndef _STDDEF
 ....................
 .................... #define _STDDEF
 ....................
 .................... #if sizeof(int *)==1
 .................... #define ptrdiff_t int
 .................... #else
 .................... #define ptrdiff_t long
 .................... #endif
 ....................
 .................... #define size_t int
 .................... #define wchar_t char
 .................... #define NULL 0
 ....................
 .................... #define offsetof(s,f) (offsetofbit(s,f)/8)
 ....................
 .................... #endif
 ....................
 .................... #include <string.h>
 .................... ////////////////////////////////////////////////////////////////////////////
 .................... ////        (C) Copyright 1996,2003 Custom Computer Services            ////
 .................... //// This source code may only be used by licensed users of the CCS C   ////
 .................... //// compiler.  This source code may only be distributed to other       ////
 .................... //// licensed users of the CCS C compiler.  No other use, reproduction  ////
 .................... //// or distribution is permitted without written permission.           ////
 .................... //// Derivative programs created using this software in object code     ////
 .................... //// form are not restricted in any way.                                ////
 .................... ////////////////////////////////////////////////////////////////////////////
 ....................
 .................... #ifndef _STRING
 .................... #define _STRING
 .................... #include <stddef.h>
 .................... ///////////////////////////////////////////////////////////////////////////
 .................... ////        (C) Copyright 1996,2003 Custom Computer Services           ////
 .................... //// This source code may only be used by licensed users of the CCS C  ////
 .................... //// compiler.  This source code may only be distributed to other      ////
 .................... //// licensed users of the CCS C compiler.  No other use, reproduction ////
 .................... //// or distribution is permitted without written permission.          ////
 .................... //// Derivative programs created using this software in object code    ////
 .................... //// form are not restricted in any way.                               ////
 .................... ///////////////////////////////////////////////////////////////////////////
 ....................
 .................... #ifndef _STDDEF
 ....................
 .................... #define _STDDEF
 ....................
 .................... #if sizeof(int *)==1
 .................... #define ptrdiff_t int
 .................... #else
 .................... #define ptrdiff_t long
 .................... #endif
 ....................
 .................... #define size_t int
 .................... #define wchar_t char
 .................... #define NULL 0
 ....................
 .................... #define offsetof(s,f) (offsetofbit(s,f)/8)
 ....................
 .................... #endif
 ....................
 .................... #include <ctype.h>
 .................... ////////////////////////////////////////////////////////////////////////////
 .................... ////        (C) Copyright 1996,2003 Custom Computer Services            ////
 .................... //// This source code may only be used by licensed users of the CCS C   ////
 .................... //// compiler.  This source code may only be distributed to other       ////
 .................... //// licensed users of the CCS C compiler.  No other use, reproduction  ////
 .................... //// or distribution is permitted without written permission.           ////
 .................... //// Derivative programs created using this software in object code     ////
 .................... //// form are not restricted in any way.                                ////
 .................... ////////////////////////////////////////////////////////////////////////////
 ....................
 .................... #ifndef _CTYPE
 .................... #define _CTYPE
 ....................
 .................... #define islower(x)  isamong(x,"abcdefghijklmnopqrstuvwxyz")
 .................... #define isupper(x)  isamong(x,"ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 .................... #define isalnum(x)  isamong(x,"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
 .................... #define isalpha(x)  isamong(x,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
 .................... #define isdigit(x)  isamong(x,"0123456789")
 .................... #define isspace(x)  (x==' ')
 .................... #define isxdigit(x) isamong(x,"0123456789ABCDEFabcdef")
 .................... #define iscntrl(x)  (x<' ')
 .................... #define isprint(x)  (x>=' ')
 .................... #define isgraph(x)  (x>' ')
 .................... #define ispunct(x)  ((x>' ')&&!isalnum(x))
 ....................
 .................... #endif
 ....................
 ....................
 ....................
 ....................
 ....................
 .................... //////////////////////////////////////////////
 .................... //// Uncomment the following define to    ////
 .................... //// allow some functions to use a        ////
 .................... //// quicker algorithm, but use more ROM  ////
 .................... ////                                      ////
 .................... //// #define FASTER_BUT_MORE_ROM          ////
 .................... //////////////////////////////////////////////
 ....................
 ....................
 ....................
 .................... /*Copying functions*/
 .................... /* standard template:
 ....................    void *memmove(void *s1, void *s2, size_t n).
 ....................    Copies max of n characters safely (not following ending '\0')
 ....................    from s2 in s1; if s2 has less than n characters, appends 0 */
 ....................
 .................... char *memmove(void *s1,char *s2,size_t n)
 .................... {
 ....................    char *sc1;
 ....................    char *sc2;
 ....................    sc1=s1;
 ....................    sc2=s2;
 ....................    if(sc2<sc1 && sc1 <sc2 +n)
 ....................       for(sc1+=n,sc2+=n;0<n;--n)
 ....................          *--sc1=*--sc2;
 ....................    else
 ....................       for(;0<n;--n)
 ....................          *sc1++=*sc2++;
 ....................   return s1;
 ....................   }
 ....................
 .................... /* compiler ignored the name 'strcpy()'; perhaps, it's reserved?
 ....................    Standard template: char *strcpy(char *s1, const char *s2)
 ....................    copies the string s2 including the null character to s1*/
 ....................
 .................... char *strcopy(char *s1, char *s2)
 .................... {
 ....................   char *s;
 ....................
 ....................   for (s = s1; *s2 != 0; s++, s2++) {
 ....................      *s = *s2;
 ....................   }
 ....................   *s = *s2;
 ....................   return(s1);
 .................... }
 ....................
 .................... /* standard template:
 ....................    char *strncpy(char *s1, const char *s2, size_t n).
 ....................    Copies max of n characters (not following ending '\0')
 ....................    from s2 in s1; if s2 has less than n characters, appends 0 */
 ....................
 .................... char *strncpy(char *s1, char *s2, size_t n)
 .................... {
 ....................   char *s;
 ....................
 ....................   for (s = s1; n > 0 && *s2 != '\0'; n--)
 ....................      *s++ = *s2++;
 ....................   for (; n > 0; n--)
 ....................      *s++ = '\0';
 ....................
 ....................   return(s1);
 .................... }
 .................... /***********************************************************/
 ....................
 .................... /*concatenation functions*/
 .................... /* standard template: char *strcat(char *s1, const char *s2)
 .................... appends s2 to s1*/
 ....................
 .................... char *strcat(char *s1, char *s2)
 .................... {
 ....................    char *s;
 ....................
 ....................    for (s = s1; *s != '\0'; ++s);
 ....................    while(*s2 != '\0')
 ....................    {
 ....................       *s = *s2;
 ....................       ++s;
 ....................       ++s2;
 ....................    }
 ....................
 ....................    *s = '\0';
 ....................    return(s1);
 .................... }
 .................... /* standard template: char *strncat(char *s1, char *s2,size_t n)
 .................... appends not more than n characters from s2 to s1*/
 ....................
 .................... char *strncat(char *s1, char *s2, size_t n)
 .................... {
 ....................    char *s;
 ....................
 ....................    for (s = s1; *s != '\0'; ++s);
 ....................    while(*s2 != '\0' && 0<n)
 ....................    {
 ....................       *s = *s2;
 ....................       ++s;
 ....................       ++s2;
 ....................       --n;
 ....................    }
 ....................
 ....................    *s = '\0';
 ....................    return(s1);
 .................... }
 ....................
 .................... /***********************************************************/
 ....................
 ....................
 .................... /*comparison functions*/
 .................... /* standard template: signed int memcmp(void *s1, void *s2).
 ....................    Compares s1 & s2; returns -1 if s1<s2, 0 if s1=s2, 1 if s1>s2 */
 ....................
 .................... signed int memcmp(void * s1,char *s2,size_t n)
 .................... {
 .................... char *su1, *su2;
 .................... for(su1=s1, su2=s2; 0<n; ++su1, ++su2, --n)
 .................... {
 ....................    if(*su1!=*su2)
 ....................       return ((*su1<*su2)?-1:+1);
 .................... }
 .................... return 0;
 .................... }
 ....................
 .................... /* standard template: int strcmp(const char *s1, const char *s2).
 ....................    Compares s1 & s2; returns -1 if s1<s2, 0 if s1=s2, 1 if s1>s2 */
 ....................
 .................... signed int strcmp(char *s1, char *s2)
 .................... {
 ....................    for (; *s1 == *s2; s1++, s2++)
 ....................       if (*s1 == '\0')
 ....................          return(0);
 ....................    return((*s1 < *s2) ? -1: 1);
 .................... }
 .................... /* standard template: int strcoll(const char *s1, const char *s2).
 ....................    Compares s1 & s2; returns -1 if s1<s2, 0 if s1=s2, 1 if s1>s2 */
 ....................
 .................... signed int strcoll(char *s1, char *s2)
 .................... {
 ....................    for (; *s1 == *s2; s1++, s2++)
 ....................       if (*s1 == '\0')
 ....................          return(0);
 ....................    return((*s1 < *s2) ? -1: 1);
 .................... }
 ....................
 .................... /* standard template:
 ....................    int strncmp(const char *s1, const char *s2, size_t n).
 ....................    Compares max of n characters (not following 0) from s1 to s2;
 ....................    returns same as strcmp */
 ....................
 .................... signed int strncmp(char *s1, char *s2, size_t n)
 .................... {
 ....................    for (; n > 0; s1++, s2++, n--)
 ....................       if (*s1 != *s2)
 ....................          return((*s1 <*s2) ? -1: 1);
 ....................       else if (*s1 == '\0')
 ....................          return(0);
 ....................    return(0);
 .................... }
 .................... /* standard template:
 ....................    int strxfrm(const char *s1, const char *s2, size_t n).
 ....................    transforms maximum of n characters from s2 and places them into s1*/
 .................... size_t strxfrm(char *s1, char *s2, size_t n)
 .................... {
 ....................   char *s;
 ....................   int n1;
 ....................   n1=n;
 ....................   for (s = s1; n > 0 && *s2 != '\0'; n--)
 ....................      *s++ = *s2++;
 ....................   for (; n > 0; n--)
 ....................      *s++ = '\0';
 ....................
 ....................   return(n1);
 .................... }
 ....................
 ....................
 ....................
 ....................
 ....................
 .................... /***********************************************************/
 .................... /*Search functions*/
 .................... /* standard template: void *memchr(const char *s, int c).
 ....................    Finds first occurrence of c in n characters of s */
 ....................
 .................... char *memchr(void *s,int c,size_t n)
 .................... {
 ....................    char uc;
 ....................    char *su;
 ....................    uc=c;
 ....................    for(su=s;0<n;++su,--n)
 ....................       if(*su==uc)
 ....................       return su;
 ....................    return NULL;
 .................... }
 ....................
 .................... /* standard template: char *strchr(const char *s, int c).
 ....................    Finds first occurrence of c in s */
 ....................
 .................... char *strchr(char *s, int c)
 .................... {
 ....................    for (; *s != c; s++)
 ....................       if (*s == '\0')
 ....................          return(0);
 ....................    return(s);
 .................... }
 .................... /* standard template:
 ....................    size_t strcspn(const char *s1, const char *s2).
 ....................    Computes length of max initial segment of s1 that
 ....................    consists entirely of characters NOT from s2*/
 ....................
 .................... int *strcspn(char *s1, char *s2)
 .................... {
 ....................    char *sc1, *sc2;
 ....................
 ....................    for (sc1 = s1; *sc1 != 0; sc1++)
 ....................       for (sc2 = s2; *sc2 != 0; sc2++)
 ....................          if (*sc1 == *sc2)
 ....................             return(sc1 - s1);
 ....................    return(sc1 - s1);
 .................... }
 .................... /* standard template:
 ....................    char *strpbrk(const char *s1, const char *s2).
 ....................    Locates first occurence of any character from s2 in s1;
 ....................    returns s1 if s2 is empty string */
 ....................
 .................... char *strpbrk(char *s1, char *s2)
 .................... {
 ....................    char *sc1, *sc2;
 ....................
 ....................    for (sc1 = s1; *sc1 != 0; sc1++)
 ....................       for (sc2 = s2; *sc2 != 0; sc2++)
 ....................          if (*sc1 == *sc2)
 ....................             return(sc1);
 ....................    return(0);
 .................... }
 ....................
 ....................
 .................... /* standard template: char *strrchr(const char *s, int c).
 ....................    Finds last occurrence of c in s */
 ....................
 .................... char *strrchr(char *s, int c)
 .................... {
 ....................    char *p;
 ....................
 ....................    for (p = 0; ; s++)
 ....................    {
 ....................       if (*s == c)
 ....................          p = s;
 ....................       if (*s == '\0')
 ....................          return(p);
 ....................    }
 .................... }
 .................... /* computes length of max initial segment of s1 consisting
 ....................    entirely of characters from s2 */
 ....................
 .................... int *strspn(char *s1, char *s2)
 .................... {
 ....................    char *sc1, *sc2;
 ....................
 ....................    for (sc1 = s1; *sc1 != 0; sc1++)
 ....................       for (sc2 = s2; ; sc2++)
 ....................     if (*sc2 == '\0')
 ....................        return(sc1 - s1);
 ....................          else if (*sc1 == *sc2)
 ....................             break;
 ....................    return(sc1 - s1);
 .................... }
 .................... /* standard template:
 ....................    char *strstr(const char *s1, const char *s2);
 ....................    Locates first occurence of character sequence s2 in s1;
 ....................    returns 0 if s2 is empty string
 ....................
 ....................    Uncomment #define FASTER_BUT_MORE_ROM at the top of the
 ....................    file to use the faster algorithm */
 .................... char *strstr(char *s1, char *s2)
 .................... {
 ....................    char *s, *t;
 ....................
 ....................    #ifdef FASTER_BUT_MORE_ROM
 ....................    if (*s2 == '\0')
 ....................          return(s1);
 ....................    #endif
 ....................
 ....................    while (*s1)
 ....................    {
 ....................       for(s = s1, t = s2; *t && (*s == *t); ++s, ++t);
 ....................
 ....................       if (*t == '\0')
 ....................          return s1;
 ....................       ++s1;
 ....................       #ifdef FASTER_BUT_MORE_ROM
 ....................          while(*s1 != '\0' && *s1 != *s2)
 ....................             ++s1;
 ....................       #endif
 ....................    }
 ....................    return 0;
 .................... }
 ....................
 .................... /* standard template: char *strtok(char *s1, const char *s2).
 ....................
 ....................    Finds next token in s1 delimited by a character from separator
 ....................    string s2 (which can be different from call to call).  First call
 ....................    starts at beginning of s1 searching for first character NOT
 ....................    contained in s2; returns 0 if none is found.
 ....................    If one is found, it is the start of first token (return value).
 ....................    Function then searches from there for a character contained in s2.
 ....................    If none is found, current token extends to end of s1, and subsequent
 ....................    searches for a token will return 0.  If one is found, it is
 ....................    overwritten by '\0', which terminates current token.  Function saves
 ....................    pointer to following character from which next search will start.
 ....................    Each subsequent call, with 0 as first argument, starts searching
 ....................    from saved pointer */
 ....................
 .................... char *strtok(char *s1, char *s2)
 .................... {
 ....................    char *beg, *end;
 ....................    static char *save;
 ....................
 ....................    beg = (s1)? s1: save;
 ....................    beg += strspn(beg, s2);
 ....................    if (*beg == '\0')
 ....................    {
 ....................       *save = ' ';
 ....................       return(0);
 ....................    }
 ....................    end = strpbrk(beg, s2);
 ....................    if (*end != '\0')
 ....................    {
 ....................       *end = '\0';
 ....................       end++;
 ....................    }
 ....................    save = end;
 ....................    return(beg);
 .................... }
 ....................
 .................... /*****************************************************************/
 .................... /*Miscellaneous functions*/
 .................... /* standard template
 .................... maps error number in errnum to an error message string
 .................... Returns: Pointer to string
 .................... */
 .................... #ifdef _ERRNO
 .................... char * strerror(int errnum)
 .................... {
 .................... char s[15];
 .................... switch( errnum)
 .................... {
 .................... case 0:
 ....................    strcpy(s,"no errors");
 ....................    return s;
 .................... case EDOM :
 ....................    strcpy(s,"domain error");
 ....................    return s;
 .................... case ERANGE:
 ....................    strcpy(s,"range error");
 ....................    return s;
 .................... }
 .................... }
 .................... #ENDIF
 .................... /* standard template: size_t strlen(const char *s).
 ....................    Computes length of s1 (preceding terminating 0) */
 ....................
 .................... int *strlen(char *s)
 .................... {
 ....................    char *sc;
 ....................
 ....................    for (sc = s; *sc != 0; sc++);
 ....................    return(sc - s);
 .................... }
 ....................
 .................... /* standard template: size_t stricmp(const char *s1, const char *s2).
 ....................    Compares s1 to s2 ignoring case (upper vs. lower) */
 ....................
 .................... signed int stricmp(char *s1, char *s2)
 .................... {
 ....................  for(; *s1==*s2||(isalpha(*s1)&&isalpha(*s2)&&(*s1==*s2+32||*s2==*s1+32));
 ....................     s1++, s2++)
 ....................     if (*s1 == '\0')
 ....................        return(0);
 ....................  return((*s1 < *s2) ? -1: 1);
 .................... }
 ....................
 ....................
 .................... /* standard template: char *strlwr(char *s).
 ....................    Replaces uppercase letters by lowercase;
 ....................    returns pointer to new string s */
 ....................
 .................... char *strlwr(char *s)
 .................... {
 ....................    char *p;
 ....................
 ....................    for (p = s; *p != '\0'; p++)
 ....................       if (*p >= 'A' && *p <='Z')
 ....................          *p += 'a' - 'A';
 ....................    return(s);
 .................... }
 ....................
 ....................
 .................... /************************************************************/
 ....................
 ....................
 .................... #endif
 ....................
 ....................
 .................... div_t div(signed int numer,signed int denom)
 .................... {
 ....................    div_t val;
 ....................    val.quot = numer / denom;
 ....................    val.rem = numer - (denom * val.quot);
 ....................    return (val);
 .................... }
 ....................
 .................... ldiv_t ldiv(signed long numer,signed long denom)
 .................... {
 ....................    ldiv_t val;
 ....................    val.quot = numer / denom;
 ....................    val.rem = numer - (denom * val.quot);
 ....................    return (val);
 .................... }
 ....................
 .................... float atof(char * s)
 .................... {
 ....................    float pow10 = 1.0;
 ....................    float result = 0.0;
 ....................    int sign = 0;
 ....................    char c;
 ....................    int ptr = 0;
 ....................
 ....................    c = s[ptr++];
 ....................
 ....................    if ((c>='0' && c<='9') || c=='+' || c=='-' || c=='.') {
 ....................       if(c == '-') {
 ....................          sign = 1;
 ....................          c = s[ptr++];
 ....................       }
 ....................       if(c == '+')
 ....................          c = s[ptr++];
 ....................
 ....................       while((c >= '0' && c <= '9')) {
 ....................          result = 10*result + c - '0';
 ....................          c = s[ptr++];
 ....................       }
 ....................
 ....................       if (c == '.') {
 ....................          c = s[ptr++];
 ....................          while((c >= '0' && c <= '9')) {
 ....................              pow10 = pow10*10;
 ....................              result += (c - '0')/pow10;
 ....................              c = s[ptr++];
 ....................          }
 ....................       }
 ....................
 ....................    }
 ....................
 ....................    if (sign == 1)
 ....................       result = -1*result;
 ....................    return(result);
 .................... }
 ....................
 .................... float atoe(char * s)
 .................... {
 ....................    float pow10 = 1.0;
 ....................    float result = 0.0;
 ....................    int sign = 0;
 ....................    int expsign = 0;
 ....................    char c;
 ....................    int ptr = 0;
 ....................    int i;
 ....................    float exp = 1.0;
 ....................    int expcnt = 0;
 ....................
 ....................    c = s[ptr++];
 ....................
 ....................    if ((c>='0' && c<='9') || c=='+' || c=='-' || c=='.' || c=='E' || c=='e') {
 ....................       if(c == '-') {
 ....................          sign = 1;
 ....................          c = s[ptr++];
 ....................       }
 ....................       if(c == '+')
 ....................          c = s[ptr++];
 ....................
 ....................       while((c >= '0' && c <= '9')) {
 ....................          result = 10*result + c - '0';
 ....................          c = s[ptr++];
 ....................       }
 ....................
 ....................       if (c == '.') {
 ....................          c = s[ptr++];
 ....................          while((c >= '0' && c <= '9')) {
 ....................              pow10 = pow10*10;
 ....................              result += (c - '0')/pow10;
 ....................              c = s[ptr++];
 ....................          }
 ....................       }
 ....................
 ....................       // Handling the exponent
 ....................       if (c=='e' || c=='E') {
 ....................          c = s[ptr++];
 ....................
 ....................          if(c == '-') {
 ....................             expsign = 1;
 ....................             c = s[ptr++];
 ....................          }
 ....................          if(c == '+')
 ....................             c = s[ptr++];
 ....................
 ....................          while((c >= '0' && c <= '9')) {
 ....................             expcnt = 10*expcnt + c - '0';
 ....................             c = s[ptr++];
 ....................          }
 ....................
 ....................          for(i=0;i<expcnt;i++)
 ....................             exp*=10;
 ....................
 ....................          if(expsign==1)
 ....................             result/=exp;
 ....................          else
 ....................             result*=exp;
 ....................       }
 ....................    }
 ....................
 ....................    if (sign == 1)
 ....................       result = -1*result;
 ....................    return(result);
 .................... }
 ....................
 .................... signed int atoi(char *s)
 .................... {
 ....................    signed int result;
 ....................    int sign, base, index;
 ....................    char c;
 ....................
 ....................    index = 0;
 ....................    sign = 0;
 ....................    base = 10;
 ....................    result = 0;
 ....................
 ....................    if (!s)
 ....................       return 0;
 ....................    // Omit all preceeding alpha characters
 ....................    c = s[index++];
 ....................
 ....................    // increase index if either positive or negative sign is detected
 ....................    if (c == '-')
 ....................    {
 ....................       sign = 1;         // Set the sign to negative
 ....................       c = s[index++];
 ....................    }
 ....................    else if (c == '+')
 ....................    {
 ....................       c = s[index++];
 ....................    }
 ....................
 ....................    if (c >= '0' && c <= '9')
 ....................    {
 ....................
 ....................       // Check for hexa number
 ....................       if (c == '0' && (s[index] == 'x' || s[index] == 'X'))
 ....................       {
 ....................          base = 16;
 ....................          index++;
 ....................          c = s[index++];
 ....................       }
 ....................
 ....................       // The number is a decimal number
 ....................       if (base == 10)
 ....................       {
 ....................          while (c >= '0' && c <= '9')
 ....................          {
 ....................             result = 10*result + (c - '0');
 ....................             c = s[index++];
 ....................          }
 ....................       }
 ....................       else if (base == 16)    // The number is a hexa number
 ....................       {
 ....................          c = toupper(c);
 ....................          while ( (c >= '0' && c <= '9') || (c >= 'A' && c<='F'))
 ....................          {
 ....................             if (c >= '0' && c <= '9')
 ....................                result = (result << 4) + (c - '0');
 ....................             else
 ....................                result = (result << 4) + (c - 'A' + 10);
 ....................
 ....................             c = s[index++];
 ....................             c = toupper(c);
 ....................          }
 ....................       }
 ....................    }
 ....................
 ....................    if (sign == 1 && base == 10)
 ....................        result = -result;
 ....................
 ....................    return(result);
 .................... }
 ....................
 .................... signed long atol(char *s)
 .................... {
 ....................    signed long result;
 ....................    int sign, base, index;
 ....................    char c;
 ....................
 ....................    index = 0;
 ....................    sign = 0;
 ....................    base = 10;
 ....................    result = 0;
 ....................
 ....................    if (!s)
 ....................       return 0;
 ....................    c = s[index++];
 ....................
 ....................    // increase index if either positive or negative sign is detected
 ....................    if (c == '-')
 ....................    {
 ....................       sign = 1;         // Set the sign to negative
 ....................       c = s[index++];
 ....................    }
 ....................    else if (c == '+')
 ....................    {
 ....................       c = s[index++];
 ....................    }
 ....................
 ....................    if (c >= '0' && c <= '9')
 ....................    {
 ....................       if (c == '0' && (s[index] == 'x' || s[index] == 'X'))
 ....................       {
 ....................          base = 16;
 ....................          index++;
 ....................          c = s[index++];
 ....................       }
 ....................
 ....................       // The number is a decimal number
 ....................       if (base == 10)
 ....................       {
 ....................          while (c >= '0' && c <= '9')
 ....................          {
 ....................             result = 10*result + (c - '0');
 ....................             c = s[index++];
 ....................          }
 ....................       }
 ....................       else if (base == 16)    // The number is a hexa number
 ....................       {
 ....................          c = toupper(c);
 ....................          while ( (c >= '0' && c <= '9') || (c >= 'A' && c <='F'))
 ....................          {
 ....................             if (c >= '0' && c <= '9')
 ....................                result = (result << 4) + (c - '0');
 ....................             else
 ....................                result = (result << 4) + (c - 'A' + 10);
 ....................
 ....................             c = s[index++];c = toupper(c);
 ....................          }
 ....................       }
 ....................    }
 ....................
 ....................    if (base == 10 && sign == 1)
 ....................       result = -result;
 ....................
 ....................    return(result);
 .................... }
 ....................
 .................... /* A fast routine to multiply by 10
 ....................  */
 .................... signed int32 mult_with10(int32 num)
 .................... {
 ....................    return ( (num << 1) + (num << 3) );
 .................... }
 ....................
 .................... signed int32 atoi32(char *s)
 .................... {
 ....................    signed int32 result;
 ....................    int sign, base, index;
 ....................    char c;
 ....................
 ....................    index = 0;
 ....................    sign = 0;
 ....................    base = 10;
 ....................    result = 0;
 ....................
 ....................    if (!s)
 ....................       return 0;
 ....................    c = s[index++];
 ....................
 ....................    // increase index if either positive or negative sign is detected
 ....................    if (c == '-')
 ....................    {
 ....................       sign = 1;         // Set the sign to negative
 ....................       c = s[index++];
 ....................    }
 ....................    else if (c == '+')
 ....................    {
 ....................       c = s[index++];
 ....................    }
 ....................
 ....................    if (c >= '0' && c <= '9')
 ....................    {
 ....................       if (c == '0' && (s[index] == 'x' || s[index] == 'X'))
 ....................       {
 ....................          base = 16;
 ....................          index++;
 ....................          c = s[index++];
 ....................       }
 ....................
 ....................       // The number is a decimal number
 ....................       if (base == 10)
 ....................       {
 ....................          while (c >= '0' && c <= '9') {
 ....................             result = (result << 1) + (result << 3);  // result *= 10;
 ....................             result += (c - '0');
 ....................             c = s[index++];
 ....................          }
 ....................       }
 ....................       else if (base == 16)    // The number is a hexa number
 ....................       {
 ....................          c = toupper(c);
 ....................          while ((c >= '0' && c <= '9') || (c >= 'A' && c <='F'))
 ....................          {
 ....................             if (c >= '0' && c <= '9')
 ....................                result = (result << 4) + (c - '0');
 ....................             else
 ....................                result = (result << 4) + (c - 'A' + 10);
 ....................
 ....................             c = s[index++];c = toupper(c);
 ....................          }
 ....................       }
 ....................    }
 ....................
 ....................    if (base == 10 && sign == 1)
 ....................       result = -result;
 ....................
 ....................    return(result);
 .................... }
 ....................
 .................... char * itoa(signed int32 num, int8 base, char *s)
 .................... {
 ....................      int32 temp=1;
 ....................      int8 i,sign=0,cnt=0;
 ....................      char c;
 ....................
 ....................      if(num<0) {
 ....................          sign=1;        // Check for negative number
 ....................          num*=-1;
 ....................      }
 ....................
 ....................      while(temp>0) {
 ....................          temp=(num/base);
 ....................          s[cnt]=(num%base)+'0';    // Conversion
 ....................
 ....................          if(s[cnt]>0x39)
 ....................             s[cnt]+=0x7;
 ....................
 ....................          cnt++;
 ....................          num=temp;
 ....................      }
 ....................
 ....................      if(sign==1) {
 ....................          s[cnt]=0x2D;      // Negative sign
 ....................          cnt++;
 ....................      }
 ....................
 ....................      for(i = 0;i<(int8)(cnt/2);i++) {
 ....................
 ....................          c=s[i];
 ....................          s[i]=s[cnt-i-1];        // Reverse the number
 ....................          s[cnt-i-1]=c;
 ....................      }
 ....................      s[cnt]='\0';     // End the string
 ....................      return s;
 .................... }
 ....................
 .................... float strtod(char *s,char *endptr) {
 ....................    float pow10 = 1.0;
 ....................    float result = 0.0;
 ....................    int sign = 0, point = 0;
 ....................    char c;
 ....................    int ptr = 0;
 ....................
 ....................    if (!s)
 ....................       return 0;
 ....................    c=s[ptr++];
 ....................
 ....................
 ....................    while((c>='0' && c<='9') || c=='+' || c=='-' || c=='.') {
 ....................       if(c == '-') {
 ....................          sign = 1;
 ....................          c = s[ptr++];
 ....................       }
 ....................
 ....................       while((c >= '0' && c <= '9') && point == 0) {
 ....................          result = 10*result + c - '0';
 ....................          c = s[ptr++];
 ....................       }
 ....................
 ....................       if (c == '.') {
 ....................          point = 1;
 ....................          c = s[ptr++];
 ....................       }
 ....................
 ....................       while((c >= '0' && c <= '9') && point == 1) {
 ....................          pow10 = pow10*10;
 ....................          result += (c - '0')/pow10;
 ....................          c = s[ptr++];
 ....................       }
 ....................
 ....................       if (c == '+') {
 ....................          c = s[ptr++];
 ....................       }
 ....................    }
 ....................
 ....................    if (sign == 1)
 ....................       result = -1*result;
 ....................    if(endptr)
 ....................    {
 ....................       if (ptr) {
 ....................          ptr--;
 ....................          *((char *)endptr)=s+ptr;
 ....................       }
 ....................       else
 ....................          *((char *)endptr)=s;
 ....................    }
 ....................
 ....................    return(result);
 .................... }
 ....................
 .................... long strtoul(char *s,char *endptr,signed int base)
 .................... {
 ....................    char *sc,*s1,*sd;
 ....................    unsigned long x=0;
 ....................    char sign;
 ....................    char digits[]="0123456789abcdefghijklmnopqstuvwxyz";
 ....................    for(sc=s;isspace(*sc);++sc);
 ....................    sign=*sc=='-'||*sc=='+'?*sc++:'+';
 ....................    if(sign=='-')
 ....................    {
 ....................       if (endptr)
 ....................       {
 ....................         *((char *)endptr)=s;
 ....................       }
 ....................       return 0;
 ....................    }
 ....................
 ....................    if (base <0 || base ==1|| base >36) // invalid base
 ....................    {
 ....................       if (endptr)
 ....................       {
 ....................         *((char *)endptr)=s;
 ....................       }
 ....................       return 0;
 ....................    }
 ....................    else if (base)
 ....................    {
 ....................       if(base==16 && *sc =='0'&&(sc[1]=='x' || sc[1]=='X'))
 ....................          sc+=2;
 ....................       if(base==8 && *sc =='0')
 ....................          sc+=1;
 ....................       if(base==2 && *sc =='0'&&sc
 _________________
 Ringo Davis
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 1:47 pm |   |  
				| 
 |  
				| Your include file stddef.h is not needed. It's not used by your program. But it fills up the .LST file and exceeds the amount of code that the forum
 program can handle (it gets cut off).  Delete #include stddef.h.
 
 How to post an image on the CCS forum:
 Use http://www.postimage.com or http://www.imageshack.com
 or some other free image hosting service.
 Upload your schematic to that website. Preferably a .JPG file or some
 other commonly used image format.
 Then post a link to your image here in the forum.
 
 
 
  	  | Quote: |  	  | Compiler Version 4.007 | 
 This is not a great version.  I would only write very simple code with
 this version.  Then it may work for you.   You are basically doing that now.
 
 If you bought the compiler, you might consider asking CCS to upgrade
 you to the last and best version of 4.xxx, which is 4.141.   Maybe they
 would do it for free if you ask them nicely, or maybe they could cut you
 a deal.  It's worth a try.   4.007 is early beta.
 |  |  
		|  |  
		| Ringo42 
 
 
 Joined: 07 May 2004
 Posts: 263
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 2:01 pm |   |  
				| 
 |  
				| Here is the lst file without stdlib, hopefully that helps 
 Here is a PDF of the schematic
 http://postimg.org/image/pwk8htn57/
 
 I asked support about an upgrade, guess I'll see what they say.
 Thanks
 
 
 
 
  	  | Code: |  	  | CCS PCH C Compiler, Version 4.007, 34836               25-Feb-15 14:58 
 Filename: C:\Users\Hardware\Dropbox\21st century\Firmware\21_Rx_V3N_rssi_test.lst
 
 ROM used: 880 bytes (3%)
 Largest free fragment is 31888
 RAM used: 9 (1%) at main() level
 17 (1%) worst case
 Stack:    3 locations
 
 *
 0000:  GOTO   029A
 .................... #include "18f452.h"
 .................... //////// Standard Header file for the PIC18F452 device ////////////////
 .................... #device PIC18F452
 .................... #list
 ....................
 .................... #fuses hs,WDT8,noprotect,put,nolvp
 .................... #device adc=10
 .................... #device HIGH_INTS=true
 .................... //#device ADC=UNSIGNED
 .................... #use delay(clock=20000000,restart_wdt)
 *
 00F4:  CLRF   FEA
 00F6:  MOVLW  09
 00F8:  MOVWF  FE9
 00FA:  MOVF   FEF,W
 00FC:  BZ    0120
 00FE:  MOVLW  06
 0100:  MOVWF  01
 0102:  MOVLW  BF
 0104:  MOVWF  00
 0106:  CLRWDT
 0108:  DECFSZ 00,F
 010A:  BRA    0106
 010C:  DECFSZ 01,F
 010E:  BRA    0102
 0110:  MOVLW  7A
 0112:  MOVWF  00
 0114:  DECFSZ 00,F
 0116:  BRA    0114
 0118:  BRA    011A
 011A:  CLRWDT
 011C:  DECFSZ FEF,F
 011E:  BRA    00FE
 0120:  RETLW  00
 .................... //#include <stdlib.h>
 ....................
 .................... #define LED1_PIN    PIN_B6
 .................... #define LED2_PIN    PIN_B7
 .................... #define TX_PIN      PIN_C6
 .................... #define RX_PIN      PIN_C7
 .................... #define Mux_sel     PIN_E2
 .................... #define BAUD_RATE 19200
 ....................
 .................... #use rs232(baud=BAUD_RATE,xmit=TX_PIN,rcv=RX_PIN,errors,bits=8,parity=N,restart_wdt)
 .................... ///Macros
 .................... #define LED1_ON output_high(LED1_PIN)
 .................... #define LED2_ON output_high(LED2_PIN)
 .................... #define LED1_OFF output_low(LED1_PIN)
 .................... #define LED2_OFF output_low(LED2_PIN)
 ....................
 ....................
 .................... void CheckRssi();
 .................... void InitPic();
 ....................
 .................... unsigned int RSSIcounter=0;
 ....................
 ....................
 .................... void main()
 .................... {
 *
 029A:  CLRF   FF8
 029C:  BSF    FD0.7
 029E:  CLRF   FEA
 02A0:  CLRF   FE9
 02A2:  MOVLW  40
 02A4:  MOVWF  FAF
 02A6:  MOVLW  A6
 02A8:  MOVWF  FAC
 02AA:  MOVLW  90
 02AC:  MOVWF  FAB
 02AE:  BSF    FC1.0
 02B0:  BSF    FC1.1
 02B2:  BSF    FC1.2
 02B4:  BCF    FC1.3
 02B6:  CLRF   05
 02B8:  CLRF   06
 ....................    setup_wdt(WDT_ON);
 02BA:  BSF    FD1.0
 ....................    setup_timer_0(RTCC_INTERNAL);
 02BC:  MOVLW  80
 02BE:  MOVWF  FD5
 ....................
 ....................     printf("ABC\r\n   >");
 02C0:  CLRF   07
 02C2:  MOVF   07,W
 02C4:  RCALL  0004
 02C6:  INCF   07,F
 02C8:  MOVWF  00
 02CA:  CLRWDT
 02CC:  BTFSS  F9E.4
 02CE:  BRA    02CA
 02D0:  MOVWF  FAD
 02D2:  MOVLW  05
 02D4:  SUBWF  07,W
 02D6:  BNZ   02C2
 02D8:  MOVLW  03
 02DA:  MOVWF  08
 02DC:  MOVLW  20
 02DE:  CLRWDT
 02E0:  BTFSS  F9E.4
 02E2:  BRA    02DE
 02E4:  MOVWF  FAD
 02E6:  DECFSZ 08,F
 02E8:  BRA    02DC
 02EA:  MOVLW  3E
 02EC:  CLRWDT
 02EE:  BTFSS  F9E.4
 02F0:  BRA    02EC
 02F2:  MOVWF  FAD
 ....................
 ....................    InitPic();
 02F4:  BRA    00A8
 ....................     printf("\r\n\nMotherboard RX, firmware 3n   >\r\n");
 02F6:  CLRF   07
 02F8:  MOVF   07,W
 02FA:  RCALL  001C
 02FC:  INCF   07,F
 02FE:  MOVWF  00
 0300:  CLRWDT
 0302:  BTFSS  F9E.4
 0304:  BRA    0300
 0306:  MOVWF  FAD
 0308:  MOVLW  1E
 030A:  SUBWF  07,W
 030C:  BNZ   02F8
 030E:  MOVLW  03
 0310:  MOVWF  08
 0312:  MOVLW  20
 0314:  CLRWDT
 0316:  BTFSS  F9E.4
 0318:  BRA    0314
 031A:  MOVWF  FAD
 031C:  DECFSZ 08,F
 031E:  BRA    0312
 0320:  MOVLW  3E
 0322:  CLRWDT
 0324:  BTFSS  F9E.4
 0326:  BRA    0322
 0328:  MOVWF  FAD
 032A:  MOVLW  0D
 032C:  CLRWDT
 032E:  BTFSS  F9E.4
 0330:  BRA    032C
 0332:  MOVWF  FAD
 0334:  MOVLW  0A
 0336:  CLRWDT
 0338:  BTFSS  F9E.4
 033A:  BRA    0336
 033C:  MOVWF  FAD
 ....................     printf("Copyright 2015 Ringo Davis\r\n>");
 033E:  CLRF   07
 0340:  MOVF   07,W
 0342:  RCALL  004E
 0344:  INCF   07,F
 0346:  MOVWF  00
 0348:  CLRWDT
 034A:  BTFSS  F9E.4
 034C:  BRA    0348
 034E:  MOVWF  FAD
 0350:  MOVLW  1D
 0352:  SUBWF  07,W
 0354:  BNZ   0340
 ....................
 ....................     set_adc_channel( 5 );
 0356:  MOVLW  28
 0358:  MOVWF  01
 035A:  MOVF   FC2,W
 035C:  ANDLW  C7
 035E:  IORWF  01,W
 0360:  MOVWF  FC2
 ....................     delay_ms(1);
 0362:  MOVLW  01
 0364:  MOVWF  09
 0366:  RCALL  00F4
 ....................     while (1)
 ....................     {
 ....................         CheckRssi();
 0368:  BRA    01BC
 ....................         restart_wdt();
 036A:  CLRWDT
 ....................     }
 036C:  BRA    0368
 .................... }
 ....................
 .................... void CheckRssi()
 .................... {
 036E:  SLEEP
 ....................     int channel;
 ....................     unsigned int RSSI=0;
 *
 01BC:  CLRF   08
 ....................     set_adc_channel( 5 );
 01BE:  MOVLW  28
 01C0:  MOVWF  01
 01C2:  MOVF   FC2,W
 01C4:  ANDLW  C7
 01C6:  IORWF  01,W
 01C8:  MOVWF  FC2
 ....................     delay_ms(1);
 01CA:  MOVLW  01
 01CC:  MOVWF  09
 01CE:  RCALL  00F4
 ....................     RSSI = Read_ADC();
 01D0:  BSF    FC2.2
 01D2:  BTFSC  FC2.2
 01D4:  BRA    01D2
 01D6:  MOVFF  FC3,08
 ....................     delay_ms(100);
 01DA:  MOVLW  64
 01DC:  MOVWF  09
 01DE:  RCALL  00F4
 .................... //    printf("RSSI!!!!!!!!!!!! \r\n");
 ....................
 ....................     if(RSSI >100) // If radio is detected, but up counter a bunch
 01E0:  MOVF   08,W
 01E2:  SUBLW  64
 01E4:  BC    01F0
 ....................    {
 ....................         RSSIcounter+=10;
 01E6:  MOVLW  0A
 01E8:  ADDWF  06,F
 ....................       output_high(PIN_E1);
 01EA:  BCF    F96.1
 01EC:  BSF    F8D.1
 ....................    }
 ....................    else
 01EE:  BRA    01F8
 ....................    {
 ....................         RSSIcounter-=1;//else slowly count down to make sure radio is really off
 01F0:  MOVLW  01
 01F2:  SUBWF  06,F
 ....................       output_low(PIN_E1);
 01F4:  BCF    F96.1
 01F6:  BCF    F8D.1
 ....................    }
 .................... //    printf("RSSI 2\r\n");
 ....................     if(RSSIcounter >244)
 01F8:  MOVF   06,W
 01FA:  SUBLW  F4
 01FC:  BC    0202
 ....................         RSSIcounter=244;
 01FE:  MOVLW  F4
 0200:  MOVWF  06
 ....................     if(RSSIcounter <2)
 0202:  MOVF   06,W
 0204:  SUBLW  01
 0206:  BNC   020C
 ....................         RSSIcounter=2;
 0208:  MOVLW  02
 020A:  MOVWF  06
 .................... //    printf("RSSI 3 \r\n");
 ....................
 ....................
 ....................
 ....................     if(RSSIcounter > 30)//if the radio is seen a few times
 020C:  MOVF   06,W
 020E:  SUBLW  1E
 0210:  BC    0218
 ....................     {
 ....................         //output_high(MUX_Sel);//radio
 ....................       output_high(PIN_B2);
 0212:  BCF    F93.2
 0214:  BSF    F8A.2
 ....................     }
 ....................
 ....................     else
 0216:  BRA    0220
 ....................     {
 ....................         output_low(MUX_sel);//usb
 0218:  BCF    F96.2
 021A:  BCF    F8D.2
 ....................       output_low(PIN_B2);
 021C:  BCF    F93.2
 021E:  BCF    F8A.2
 ....................     }
 ....................
 .................... //    printf("RSSI 4 \r\n");
 ....................
 ....................     printf("RSSI= %u    RSSIcounter= %u \r\n",RSSI,RSSIcounter);
 0220:  CLRF   09
 0222:  MOVF   09,W
 0224:  RCALL  007C
 0226:  INCF   09,F
 0228:  MOVWF  00
 022A:  CLRWDT
 022C:  BTFSS  F9E.4
 022E:  BRA    022A
 0230:  MOVWF  FAD
 0232:  MOVLW  06
 0234:  SUBWF  09,W
 0236:  BNZ   0222
 0238:  MOVFF  08,0C
 023C:  MOVLW  1B
 023E:  MOVWF  0D
 0240:  RCALL  014A
 0242:  MOVLW  04
 0244:  MOVWF  0A
 0246:  MOVLW  20
 0248:  CLRWDT
 024A:  BTFSS  F9E.4
 024C:  BRA    0248
 024E:  MOVWF  FAD
 0250:  DECFSZ 0A,F
 0252:  BRA    0246
 0254:  MOVLW  08
 0256:  MOVWF  0B
 0258:  MOVF   0B,W
 025A:  RCALL  007C
 025C:  INCF   0B,F
 025E:  MOVWF  00
 0260:  CLRWDT
 0262:  BTFSS  F9E.4
 0264:  BRA    0260
 0266:  MOVWF  FAD
 0268:  MOVLW  15
 026A:  SUBWF  0B,W
 026C:  BNZ   0258
 026E:  MOVFF  06,0C
 0272:  MOVLW  1B
 0274:  MOVWF  0D
 0276:  RCALL  014A
 0278:  MOVLW  20
 027A:  CLRWDT
 027C:  BTFSS  F9E.4
 027E:  BRA    027A
 0280:  MOVWF  FAD
 0282:  MOVLW  0D
 0284:  CLRWDT
 0286:  BTFSS  F9E.4
 0288:  BRA    0284
 028A:  MOVWF  FAD
 028C:  MOVLW  0A
 028E:  CLRWDT
 0290:  BTFSS  F9E.4
 0292:  BRA    028E
 0294:  MOVWF  FAD
 ....................
 .................... }
 0296:  GOTO   036A (RETURN)
 ....................
 .................... void InitPic()
 .................... {
 ....................      short int dummy_variable;
 ....................      setup_adc_ports(All_ANALOG);
 *
 00A8:  BCF    FC1.0
 00AA:  BCF    FC1.1
 00AC:  BCF    FC1.2
 00AE:  BCF    FC1.3
 ....................     setup_adc( ADC_CLOCK_DIV_32 );
 00B0:  BCF    FC1.6
 00B2:  BCF    FC2.6
 00B4:  BSF    FC2.7
 00B6:  BSF    FC1.7
 00B8:  BSF    FC2.0
 ....................     setup_spi(FALSE);
 00BA:  BCF    FC6.5
 00BC:  BCF    F94.5
 00BE:  BSF    F94.4
 00C0:  BCF    F94.3
 00C2:  MOVLW  00
 00C4:  MOVWF  FC6
 00C6:  MOVWF  FC7
 ....................     setup_psp(PSP_DISABLED);
 00C8:  BCF    F96.4
 ....................     setup_timer_2(T2_DIV_BY_4,128,16);// 18.6 khz 0-512 int every 8ms //
 00CA:  MOVLW  78
 00CC:  IORLW  05
 00CE:  MOVWF  FCA
 00D0:  MOVLW  80
 00D2:  MOVWF  FCB
 ....................     setup_timer_0(RTCC_Internal|RTCC_div_2);
 00D4:  MOVWF  FD5
 ....................
 .................... //    enable_interrupts(INT_RDA);    // Serial Data Available IRQ
 ....................     enable_interrupts(INT_TIMER2); // Timer 2 Overflow
 00D6:  BSF    F9D.1
 .................... //    enable_interrupts(global);     // Enable IRQs
 ....................
 ....................     dummy_variable = input(PIN_E0);
 00D8:  BSF    F96.0
 00DA:  BCF    07.0
 00DC:  BTFSC  F84.0
 00DE:  BSF    07.0
 ....................     output_low(PIN_E1);
 00E0:  BCF    F96.1
 00E2:  BCF    F8D.1
 ....................     output_low(PIN_B2);
 00E4:  BCF    F93.2
 00E6:  BCF    F8A.2
 ....................     output_low(PIN_E2);//mux_sel
 00E8:  BCF    F96.2
 00EA:  BCF    F8D.2
 ....................
 ....................     input(pin_a4);//RTS
 00EC:  BSF    F92.4
 ....................     port_b_pullups(false);
 00EE:  BSF    FF1.7
 .................... }
 00F0:  GOTO   02F6 (RETURN)
 
 Configuration Fuses:
 Word  1: 2200   HS NOOSCSEN
 Word  2: 070E   BROWNOUT WDT8 WDT BORV20 PUT
 Word  3: 0100   CCP2C1
 Word  4: 0081   STVREN NODEBUG NOLVP
 Word  5: C00F   NOPROTECT NOCPD NOCPB
 Word  6: E00F   NOWRT NOWRTD NOWRTB NOWRTC
 Word  7: 400F   NOEBTR NOEBTRB
 
 | 
 _________________
 Ringo Davis
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 2:29 pm |   |  
				| 
 |  
				|  	  | Quote: |  	  | I narrowed it down to the line //output_high(MUX_Sel);//radio
 
 | 
 Mux_sel (pin E2) goes to a jumper block.  I don't know what jumpers
 are installed there.   But the first thing to do, would be to investigate
 if there is some hardware effect of setting that pin high, such that it
 locks up the PIC.
 
 Do that test with a very simple program as shown below.  When it runs,
 do you see both printf messages, or just the first one ?
 
  	  | Code: |  	  | #include "18f452.h"
 #fuses hs,NOWDT,noprotect,put,nolvp
 #device adc=10
 #use delay(clock=20000000)
 
 #define TX_PIN      PIN_C6
 #define RX_PIN      PIN_C7
 #define BAUD_RATE 19200
 #define Mux_sel     PIN_E2
 
 #use rs232(baud=BAUD_RATE,xmit=TX_PIN,rcv=RX_PIN,errors,bits=8,parity=N,restart_wdt)
 
 void main()
 {
 printf("Start\r\n");
 output_high(MUX_Sel);
 printf("Just set mux sel high \n\r");
 
 while(TRUE);
 }
 
 | 
 |  |  
		|  |  
		| Ringo42 
 
 
 Joined: 07 May 2004
 Posts: 263
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 2:41 pm |   |  
				| 
 |  
				| I get nothing when I run that code. I added a couple lines and now I get the first print statement. The pin does go high though. I put an LED on it. The jumper block just sends the signal to the mux.
 
 
  	  | Code: |  	  | #include "18f452.h" #fuses hs,NOWDT,noprotect,put,nolvp
 #device adc=10
 #use delay(clock=20000000)
 
 #define TX_PIN      PIN_C6
 #define RX_PIN      PIN_C7
 #define BAUD_RATE 19200
 #define Mux_sel     PIN_E2
 
 #use rs232(baud=BAUD_RATE,xmit=TX_PIN,rcv=RX_PIN,errors,bits=8,parity=N,restart_wdt)
 
 void main()
 {
 printf("Start\r\n");
 delay_ms(1000);
 output_low(MUX_Sel);
 printf("Just set mux sel low \n\r");
 delay_ms(1000);
 output_high(MUX_Sel);
 printf("Just set mux sel high \n\r");
 
 while(TRUE);
 }
 | 
 _________________
 Ringo Davis
 |  |  
		|  |  
		| Ringo42 
 
 
 Joined: 07 May 2004
 Posts: 263
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 2:56 pm |   |  
				| 
 |  
				| Something is gotta be wrong here. I changed the pin to one that goes nowhere and it doesn't run. Then I did not use a pin at all. 
  	  | Code: |  	  | #include "18f452.h" #fuses hs,NOWDT,noprotect,put,nolvp
 #device adc=10
 #use delay(clock=20000000)
 
 #define TX_PIN      PIN_C6
 #define RX_PIN      PIN_C7
 #define BAUD_RATE 19200
 #define Mux_sel     PIN_E2
 #define Mux_sel2     PIN_D4
 
 #use rs232(baud=BAUD_RATE,xmit=TX_PIN,rcv=RX_PIN,errors,bits=8,parity=N,restart_wdt)
 
 void main()
 {
 printf("Start\r\n");
 delay_ms(1000);
 //output_low(MUX_Sel2);
 printf("Just set mux sel low \n\r");
 delay_ms(1000);
 //output_high(MUX_Sel2);
 printf("Just set mux sel high \n\r");
 
 while(TRUE);
 }
 | 
 
 and this does not run. I reload my last hex file from my previous test and it runs. How can this simple code be broken?
 
 
  	  | Code: |  	  | CCS PCH C Compiler, Version 4.007, 34836               25-Feb-15 15:53 
 Filename: C:\Users\Hardware\Dropbox\21st century\Firmware\e2test.lst
 
 ROM used: 282 bytes (1%)
 Largest free fragment is 32486
 RAM used: 7 (0%) at main() level
 8 (1%) worst case
 Stack:    1 locations
 
 *
 0000:  GOTO   0094
 .................... #include "18f452.h"
 .................... //////// Standard Header file for the PIC18F452 device ////////////////
 .................... #device PIC18F452
 .................... #list
 ....................
 .................... #fuses hs,NOWDT,noprotect,put,nolvp
 .................... #device adc=10
 .................... #use delay(clock=20000000)
 006E:  CLRF   FEA
 0070:  MOVLW  07
 0072:  MOVWF  FE9
 0074:  MOVF   FEF,W
 0076:  BZ    0092
 0078:  MOVLW  06
 007A:  MOVWF  01
 007C:  CLRF   00
 007E:  DECFSZ 00,F
 0080:  BRA    007E
 0082:  DECFSZ 01,F
 0084:  BRA    007C
 0086:  MOVLW  7B
 0088:  MOVWF  00
 008A:  DECFSZ 00,F
 008C:  BRA    008A
 008E:  DECFSZ FEF,F
 0090:  BRA    0078
 0092:  RETLW  00
 ....................
 .................... #define TX_PIN      PIN_C6
 .................... #define RX_PIN      PIN_C7
 .................... #define BAUD_RATE 19200
 .................... #define Mux_sel     PIN_E2
 .................... #define Mux_sel2     PIN_D4
 ....................
 .................... #use rs232(baud=BAUD_RATE,xmit=TX_PIN,rcv=RX_PIN,errors,bits=8,parity=N,restart_wdt)
 ....................
 .................... void main()
 .................... {
 0094:  CLRF   FF8
 0096:  BCF    FD0.7
 0098:  CLRF   FEA
 009A:  CLRF   FE9
 009C:  MOVLW  40
 009E:  MOVWF  FAF
 00A0:  MOVLW  A6
 00A2:  MOVWF  FAC
 00A4:  MOVLW  90
 00A6:  MOVWF  FAB
 00A8:  BSF    FC1.0
 00AA:  BSF    FC1.1
 00AC:  BSF    FC1.2
 00AE:  BCF    FC1.3
 00B0:  CLRF   05
 .................... printf("Start\r\n");
 00B2:  CLRF   06
 00B4:  MOVF   06,W
 00B6:  RCALL  0004
 00B8:  INCF   06,F
 00BA:  MOVWF  00
 00BC:  CLRWDT
 00BE:  BTFSS  F9E.4
 00C0:  BRA    00BC
 00C2:  MOVWF  FAD
 00C4:  MOVLW  07
 00C6:  SUBWF  06,W
 00C8:  BNZ   00B4
 .................... delay_ms(1000);
 00CA:  MOVLW  04
 00CC:  MOVWF  06
 00CE:  MOVLW  FA
 00D0:  MOVWF  07
 00D2:  RCALL  006E
 00D4:  DECFSZ 06,F
 00D6:  BRA    00CE
 .................... //output_low(MUX_Sel2);
 .................... printf("Just set mux sel low \n\r");
 00D8:  CLRF   06
 00DA:  MOVF   06,W
 00DC:  RCALL  001C
 00DE:  INCF   06,F
 00E0:  MOVWF  00
 00E2:  CLRWDT
 00E4:  BTFSS  F9E.4
 00E6:  BRA    00E2
 00E8:  MOVWF  FAD
 00EA:  MOVLW  17
 00EC:  SUBWF  06,W
 00EE:  BNZ   00DA
 .................... delay_ms(1000);
 00F0:  MOVLW  04
 00F2:  MOVWF  06
 00F4:  MOVLW  FA
 00F6:  MOVWF  07
 00F8:  RCALL  006E
 00FA:  DECFSZ 06,F
 00FC:  BRA    00F4
 .................... //output_high(MUX_Sel2);
 .................... printf("Just set mux sel high \n\r");
 00FE:  CLRF   06
 0100:  MOVF   06,W
 0102:  RCALL  0044
 0104:  INCF   06,F
 0106:  MOVWF  00
 0108:  CLRWDT
 010A:  BTFSS  F9E.4
 010C:  BRA    0108
 010E:  MOVWF  FAD
 0110:  MOVLW  18
 0112:  SUBWF  06,W
 0114:  BNZ   0100
 ....................
 .................... while(TRUE);
 0116:  BRA    0116
 .................... }
 0118:  SLEEP
 
 Configuration Fuses:
 Word  1: 2200   HS NOOSCSEN
 Word  2: 0E0E   BROWNOUT WDT128 NOWDT BORV20 PUT
 Word  3: 0100   CCP2C1
 Word  4: 0081   STVREN NODEBUG NOLVP
 Word  5: C00F   NOPROTECT NOCPD NOCPB
 Word  6: E00F   NOWRT NOWRTD NOWRTB NOWRTC
 Word  7: 400F   NOEBTR NOEBTRB
 
 | 
 _________________
 Ringo Davis
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 |  |  
		|  |  
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9588
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 3:20 pm |   |  
				| 
 |  
				| couple of 'issues'.. 
 The schematic show a PIC16F877 but code shows 18F452......
 
 which is the real PIC ?
 
 
 The RSSI PWM output will only ever get to about 3 volts,about 2/3 of the 877 ADC range....
 
 Jay
 |  |  
		|  |  
		| Ringo42 
 
 
 Joined: 07 May 2004
 Posts: 263
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 3:26 pm |   |  
				| 
 |  
				| Google found the old post. Damn my bad memory. I don't remember that issue at all, but it has been a long time since I worked on this. 
 Yes it really is a 452. I'm not concerned about the 2/3 range stuff.
 I'll fix the delay_ms and see if that does it.
 Thanks PCMP
 _________________
 Ringo Davis
 |  |  
		|  |  
		| Ringo42 
 
 
 Joined: 07 May 2004
 Posts: 263
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 3:36 pm |   |  
				| 
 |  
				| well it is not the delay. This does not run either
 
 
  	  | Code: |  	  | #include "18f452.h" #fuses hs,NOWDT,noprotect,put,nolvp
 #device adc=10
 #use delay(clock=20000000)
 
 #define TX_PIN      PIN_C6
 #define RX_PIN      PIN_C7
 #define BAUD_RATE 19200
 #define Mux_sel     PIN_E2
 #define Mux_sel2     PIN_D4
 
 #use rs232(baud=BAUD_RATE,xmit=TX_PIN,rcv=RX_PIN,errors,bits=8,parity=N,restart_wdt)
 
 void main()
 {
 printf("Start\r\n");
 //output_low(MUX_Sel2);
 printf("Just set mux sel low \n\r");
 //output_high(MUX_Sel2);
 printf("Just set mux sel high \n\r");
 
 while(TRUE);
 }
 | 
 _________________
 Ringo Davis
 |  |  
		|  |  
		| Ringo42 
 
 
 Joined: 07 May 2004
 Posts: 263
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 3:45 pm |   |  
				| 
 |  
				| oops here is the lst 
  	  | Code: |  	  | CCS PCH C Compiler, Version 4.007, 34836               25-Feb-15 16:33 
 Filename: C:\Users\Hardware\Dropbox\21st century\Firmware\e2test.lst
 
 ROM used: 216 bytes (1%)
 Largest free fragment is 32552
 RAM used: 7 (0%) at main() level
 7 (0%) worst case
 Stack:    1 locations
 
 *
 0000:  GOTO   006E
 .................... #include "18f452.h"
 .................... //////// Standard Header file for the PIC18F452 device ////////////////
 .................... #device PIC18F452
 .................... #list
 ....................
 .................... #fuses hs,NOWDT,noprotect,put,nolvp
 .................... #device adc=10
 .................... #use delay(clock=20000000)
 ....................
 .................... #define TX_PIN      PIN_C6
 .................... #define RX_PIN      PIN_C7
 .................... #define BAUD_RATE 19200
 .................... #define Mux_sel     PIN_E2
 .................... #define Mux_sel2     PIN_D4
 ....................
 .................... #use rs232(baud=BAUD_RATE,xmit=TX_PIN,rcv=RX_PIN,errors,bits=8,parity=N,restart_wdt)
 ....................
 .................... void main()
 .................... {
 006E:  CLRF   FF8
 0070:  BCF    FD0.7
 0072:  CLRF   FEA
 0074:  CLRF   FE9
 0076:  MOVLW  40
 0078:  MOVWF  FAF
 007A:  MOVLW  A6
 007C:  MOVWF  FAC
 007E:  MOVLW  90
 0080:  MOVWF  FAB
 0082:  BSF    FC1.0
 0084:  BSF    FC1.1
 0086:  BSF    FC1.2
 0088:  BCF    FC1.3
 008A:  CLRF   05
 .................... printf("Start\r\n");
 008C:  CLRF   06
 008E:  MOVF   06,W
 0090:  RCALL  0004
 0092:  INCF   06,F
 0094:  MOVWF  00
 0096:  CLRWDT
 0098:  BTFSS  F9E.4
 009A:  BRA    0096
 009C:  MOVWF  FAD
 009E:  MOVLW  07
 00A0:  SUBWF  06,W
 00A2:  BNZ   008E
 .................... //output_low(MUX_Sel2);
 .................... printf("Just set mux sel low \n\r");
 00A4:  CLRF   06
 00A6:  MOVF   06,W
 00A8:  RCALL  001C
 00AA:  INCF   06,F
 00AC:  MOVWF  00
 00AE:  CLRWDT
 00B0:  BTFSS  F9E.4
 00B2:  BRA    00AE
 00B4:  MOVWF  FAD
 00B6:  MOVLW  17
 00B8:  SUBWF  06,W
 00BA:  BNZ   00A6
 .................... //output_high(MUX_Sel2);
 .................... printf("Just set mux sel high \n\r");
 00BC:  CLRF   06
 00BE:  MOVF   06,W
 00C0:  RCALL  0044
 00C2:  INCF   06,F
 00C4:  MOVWF  00
 00C6:  CLRWDT
 00C8:  BTFSS  F9E.4
 00CA:  BRA    00C6
 00CC:  MOVWF  FAD
 00CE:  MOVLW  18
 00D0:  SUBWF  06,W
 00D2:  BNZ   00BE
 ....................
 .................... while(TRUE);
 00D4:  BRA    00D4
 .................... }
 00D6:  SLEEP
 
 Configuration Fuses:
 Word  1: 2200   HS NOOSCSEN
 Word  2: 0E0E   BROWNOUT WDT128 NOWDT BORV20 PUT
 Word  3: 0100   CCP2C1
 Word  4: 0081   STVREN NODEBUG NOLVP
 Word  5: C00F   NOPROTECT NOCPD NOCPB
 Word  6: E00F   NOWRT NOWRTD NOWRTB NOWRTC
 Word  7: 400F   NOEBTR NOEBTRB
 
 | 
 _________________
 Ringo Davis
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 3:51 pm |   |  
				| 
 |  
				| I installed PCH vs. 4.007 and compiled your program above, and I ran it on a PicDem2-Plus (old version) and it basically worked:
 
  	  | Code: |  	  | ÓÓStart Just set mux sel low
 Just set mux sel high
 
 | 
 I got a couple garbage characters before the start, but it displayed all
 messages in TeraTerm.
 
 I think you're using an LVP programmer.  Can you do a Verify and check
 if the code was written to the PIC properly ?
 |  |  
		|  |  
		| Ringo42 
 
 
 Joined: 07 May 2004
 Posts: 263
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Feb 25, 2015 3:53 pm |   |  
				| 
 |  
				| I'm using an ICD-U64. I just did a verify and it passed. _________________
 Ringo Davis
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |