|
|
View previous topic :: View next topic |
Author |
Message |
JerryR
Joined: 07 Feb 2008 Posts: 167
|
Target halts prematurely |
Posted: Wed Apr 12, 2017 1:19 pm |
|
|
I am compiling code using PCWH 5.069 for a custom design target using a PIC16F1783. I'm using a PICKIT3 and MPLAB 8.90 IDE. The problem I'm having is that the target intermittently halts prematurely and the debugger shows the position in code past the final bracket. IDE output window indicates: Running...
Target halted
No breakpoint set.
Have trimmed the code down to the bare minimum and problem still occuring. MCLR line pulled up to Vdd through 47K resistor and the MCLR appear pretty normal. Using external crystal at 4.0 MHz.
Here's the simplified code. Anyone see anything that would be causing the code to go off into the weeds? Thanks so much for your additional suggestions.
MAIN:
Code: |
//Released
#include <16F1783.h>
#include <Ready Ref RX(Rev A).h>
//===========================================================================================================
void Check_Sig_Level(void)
{
int16 RSSI;
Active_Signal= FALSE;
set_adc_channel(0); //ready to read sensor input
delay_us(50); //AtoD set-up delay
RSSI =read_adc(); //get value
if (RSSI <= Squelch_Level)
Active_Signal= FALSE;
else
Active_Signal= TRUE;
}
//===========================================================================================================
//===========================================================================================================
//System timing interrupt
#INT_TIMER1 // This function is called every 5ms
void One_Second_timer(void)
{
Sec_Ticks++;
if (Sec_Ticks >= 30)
{
Sec_Ticks= 0;
Sec_Flag= TRUE;
}
}
//===========================================================================================================
//===========================================================================================================
void main()
{
signed int8 value;
int8 msg;
int8 i;
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_2 );
set_timer1(0);
Sec_Ticks= 0;
Sec_Flag= FALSE;
enable_interrupts(INT_TIMER1); // Enable timer0 interrupt
disable_interrupts(GLOBAL); // Enable all interrupts
//Setup AtoD converter
setup_adc(ADC_CLOCK_INTERNAL|ADC_CLOCK_DIV_8);
setup_adc_ports( sAN0,VSS_VDD); //AN0(RSSI)
output_low(RED_LED);
while (1)
{
Check_Sig_Level();
if (Active_Signal==TRUE)
{
delay_cycles(72);
for(i=0; i<=8; ++i)
{
shift_left(&msg,1,input(RX_Data));
delay_cycles(60);
}
Active_Signal= FALSE;
}
}
}
//===========================================================================================================
|
Platform Hardware:
Code: |
#device adc=16
#FUSES XT //External crystal 4MHz Osc
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPUT //Power up timer off for debugging
#FUSES NOWDT
#use delay(xtal=4MHz) //using 4 MHz crystal
#define EXP_OUT_ENABLE PIN_B1
#define EXP_OUT_CLOCK PIN_B2
#define EXP_OUT_DO PIN_B5
#define NUMBER_OF_74595 1
#define RX_Data PIN_C7
#define Red_LED PIN_B3
#define Squelch_Level 20000 //squelch level
int8 characters[11] = {0xFE, 0x30, 0xAD, 0xB9, 0x33, 0x9B, 0x1F, 0xB0,0xBF, 0xB3, 0x00 };
int8 Sec_Ticks;
int1 Sec_Flag;
int1 Active_Signal;
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Apr 12, 2017 1:55 pm |
|
|
Quote: | for(i=0; i<=8; ++i)
{
shift_left(&msg,1,input(RX_Data));
delay_cycles(60);
} |
This loop will execute 9 times. Do you want that ? If you want 8 times,
the test should be i < 8. |
|
|
JerryR
Joined: 07 Feb 2008 Posts: 167
|
|
Posted: Wed Apr 12, 2017 1:58 pm |
|
|
That's a fact PCM! Fixed that. See anything else that would cause the halt issue? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19546
|
|
Posted: Wed Apr 12, 2017 2:32 pm |
|
|
This is wrong:
setup_adc(ADC_CLOCK_INTERNAL|ADC_CLOCK_DIV_8);
You want just ADC_CLOCK_DIV_8. This uses the master clock/8. ADC_CLOCK_INTERNAL selects the internal RC clock (which can't have a divider, and is not recommended above 1MHz).
Things that can be or'ed together, say in the include file. Other things must not be.
However I doubt this will cause a peculiar crash.
Check the actual listing file. What fuses actually are set?.
Target halted, suggests it has actually gone into the higher memory somewhere, and executed the 'sleep' instruction there.
I'd be suspicious of something like an electrical spike. What is being actually 'done' by the I/O lines?. Anything nearby?. What is the supply?. |
|
|
JerryR
Joined: 07 Feb 2008 Posts: 167
|
|
Posted: Wed Apr 12, 2017 4:56 pm |
|
|
Ttelmah: Thank you for the steer. Yes, after some investigation I did use the internal clock and have had no more crashes. I'll fix the AtoD setup issue. I kept thinking it had to do with MCLR noise, but that signal is solid.
All that make a lot of sense.
Thanks so much for your interest. Best regards. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9245 Location: Greensville,Ontario
|
|
Posted: Wed Apr 12, 2017 6:10 pm |
|
|
I'm still puzzled by the 'one second timer' ISR , if called every 5 ms and updated 30 times ,isn't that just 150 ms ??
or am I missing 'something'....???? |
|
|
JerryR
Joined: 07 Feb 2008 Posts: 167
|
|
Posted: Wed Apr 12, 2017 6:12 pm |
|
|
Good catch, but just mislabeled. |
|
|
JerryR
Joined: 07 Feb 2008 Posts: 167
|
|
Posted: Fri Apr 14, 2017 9:26 am |
|
|
I am having a strange issue(s) that are plaguing my development of a project. This is a continuing issue involving this particular progect. PCWH version 5.069, MPLab 8.90 IDE, target PIC16F1783, PICKit3 debugger.
Referencing the following code which is simplified to help troubleshooting
If I add a line in the top of my main routine to simply set a flag (Sec_Flag= FALSE;) the last instruction (output_low(RED_LED);) does not execute. This line could be any flag, not just Sec_Flag. Simply commenting this one line out fixes the problem. I think this problem is associated with the earlier problems I was having where the controller went to the weeds.
I beg the group's indulgence. Does anyone here see anything that would cause this problem. Hardware appears to be solid and this problem occurs intermittently. I'm attaching the listing files; one resulting in the issue, one resulting in no issue.
I'm stumped.
Code: |
//Released
#include <16F1783.h>
#include <Ready Ref RX(Rev A).h>
//===========================================================================================================
void main()
{
int8 value;
int8 msg;
int8 i;
int16 t;
Sec_Ticks= 0;
Sec_Flag= FALSE;
setup_comparator_1(NC_NC);
setup_comparator_2(NC_NC);
setup_comparator_3(NC_NC);
disable_interrupts(GLOBAL); // Enable all interrupts
//Setup AtoD converter
setup_adc(ADC_CLOCK_DIV_8);
setup_adc_ports( sAN0); //AN0(RSSI)
output_low(RED_LED);
while (True)
{
// Sec_Flag= FALSE; !!!!!!!!!! Line added causes issue !!!!!!!!!!!!!!!!
set_adc_channel(0); //ready to read sensor input
RSSI =read_adc(); //get value
if (RSSI > Squelch_Level)
{
output_high(RED_LED);
delay_cycles(10);
output_low(RED_LED);
while (input(RX_Data)); //stay here while high
output_high(RED_LED);
delay_cycles(2);
output_low(RED_LED);
for(i=1; i<=8; ++i)
{
for(i=1; i<=8; ++i)
delay_cycles(100);
output_high(RED_LED);
delay_cycles(10);
output_low(RED_LED);
}
delay_us(1);
}
}
}
//===========================================================================================================
|
Listing of good code:
Code: |
CCS PCM C Compiler, Version 5.069, xxxxx 14-Apr-17 10:57
Filename: F:\Grimm Ready Ref RX\Ready Ref RX(Rev XX).lst
ROM used: 166 words (4%)
Largest free fragment is 2048
RAM used: 25 (5%) at main() level
35 (7%) worst case
Stack used: 0 locations
Stack size: 15
*
0000: NOP
0001: MOVLP 00
0002: GOTO 003
.................... //Released
....................
.................... #include <16F1783.h>
.................... //////////// Standard Header file for the PIC16F1783 device ////////////////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996, 2014 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. ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... #device PIC16F1783
....................
.................... #list
....................
.................... #include <Ready Ref RX(Rev A).h>
.................... #device adc=16
....................
.................... #FUSES INTRC_IO //External crystal 4MHz Osc
.................... #FUSES NOBROWNOUT //No brownout reset
.................... #FUSES NOPUT //Power up timer off for debugging
.................... #FUSES NOWDT
....................
....................
....................
.................... #use delay(int=4MHz) //using 4 MHz crystal
....................
.................... #define EXP_OUT_ENABLE PIN_B1
.................... #define EXP_OUT_CLOCK PIN_B2
.................... #define EXP_OUT_DO PIN_B5
.................... #define NUMBER_OF_74595 1
....................
.................... #define RX_Data PIN_C7
.................... #define Red_LED PIN_B3
....................
....................
.................... #define Squelch_Level 7000 //squelch level
....................
....................
.................... int8 characters[11] = {0xFE, 0x30, 0xAD, 0xB9, 0x33, 0x9B, 0x1F, 0xB0,0xBF, 0xB3, 0x00 };
....................
....................
.................... int8 Sec_Ticks;
.................... int1 Sec_Flag;
.................... int1 Active_Signal;
....................
.................... int16 RSSI;
....................
....................
.................... //===========================================================================================================
.................... void main()
0003: MOVLW 6A
0004: MOVLB 01
0005: MOVWF 19
0006: MOVLB 03
0007: CLRF 0C
0008: CLRF 0D
0009: MOVLB 02
000A: CLRF 12
000B: CLRF 11
000C: MOVLW FE
000D: MOVLB 00
000E: MOVWF 20
000F: MOVLW 30
0010: MOVWF 21
0011: MOVLW AD
0012: MOVWF 22
0013: MOVLW B9
0014: MOVWF 23
0015: MOVLW 33
0016: MOVWF 24
0017: MOVLW 9B
0018: MOVWF 25
0019: MOVLW 1F
001A: MOVWF 26
001B: MOVLW B0
001C: MOVWF 27
001D: MOVLW BF
001E: MOVWF 28
001F: MOVLW B3
0020: MOVWF 29
0021: CLRF 2A
.................... {
.................... int8 value;
.................... int8 msg;
.................... int8 i;
.................... int16 t;
....................
.................... Sec_Ticks= 0;
0022: CLRF 2B
.................... Sec_Flag= FALSE;
0023: BCF 2C.0
.................... setup_comparator_1(NC_NC);
0024: MOVLW 3F
0025: MOVLB 02
0026: MOVWF 12
0027: CLRF 11
.................... setup_comparator_2(NC_NC);
0028: MOVWF 14
0029: CLRF 13
.................... setup_comparator_3(NC_NC);
002A: MOVWF 1F
002B: CLRF 1E
....................
.................... disable_interrupts(GLOBAL); // Enable all interrupts
002C: BCF 0B.6
002D: BCF 0B.7
002E: BTFSC 0B.7
002F: GOTO 02D
....................
.................... //Setup AtoD converter
.................... setup_adc(ADC_CLOCK_DIV_8);
0030: MOVLB 01
0031: BSF 1E.4
0032: BCF 1E.5
0033: BCF 1E.6
0034: BCF 1E.7
0035: BSF 1D.0
.................... setup_adc_ports( sAN0); //AN0(RSSI)
0036: BCF 1E.0
0037: BCF 1E.1
0038: BCF 1E.2
0039: MOVLW 01
003A: MOVLB 03
003B: MOVWF 0C
003C: MOVLW 00
003D: MOVWF 0D
....................
.................... output_low(RED_LED);
003E: MOVLB 01
003F: BCF 0D.3
0040: MOVLB 02
0041: BCF 0D.3
....................
.................... while (True)
.................... {
.................... // Sec_Flag= FALSE;
.................... set_adc_channel(0); //ready to read sensor input
0042: MOVLW 00
0043: MOVWF 78
0044: MOVLB 01
0045: MOVF 1D,W
0046: ANDLW 83
0047: IORWF 78,W
0048: MOVWF 1D
0049: MOVLW 0F
004A: MOVWF 78
004B: MOVF 1F,W
004C: ANDLW F0
004D: IORWF 78,W
004E: MOVWF 1F
.................... RSSI =read_adc(); //get value
004F: BSF 1D.1
0050: BTFSC 1D.1
0051: GOTO 050
0052: MOVF 1C,W
0053: MOVWF 7A
0054: MOVF 1B,W
0055: MOVLB 00
0056: MOVWF 2D
0057: MOVF 7A,W
0058: MOVWF 2E
.................... if (RSSI > Squelch_Level)
0059: MOVF 2E,W
005A: SUBLW 1A
005B: BTFSC 03.0
005C: GOTO 0A3
005D: XORLW FF
005E: BTFSS 03.2
005F: GOTO 064
0060: MOVF 2D,W
0061: SUBLW 58
0062: BTFSC 03.0
0063: GOTO 0A3
.................... {
.................... output_high(RED_LED);
0064: MOVLB 01
0065: BCF 0D.3
0066: MOVLB 02
0067: BSF 0D.3
.................... delay_cycles(10);
0068: MOVLW 03
0069: MOVWF 77
006A: DECFSZ 77,F
006B: GOTO 06A
.................... output_low(RED_LED);
006C: MOVLB 01
006D: BCF 0D.3
006E: MOVLB 02
006F: BCF 0D.3
....................
.................... while (input(RX_Data)); //stay here while high
0070: MOVLB 01
0071: BSF 0E.7
0072: MOVLB 00
0073: BTFSS 0E.7
0074: GOTO 077
0075: MOVLB 02
0076: GOTO 070
....................
.................... output_high(RED_LED);
0077: MOVLB 01
0078: BCF 0D.3
0079: MOVLB 02
007A: BSF 0D.3
.................... delay_cycles(2);
007B: GOTO 07C
.................... output_low(RED_LED);
007C: MOVLB 01
007D: BCF 0D.3
007E: MOVLB 02
007F: BCF 0D.3
....................
....................
.................... for(i=1; i<=8; ++i)
0080: MOVLW 01
0081: MOVLB 00
0082: MOVWF 31
0083: MOVF 31,W
0084: SUBLW 08
0085: BTFSS 03.0
0086: GOTO 0A2
.................... {
.................... for(i=1; i<=8; ++i)
0087: MOVLW 01
0088: MOVWF 31
0089: MOVF 31,W
008A: SUBLW 08
008B: BTFSS 03.0
008C: GOTO 093
.................... delay_cycles(100);
008D: MOVLW 21
008E: MOVWF 77
008F: DECFSZ 77,F
0090: GOTO 08F
0091: INCF 31,F
0092: GOTO 089
.................... output_high(RED_LED);
0093: MOVLB 01
0094: BCF 0D.3
0095: MOVLB 02
0096: BSF 0D.3
.................... delay_cycles(10);
0097: MOVLW 03
0098: MOVWF 77
0099: DECFSZ 77,F
009A: GOTO 099
.................... output_low(RED_LED);
009B: MOVLB 01
009C: BCF 0D.3
009D: MOVLB 02
009E: BCF 0D.3
009F: MOVLB 00
00A0: INCF 31,F
00A1: GOTO 083
.................... }
....................
.................... delay_us(1);
00A2: NOP
....................
.................... }
00A3: MOVLB 02
00A4: GOTO 042
.................... }
.................... }
....................
00A5: GOTO 0A5
....................
.................... //===========================================================================================================
Configuration Fuses:
Word 1: 19E4 INTRC_IO NOWDT NOPUT MCLR NOPROTECT NOCPD NOBROWNOUT NOCLKOUT IESO NOFCMEN
Word 2: 0EFF NOWRT NOVCAP PLL_SW STVREN BORV19 NOLPBOR DEBUG NOLVP
Some fuses have been forced to be compatible with the ICD debugger.
|
Listing of BAD code:
Code: |
CCS PCM C Compiler, Version 5.069, xxxxx 14-Apr-17 10:54
Filename: F:\Grimm Ready Ref RX\Ready Ref RX(Rev XX).lst
ROM used: 167 words (4%)
Largest free fragment is 2048
RAM used: 25 (5%) at main() level
35 (7%) worst case
Stack used: 0 locations
Stack size: 15
*
0000: NOP
0001: MOVLP 00
0002: GOTO 003
.................... //Released
....................
.................... #include <16F1783.h>
.................... //////////// Standard Header file for the PIC16F1783 device ////////////////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996, 2014 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. ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... #device PIC16F1783
....................
.................... #list
....................
.................... #include <Ready Ref RX(Rev A).h>
.................... #device adc=16
....................
.................... #FUSES INTRC_IO //External crystal 4MHz Osc
.................... #FUSES NOBROWNOUT //No brownout reset
.................... #FUSES NOPUT //Power up timer off for debugging
.................... #FUSES NOWDT
....................
....................
....................
.................... #use delay(int=4MHz) //using 4 MHz crystal
....................
.................... #define EXP_OUT_ENABLE PIN_B1
.................... #define EXP_OUT_CLOCK PIN_B2
.................... #define EXP_OUT_DO PIN_B5
.................... #define NUMBER_OF_74595 1
....................
.................... #define RX_Data PIN_C7
.................... #define Red_LED PIN_B3
....................
....................
.................... #define Squelch_Level 7000 //squelch level
....................
....................
.................... int8 characters[11] = {0xFE, 0x30, 0xAD, 0xB9, 0x33, 0x9B, 0x1F, 0xB0,0xBF, 0xB3, 0x00 };
....................
....................
.................... int8 Sec_Ticks;
.................... int1 Sec_Flag;
.................... int1 Active_Signal;
....................
.................... int16 RSSI;
....................
....................
.................... //===========================================================================================================
.................... void main()
0003: MOVLW 6A
0004: MOVLB 01
0005: MOVWF 19
0006: MOVLB 03
0007: CLRF 0C
0008: CLRF 0D
0009: MOVLB 02
000A: CLRF 12
000B: CLRF 11
000C: MOVLW FE
000D: MOVLB 00
000E: MOVWF 20
000F: MOVLW 30
0010: MOVWF 21
0011: MOVLW AD
0012: MOVWF 22
0013: MOVLW B9
0014: MOVWF 23
0015: MOVLW 33
0016: MOVWF 24
0017: MOVLW 9B
0018: MOVWF 25
0019: MOVLW 1F
001A: MOVWF 26
001B: MOVLW B0
001C: MOVWF 27
001D: MOVLW BF
001E: MOVWF 28
001F: MOVLW B3
0020: MOVWF 29
0021: CLRF 2A
.................... {
.................... int8 value;
.................... int8 msg;
.................... int8 i;
.................... int16 t;
....................
.................... Sec_Ticks= 0;
0022: CLRF 2B
.................... Sec_Flag= FALSE;
0023: BCF 2C.0
.................... setup_comparator_1(NC_NC);
0024: MOVLW 3F
0025: MOVLB 02
0026: MOVWF 12
0027: CLRF 11
.................... setup_comparator_2(NC_NC);
0028: MOVWF 14
0029: CLRF 13
.................... setup_comparator_3(NC_NC);
002A: MOVWF 1F
002B: CLRF 1E
....................
.................... disable_interrupts(GLOBAL); // Enable all interrupts
002C: BCF 0B.6
002D: BCF 0B.7
002E: BTFSC 0B.7
002F: GOTO 02D
....................
.................... //Setup AtoD converter
.................... setup_adc(ADC_CLOCK_DIV_8);
0030: MOVLB 01
0031: BSF 1E.4
0032: BCF 1E.5
0033: BCF 1E.6
0034: BCF 1E.7
0035: BSF 1D.0
.................... setup_adc_ports( sAN0); //AN0(RSSI)
0036: BCF 1E.0
0037: BCF 1E.1
0038: BCF 1E.2
0039: MOVLW 01
003A: MOVLB 03
003B: MOVWF 0C
003C: MOVLW 00
003D: MOVWF 0D
....................
.................... output_low(RED_LED);
003E: MOVLB 01
003F: BCF 0D.3
0040: MOVLB 02
0041: BCF 0D.3
....................
.................... while (True)
.................... {
.................... Sec_Flag= FALSE;
0042: MOVLB 00
0043: BCF 2C.0
.................... set_adc_channel(0); //ready to read sensor input
0044: MOVLW 00
0045: MOVWF 78
0046: MOVLB 01
0047: MOVF 1D,W
0048: ANDLW 83
0049: IORWF 78,W
004A: MOVWF 1D
004B: MOVLW 0F
004C: MOVWF 78
004D: MOVF 1F,W
004E: ANDLW F0
004F: IORWF 78,W
0050: MOVWF 1F
.................... RSSI =read_adc(); //get value
0051: BSF 1D.1
0052: BTFSC 1D.1
0053: GOTO 052
0054: MOVF 1C,W
0055: MOVWF 7A
0056: MOVF 1B,W
0057: MOVLB 00
0058: MOVWF 2D
0059: MOVF 7A,W
005A: MOVWF 2E
.................... if (RSSI > Squelch_Level)
005B: MOVF 2E,W
005C: SUBLW 1A
005D: BTFSC 03.0
005E: GOTO 0A5
005F: XORLW FF
0060: BTFSS 03.2
0061: GOTO 066
0062: MOVF 2D,W
0063: SUBLW 58
0064: BTFSC 03.0
0065: GOTO 0A5
.................... {
.................... output_high(RED_LED);
0066: MOVLB 01
0067: BCF 0D.3
0068: MOVLB 02
0069: BSF 0D.3
.................... delay_cycles(10);
006A: MOVLW 03
006B: MOVWF 77
006C: DECFSZ 77,F
006D: GOTO 06C
.................... output_low(RED_LED);
006E: MOVLB 01
006F: BCF 0D.3
0070: MOVLB 02
0071: BCF 0D.3
....................
.................... while (input(RX_Data)); //stay here while high
0072: MOVLB 01
0073: BSF 0E.7
0074: MOVLB 00
0075: BTFSS 0E.7
0076: GOTO 079
0077: MOVLB 02
0078: GOTO 072
....................
.................... output_high(RED_LED);
0079: MOVLB 01
007A: BCF 0D.3
007B: MOVLB 02
007C: BSF 0D.3
.................... delay_cycles(2);
007D: GOTO 07E
.................... output_low(RED_LED);
007E: MOVLB 01
007F: BCF 0D.3
0080: MOVLB 02
0081: BCF 0D.3
....................
....................
.................... for(i=1; i<=8; ++i)
0082: MOVLW 01
0083: MOVLB 00
0084: MOVWF 31
0085: MOVF 31,W
0086: SUBLW 08
0087: BTFSS 03.0
0088: GOTO 0A4
.................... {
.................... for(i=1; i<=8; ++i)
0089: MOVLW 01
008A: MOVWF 31
008B: MOVF 31,W
008C: SUBLW 08
008D: BTFSS 03.0
008E: GOTO 095
.................... delay_cycles(100);
008F: MOVLW 21
0090: MOVWF 77
0091: DECFSZ 77,F
0092: GOTO 091
0093: INCF 31,F
0094: GOTO 08B
.................... output_high(RED_LED);
0095: MOVLB 01
0096: BCF 0D.3
0097: MOVLB 02
0098: BSF 0D.3
.................... delay_cycles(10);
0099: MOVLW 03
009A: MOVWF 77
009B: DECFSZ 77,F
009C: GOTO 09B
.................... output_low(RED_LED);
009D: MOVLB 01
009E: BCF 0D.3
009F: MOVLB 02
00A0: BCF 0D.3
00A1: MOVLB 00
00A2: INCF 31,F
00A3: GOTO 085
.................... }
....................
.................... delay_us(1);
00A4: NOP
....................
.................... }
00A5: GOTO 043
.................... }
.................... }
....................
00A6: GOTO 0A6
....................
.................... //===========================================================================================================
Configuration Fuses:
Word 1: 19E4 INTRC_IO NOWDT NOPUT MCLR NOPROTECT NOCPD NOBROWNOUT NOCLKOUT IESO NOFCMEN
Word 2: 0EFF NOWRT NOVCAP PLL_SW STVREN BORV19 NOLPBOR DEBUG NOLVP
Some fuses have been forced to be compatible with the ICD debugger.
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Apr 14, 2017 10:14 am |
|
|
Could you point out exactly what line doesn't execute. Because the
actual "last line" is the delay_us(1); line. Post the main() program
and add a comment to the line that doesn't execute.
2nd thing. You have this weird construct here:
Quote: | for(i=1; i<=8; ++i)
{
for(i=1; i<=8; ++i)
delay_cycles(100);
output_high(RED_LED);
delay_cycles(10);
output_low(RED_LED);
} |
You have a 2nd for() loop stuck in there, using the same index variable 'i'.
The inner loop will finish with 'i' set to 8. This will make the outer loop
end after the first pass. Is this what you want ?
3rd. This comment should be corrected:
Quote: | disable_interrupts(GLOBAL); // Enable all interrupts |
|
|
|
JerryR
Joined: 07 Feb 2008 Posts: 167
|
|
Posted: Fri Apr 14, 2017 11:01 am |
|
|
PCM: Thanks for your reply. It's been a long time since I've had this amount of randomness in performance. Yes, I did have the inside index the same index as the outside. Fixed now.. When it works, it works as expected. I'm just trying to mark the positions of operation on a scope using a probe on an existing LED.
Frustrating thing now the code run once through the main routine and drops past the last bracket and halts.
Just randomness! I'm almost to the point that I think I have a bad PIC!
Before, when I added any flag set to true on the first line in MAIN, the code did not execute the final output_high(Red_LED); (marked). Take out that line and the code runs as expected by executing the final output_high(Red_LED);
Believe me, I stripped-out a lot of code to find this (these) issues. Here's the code, fixed as you requested.
Thanks so much for your eyes on this.
Code: |
//Released
#include <16F1783.h>
#include <Ready Ref RX(Rev A).h>
//===========================================================================================================
void main()
{
int8 value;
int8 msg;
int8 i;
int16 t;
Sec_Ticks= 0;
Sec_Flag= FALSE;
setup_comparator_1(NC_NC);
setup_comparator_2(NC_NC);
setup_comparator_3(NC_NC);
enable_interrupts(GLOBAL); // Enable all interrupts
//Setup AtoD converter
setup_adc(ADC_CLOCK_DIV_8);
setup_adc_ports( sAN0); //AN0(RSSI)
output_low(RED_LED);
while (True)
{
// Sec_Flag= FALSE; !!!!!!! Add this line and the last output_high(Red_LED); doesn't execute
set_adc_channel(0); //ready to read sensor input
RSSI =read_adc(); //get value
if (RSSI > Squelch_Level)
{
output_high(RED_LED);
delay_cycles(10);
output_low(RED_LED);
while (input(RX_Data)); //stay here while high
output_high(RED_LED);
delay_cycles(2);
output_low(RED_LED);
for(i=1; i<=8; ++i)
{
for(t=1; t<=8; ++t)
delay_cycles(100);
output_high(RED_LED);
delay_cycles(10);
output_low(RED_LED); //!!!!!!!!! this line doesn't execute !!!!!
}
delay_us(1);
}
}
}
|
And the .h file:
Code: |
#device adc=16
#FUSES INTRC_IO //External crystal 4MHz Osc
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPUT //Power up timer off for debugging
#FUSES NOWDT
#use delay(int=4MHz) //using 4 MHz crystal
#define EXP_OUT_ENABLE PIN_B1
#define EXP_OUT_CLOCK PIN_B2
#define EXP_OUT_DO PIN_B5
#define NUMBER_OF_74595 1
#define RX_Data PIN_C7
#define Red_LED PIN_B3
#define Squelch_Level 7000 //squelch level
int8 characters[11] = {0xFE, 0x30, 0xAD, 0xB9, 0x33, 0x9B, 0x1F, 0xB0,0xBF, 0xB3, 0x00 };
int8 Sec_Ticks;
int1 Sec_Flag;
int1 Active_Signal;
int16 RSSI;
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19546
|
|
Posted: Fri Apr 14, 2017 11:14 am |
|
|
You do realise, that:
Code: |
for(t=1; t<=8; ++t)
delay_cycles(100);
|
Is just equivalent to
delay_cycles(700);
....... |
|
|
JerryR
Joined: 07 Feb 2008 Posts: 167
|
|
Posted: Fri Apr 14, 2017 11:18 am |
|
|
Yes, I know. That's another thing! Delays (us and ms) were unpredictable. |
|
|
JerryR
Joined: 07 Feb 2008 Posts: 167
|
|
Posted: Fri Apr 14, 2017 11:24 am |
|
|
Ttelmah: Am I wrong?
Syntax:
delay_cycles (count)
Parameters:
count - a constant 1-255 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Apr 14, 2017 11:37 am |
|
|
Tell us how you're testing this. Are you compiling with MPLAB set to
Debug mode (in the dropdown box on the MPLAB menu bar) ?
Are you stepping through the code in debug, or using Animate ?
Or are you clicking on the Run button ?
What happens if you compile in Release mode and run it ?
Does it then work ?
Tell us about the board. Did you build it yourself or did you buy it ?
If you bought it, post a link to the board's webpage.
What is the Vdd voltage of the PIC on the board ?
Is the board self-powered, or is the Pickit used to supply power ?
If self powered, describe the power supply.
If you built the board, does it have 100 nF cap on the Vdd pin ? |
|
|
JerryR
Joined: 07 Feb 2008 Posts: 167
|
|
Posted: Fri Apr 14, 2017 11:52 am |
|
|
OK, all good questions.
I've tried both, compiling in Debug and release mode. Same thing.
If I single-step through code- steps through Main loop once then falls right through all end brackets and ends up Halting. Same hing also happens in Animate. Running results in Run then halt.
What happens if you compile in Release mode and run it ?
Does it then work ?
Same thing- Release and Debug modes
Proprietary design. Pretty simple- Vdd is 4.98volts. MCLR pulled-up to 4.92 volts through 47K resistor. Known good PICKit3. I'll try both an ICD3 and realICE later to see if that may be the issue.
Board is self-powered. Good clean DC on microcontroller, bypassed with 0.1uF at the chip. Regulator 7805 from 24 volts bus. Well bypassed and loaded approximately 50mA.
Thanks! |
|
|
|
|
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
|