| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| pmuldoon 
 
 
 Joined: 26 Sep 2003
 Posts: 218
 Location: Northern Indiana
 
 
			    
 
 | 
			
				| 16F690 port problem & simple program |  
				|  Posted: Tue Jan 25, 2011 1:50 pm |   |  
				| 
 |  
				| I had a program that worked. Long story short, I methodically stripped it down to where I cant even get the IO ports to work in the PICSIM, let alone in the circuit.
 Ultimately, I want to control PIN_C6 high/low, and PIN_C4 tristate/low.
 But I've gotten to the point I can't even turn on the IO pins in the sim.
 I've re-re-re-read the datasheet and tried everything I could think of trying. (I know I reversed my AND/OR's, just want to see the outputs change.)
 
 I know CCS did something cause I originally had a XMIT_ON_LOW_TO_HIGH in their header for the SPI, my latest upgrade didn't have that.
 
 Can anyone tell me why I can't get the (TRIS-low) outputs to toggle in this simple program.  I've tried CCS functions and tried writing directly to the registers as a final act of defiance or frustration (not sure which).
 
 
  	  | Code: |  	  | #include <16f690.h> #device ADC=10
 
 #fuses XT,BROWNOUT,NOWDT,PUT,MCLR,NOFCMEN,BROWNOUT_SW,NOIESO
 #use delay(clock=4000000)
 
 #Byte TRISC = 0x87
 #Byte PORTC = 0x07
 
 #define PIN_RESET    PIN_C4
 #define PIN_CS       PIN_C6
 
 //*** using FAST IO  instead ***
 //#use fixed_io(a_outputs=PIN_A2)
 //#use fixed_io(b_outputs=PIN_B4,PIN_B6,PIN_B7)
 //#use fixed_io(c_outputs=PIN_C2,PIN_C4,PIN_C5,PIN_C6,PIN_C7)
 //#use fast_io(all)
 //#use STANDARD_IO(C)
 
 
 /***************************************************************************/
 /****************************** MAIN ***************************************/
 void main()
 {
 set_tris_c(0);   //0b00001011);
 setup_adc_ports(NO_ANALOGS);
 
 /**************************** MAIN LOOP *******************************/
 
 while(TRUE)
 {
 
 /*** reset PD ***/
 PORTC |= 0b00010000;
 //      output_low(PIN_RESET);
 delay_uS(2);
 //      output_high(PIN_RESET);
 PORTC &= 0b11101111;
 //      output_float(PIN_RESET);
 
 PORTC = 0xFF;
 PORTC = 0;
 /*** pulse CS ***/
 PORTC |= 0b01000000;
 //      Output_Low(PIN_CS);
 delay_us(4);
 PORTC &= 0b10111111;
 //      Output_High(PIN_CS);
 
 }
 }
 | 
 |  | 
	
		|  | 
	
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 |  | 
	
		|  | 
	
		| pmuldoon 
 
 
 Joined: 26 Sep 2003
 Posts: 218
 Location: Northern Indiana
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jan 25, 2011 3:45 pm |   |  
				| 
 |  
				| I thought that WAS pretty simple. Okay, here.  I'm using PICSIM to watch the outputs cuz I am tired of loading it in my board and probing. (done it about 100 different ways).
 
 CCS PCM C Compiler, Version 4.118, 93506982               25-Jan-11 16:39
 mplab V 8.50
 
 just step thru this and tell me why C6 refuses to go high.
 Also, notice that setup_adc_ports(NO_ANALOGS); doesn't clear ANSEL.
 
  	  | Code: |  	  | 
 #include <16f690.h>
 #device ADC=10
 
 #fuses XT,BROWNOUT,NOWDT,PUT,MCLR,NOFCMEN,BROWNOUT_SW,NOIESO
 #use delay(clock=4000000)
 
 #Byte TRISC = 0x87
 #Byte PORTC = 0x07
 #Byte ANSEL   = 0x11E
 #define PIN_RESET    PIN_C4
 #define PIN_CS       PIN_C6
 
 
 /***************************************************************************/
 /****************************** MAIN ***************************************/
 void main()
 {
 
 setup_adc_ports(NO_ANALOGS);
 ANSEL = 0;
 /**************************** MAIN LOOP *******************************/
 
 while(TRUE)
 {
 output_low(PIN_RESET);
 output_high(PIN_RESET);
 output_Low(PIN_CS);
 output_High(PIN_CS);
 output_b(0xFF);
 }
 }
 | 
 
 
 and list:
 
  	  | Code: |  	  | CCS PCM C Compiler, Version 4.118, 93506982               25-Jan-11 16:39
 
 Filename: G:\JPD\Project Files\ENG051 Hoosier Transmitter Design\16F690\Eng051.lst
 
 ROM used: 50 words (1%)
 Largest free fragment is 2048
 RAM used: 5 (2%) at main() level
 5 (2%) worst case
 Stack:    0 locations
 
 *
 0000:  MOVLW  00
 0001:  MOVWF  0A
 0002:  GOTO   004
 0003:  NOP
 ....................
 ....................
 .................... #include <16f690.h>
 .................... //////// Standard Header file for the PIC16F690 device ////////////////
 .................... #device PIC16F690
 .................... #list
 ....................
 .................... #device ADC=10
 ....................
 .................... #fuses XT,BROWNOUT,NOWDT,PUT,MCLR,NOFCMEN,BROWNOUT_SW,NOIESO
 .................... #use delay(clock=4000000)
 ....................
 .................... #Byte TRISC = 0x87
 .................... #Byte PORTC = 0x07
 .................... #Byte ANSEL   = 0x11E
 .................... #define PIN_RESET    PIN_C4
 .................... #define PIN_CS       PIN_C6
 ....................
 .................... //*** using FAST IO  instead ***
 .................... //#use fixed_io(a_outputs=PIN_A2)
 .................... //#use fixed_io(b_outputs=PIN_B4,PIN_B6,PIN_B7)
 .................... //#use fixed_io(c_outputs=PIN_C2,PIN_C4,PIN_C5,PIN_C6,PIN_C7)
 .................... //#use fast_io(all)
 .................... //#use STANDARD_IO(C)
 ....................
 ....................
 .................... /***************************************************************************/
 .................... /****************************** MAIN ***************************************/
 .................... void main()
 .................... {
 0004:  CLRF   04
 0005:  BCF    03.7
 0006:  MOVLW  1F
 0007:  ANDWF  03,F
 0008:  BSF    03.6
 0009:  MOVF   1E,W
 000A:  ANDLW  C0
 000B:  MOVWF  1E
 000C:  CLRF   19
 000D:  CLRF   1A
 000E:  BSF    03.5
 000F:  CLRF   1E
 0010:  BCF    03.5
 0011:  CLRF   1B
 0012:  BCF    03.6
 0013:  BCF    0D.5
 ....................
 ....................    setup_adc_ports(NO_ANALOGS);
 0014:  BSF    03.6
 0015:  MOVF   1E,W
 0016:  ANDLW  C0
 0017:  MOVWF  1E
 ....................    ANSEL = 0;
 0018:  CLRF   1E
 ....................    /**************************** MAIN LOOP *******************************/
 ....................
 ....................    while(TRUE)
 ....................    {
 ....................       output_low(PIN_RESET);
 0019:  BSF    03.5
 001A:  BCF    03.6
 001B:  BCF    07.4
 001C:  BCF    03.5
 001D:  BCF    07.4
 ....................       output_high(PIN_RESET);
 001E:  BSF    03.5
 001F:  BCF    07.4
 0020:  BCF    03.5
 0021:  BSF    07.4
 ....................       output_Low(PIN_CS);
 0022:  BSF    03.5
 0023:  BCF    07.6
 0024:  BCF    03.5
 0025:  BCF    07.6
 ....................       output_High(PIN_CS);
 0026:  BSF    03.5
 0027:  BCF    07.6
 0028:  BCF    03.5
 0029:  BSF    07.6
 ....................       output_b(0xFF);
 002A:  BSF    03.5
 002B:  CLRF   06
 002C:  MOVLW  FF
 002D:  BCF    03.5
 002E:  MOVWF  06
 ....................    }
 002F:  BSF    03.6
 0030:  GOTO   019
 .................... }
 0031:  SLEEP
 
 Configuration Fuses:
 Word  1: 31E1   XT NOWDT PUT MCLR NOPROTECT NOCPD BROWNOUT_SW NOIESO NOFCMEN
 
 }
 | 
 |  | 
	
		|  | 
	
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jan 25, 2011 4:03 pm |   |  
				| 
 |  
				| I'm using the "low pin count" demo board that comes with the PicKit 2 to test your 16F690 program.  That board doesn't have a crystal on it
 so I changed the oscillator fuse from XT to INTRC_IO.   I compiled it
 with vs. 4.118 and it works.  It toggles pin C6.   On my oscilloscope
 it goes high for 12us and then it goes low for 12us, continuously.
 |  | 
	
		|  | 
	
		| pmuldoon 
 
 
 Joined: 26 Sep 2003
 Posts: 218
 Location: Northern Indiana
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jan 25, 2011 4:58 pm |   |  
				| 
 |  
				| Well, I'm baffled. I'll try it again in the morning.
 If the problem can't be duplicated, maybe it won't be duplicated by me in the morning, either.
 
 Thanks for the effort.
 |  | 
	
		|  | 
	
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9588
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jan 25, 2011 5:48 pm |   |  
				| 
 |  
				| Pin shorted to ground ???? |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jan 26, 2011 2:55 am |   |  
				| 
 |  
				| Or oscillator not working, or MCLR not pulled up. Try INTRC_IO, and if it starts working, you have found the problem.
 Check the voltage on the MCLR pin. If it is not up near the 5v, again 'found reason'.
 
 Best Wishes
 |  | 
	
		|  | 
	
		| pmuldoon 
 
 
 Joined: 26 Sep 2003
 Posts: 218
 Location: Northern Indiana
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jan 26, 2011 8:10 am |   |  
				| 
 |  
				| Hmmm... I put the old (20MHz) xtal in the new board and read the program off of the old working board and loaded it...and it worked fine.
 
 Then I recompiled the original program (after correcting the now missing define) and it...worked fine (still with the old 20MHz xtal).
 
 I guess it's possible the board just doesn't like the shiney new 4MHz xtal, and that in the process I accidentally found some other bug to chase in PICSIM??
 
 I'll scope out the xtal signals, although I'm not really sure what I'm looking for (overdriving?).
 And then review my code again for changes needed for the new xtal.  Maybe I missed something?
 fuse to XT (also tried HS and INTOSC)
 clock = 4000000
 PWM registers adjusted
 AD clock changed
 SPI clock changed (but not really critical, would just run slower)
 Timer2 adjusted (interrupt to blink LED)
 
 That's really about all this little program uses.
 |  | 
	
		|  | 
	
		| pmuldoon 
 
 
 Joined: 26 Sep 2003
 Posts: 218
 Location: Northern Indiana
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 27, 2011 6:39 am |   |  
				| 
 |  
				| got a reply from CCS. They sent me a corrected device & header file.
 
 So I had:
 wrong resistor value
 bad pic (in 2 units, didn't expect that)
 compiler bug
 
 No wonder it was confusing.
 |  | 
	
		|  | 
	
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9588
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 27, 2011 6:49 am |   |  
				| 
 |  
				| It's nice to actually figure out WHAT was wrong! Far better than, 'mysteriously' it started to work right !!! |  | 
	
		|  | 
	
		| pmuldoon 
 
 
 Joined: 26 Sep 2003
 Posts: 218
 Location: Northern Indiana
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 27, 2011 7:04 am |   |  
				| 
 |  
				| roger that. 
 Now the next mystery:
 It APPEARS that changing the xtal to 4mhz (and associated code) killed the PIC.  I am going to switch back to the 20mhz and see if it comes back to life or not.  I'm guessing not.  I know that doesn't make sense.
 will know this morning.
 
 Like Sherlock Holmes once said:
 When you rule out the logical explanations, whatever is left, no matter how illogical, must be the truth! (or something like that)
 |  | 
	
		|  | 
	
		| pmuldoon 
 
 
 Joined: 26 Sep 2003
 Posts: 218
 Location: Northern Indiana
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 27, 2011 7:51 am |   |  
				| 
 |  
				| using the new device & header files from CCS has caused my "simple" program that wasn't working in PICSIM to WORK in PICSIM! 
 PCMProgrammer, why did it work for you?  Maybe you had the updated support files already?
 |  | 
	
		|  | 
	
		| pmuldoon 
 
 
 Joined: 26 Sep 2003
 Posts: 218
 Location: Northern Indiana
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 27, 2011 12:25 pm |   |  
				| 
 |  
				| No pic problems. It was an illusion caused by the compiler bugs.
 It had somehow caused my SPI data to update on the opposite clk edge,
 and caused one of my IO lines to behave strangely.
 
 Add to that the unexpected change of crystal and the wrong resistor in the feedback circuit...
 
 works fine now.
 |  | 
	
		|  | 
	
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 27, 2011 1:36 pm |   |  
				| 
 |  
				|  	  | Quote: |  	  | PCMProgrammer, why did it work for you | 
 I have the PCM command line compiler, vs. 4.118, downloaded on Jan 22, 2011.
 I did a fresh install just now.  I took your source code from this post
 http://www.ccsinfo.com/forum/viewtopic.php?t=44550&start=2
 and pasted it into a MPLAB 16F690 project.   I changed only one thing.
 I changed the oscillator fuse to INTRC_IO.  I compiled it and programmed
 it into the 16F690 on my Microchip "Low pin count demo board" that comes
 with the Pickit 2.   I looked at pin C6 with my scope and it's toggling at
 about 40 KHz.  It works.
 |  | 
	
		|  | 
	
		| pmuldoon 
 
 
 Joined: 26 Sep 2003
 Posts: 218
 Location: Northern Indiana
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 27, 2011 2:11 pm |   |  
				| 
 |  
				| Thanks for looking at it, PCM. There are 2 registers for configuring ports to analog/digital.
 C6-7 are actually in ANSELH, which CCS wasn't setting up properly. (Something I also missed when I configured them directly.)
 So they were never set up as IO lines.
 
 Don't know why it worked for you but not for me.
 |  | 
	
		|  | 
	
		|  |