| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| carl 
 
 
 Joined: 06 Feb 2008
 Posts: 240
 Location: Chester
 
 
			    
 
 | 
			
				| Please help me with 16 bit problem |  
				|  Posted: Sun Feb 17, 2008 9:49 am |   |  
				| 
 |  
				| I have a 16 bit unsigned long int (as a variable t. so t=16 bit unsigned long int ) and I don't know how I can write this value to two ports.
 
 Using PIC 18f4525
 #use fast_io(c)
 #use fast_io(d)
 set_tris_c(0x00);
 set_tris_d(0x00);
 
 Please help
 
 Carl
 |  |  
		|  |  
		| meereck 
 
 
 Joined: 09 Nov 2006
 Posts: 173
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Feb 17, 2008 11:48 am |   |  
				| 
 |  
				| considering you want to write lower 8 bits to PORT C and upper 8 bits to PORT D: unsigned int16 value= 0x77FF;
 output_C(value & 0xFF); // mask
 output_D(value >> 8); // shift left
 |  |  
		|  |  
		| carl 
 
 
 Joined: 06 Feb 2008
 Posts: 240
 Location: Chester
 
 
			    
 
 | 
			
				| 16 bit |  
				|  Posted: Sun Feb 17, 2008 12:20 pm |   |  
				| 
 |  
				| Thanks for replying. 
 My "value" is a variable called t - (from 0 to 65536)
 so i tried your code and changed the value to t:
 
 unsigned long int t;
 t= 0x77FF;
 output_C(t & 0xFF); // mask
 output_D(t >> 8); // shift left
 
 But i have no leds connected to the output to see if 't' is correct.
 what should i see??
 I have measured voltage with meter but no changes.
 Could you also explain the code please - apart from 't' are the hex numbers addresses to write to or actual numbers??
 
 Thanks for your help
 Carl
 I am using the picdem2 board (v2002)
 |  |  
		|  |  
		| meereck 
 
 
 Joined: 09 Nov 2006
 Posts: 173
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Feb 17, 2008 12:55 pm |   |  
				| 
 |  
				| I have just checked the outcome and it worked for me. You can also try the following:
 unsigned int16 value= 0x77FF;
 unsigned int8 tempvar;
 tempvar=value & 0xFF;
 output_C(tempvar);
 tempvar=value >> 8;
 output_D(tempvar);
 
 Explanation of the code:
 value & 0xFF : since 0xFF means b'11111111', the outcome of the function is that only the lower 8 bits of the value remain.
 
 value >> 8 : shifts value by 8 bits to left so that the lower 8 bits disappear and the upper 8 bits remain. In other words, the upper 8 bits replace the lower 8 bits.
 |  |  
		|  |  
		| carl 
 
 
 Joined: 06 Feb 2008
 Posts: 240
 Location: Chester
 
 
			    
 
 | 
			
				| 16 bit |  
				|  Posted: Sun Feb 17, 2008 1:01 pm |   |  
				| 
 |  
				| Thankyou so much meereck.  I will try the code tonight.  where does my "t" go though in your code?? 
 Carl
 |  |  
		|  |  
		| meereck 
 
 
 Joined: 09 Nov 2006
 Posts: 173
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Feb 17, 2008 1:07 pm |   |  
				| 
 |  
				| unsigned int16 value= 0x77FF; that is the variable I put to output ports.
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 |  |  
		|  |  
		| carl 
 
 
 Joined: 06 Feb 2008
 Posts: 240
 Location: Chester
 
 
			    
 
 | 
			
				| 16 bit |  
				|  Posted: Sun Feb 17, 2008 1:12 pm |   |  
				| 
 |  
				| So your variable is 0x77FF,  My variable is t, 
 Can i then just put
 output_C(t & 0xFF); // mask
 output_D(t >> 8); // shift left
 
 or does it have to different
 
 Carl
 |  |  
		|  |  
		| meereck 
 
 
 Joined: 09 Nov 2006
 Posts: 173
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Feb 17, 2008 1:13 pm |   |  
				| 
 |  
				| my apologize, thanx for clarifying.
 |  |  
		|  |  
		| carl 
 
 
 Joined: 06 Feb 2008
 Posts: 240
 Location: Chester
 
 
			    
 
 | 
			
				| 16 bit |  
				|  Posted: Sun Feb 17, 2008 1:15 pm |   |  
				| 
 |  
				| Thanks to all, 
 I have to go now - although i really don't want to.  Please could you just show me how the t is included,
 
 Upmost thanks
 
 Carl
 |  |  
		|  |  
		| carl 
 
 
 Joined: 06 Feb 2008
 Posts: 240
 Location: Chester
 
 
			    
 
 | 
			
				| 16 bit |  
				|  Posted: Sun Feb 17, 2008 4:47 pm |   |  
				| 
 |  
				| First of all thankyou both for all your asistance in this problem.  I have been learning as I'm going along. 
 The code I have tried is:
 
 output_C(t & 0xFF); // mask
 output_D(t >> 8); // shift right
 
 (where t is a 16 bit value)
 
 
 Now because the majority of pins are floating at the moment I am not getting anything out of the ports.Tomorrow i will wire up some LED's (with resistors) from the output pins to pos.  Hopefully if t=65536 then all the pins should be high - well thats what i'm hoping.
 
 THanks again for all your help, as well as the links.
 
 Carl
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Feb 17, 2008 4:54 pm |   |  
				| 
 |  
				|  	  | Quote: |  	  | Now because the majority of pins are floating at the moment | 
 Always post a complete test program, with #include, #fuses, and #use
 statements, and a main().    It should be a compilable program, that
 can be compiled with no errors.   You'll get better and quicker help from
 this forum if you do this.  Also post your compiler version.
 |  |  
		|  |  
		| carl 
 
 
 Joined: 06 Feb 2008
 Posts: 240
 Location: Chester
 
 
			    
 
 | 
			
				| 16 bit |  
				|  Posted: Sun Feb 17, 2008 5:14 pm |   |  
				| 
 |  
				| OK here is my program so far.  It doesn't include all the branches, just the ones that this discussion is on. 
 Main()
 code:
 
  	  | Code: |  	  | #include <18F4525.h> #include <math.h>
 #include <kbd.c>
 #include <lcd.c>
 #include <menu.c>
 #include <rampup.c>
 #include <rampdown.c>
 #include <steady.c>
 #include <stepup.c>
 #include <stepdown.c>
 #fuses NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
 #use delay(clock=4000000)
 #use fast_io(a)
 #use fast_io(b)
 #use fast_io(c)
 #use fast_io(d)
 #use fast_io(e)
 
 void main() {
 menu_init();
 while (1);
 }
 | 
 
 Menu_init()
 Code:
 
  	  | Code: |  	  | #use delay(clock=4000000) void rampup_init(void);
 void rampdown_init(void);
 void steady_init(void);
 void stepup_init(void);
 void stepdown_init(void);
 void menu_init(){
 char k;
 port_b_pullups(TRUE);
 lcd_init();
 kbd_init();
 loop:
 lcd_putc("\fPlease choose\n");
 lcd_putc("Mode");
 
 while (TRUE) {
 k=kbd_getc();
 if(k!=0)
 if(k=='1'){
 lcd_putc("\fFor Steady State\n");
 lcd_putc("Press enter");
 while (TRUE) {
 k=kbd_getc();
 if(k!=0)
 if(k=='2'){
 lcd_putc("\fSteady State\n");
 lcd_putc("Chosen");
 delay_ms(1500);
 steady_init();
 /////////////////////////////////////goto Steady State
 }
 else if(k=='1'){
 lcd_putc("\fFor Ramp Up/Down\n");
 lcd_putc("Press enter");
 while (TRUE) {
 k=kbd_getc();
 if(k!=0)
 if(k=='2'){
 lcd_putc("\fRamp Up/Down\n");
 lcd_putc("Chosen");
 delay_ms(1500);
 rampup_init();
 /////////////////////////////////////goto Ramp Up/Down
 }
 else if(k=='1'){
 lcd_putc("\fFor Ramp Down/Up\n");
 lcd_putc("Press enter");
 while (TRUE) {
 k=kbd_getc();
 if(k!=0)
 if(k=='2'){
 lcd_putc("\fRamp Down/Up\n");
 lcd_putc("Chosen");
 delay_ms(1500);
 rampdown_init();
 /////////////////////////////////////goto Ramp Down/Up
 }
 else if(k=='1'){
 lcd_putc("\fFor Step Up/Down\n");
 lcd_putc("Press enter");
 while (TRUE) {
 k=kbd_getc();
 if(k!=0)
 if(k=='2'){
 lcd_putc("\fStep Up/Down\n");
 lcd_putc("Chosen");
 delay_ms(1500);
 stepup_init();
 /////////////////////////////////////goto Step Up/Down
 }
 else if(k=='1'){
 lcd_putc("\fFor Step Down/Up\n");
 lcd_putc("Press enter");
 while (TRUE) {
 k=kbd_getc();
 if(k!=0)
 if(k=='2'){
 lcd_putc("\fStep Down/Up\n");
 lcd_putc("Chosen");
 delay_ms(1500);
 stepdown_init();
 /////////////////////////////////////goto Step Up/Down
 }
 else if(k=='1')
 goto loop;
 }
 }
 }
 }
 }
 }
 }
 }
 }
 }
 }
 }
 | 
 Steady_init
 Code:
 
  	  | Code: |  	  | #use delay(clock=4000000) #use fast_io(a)
 #use fast_io(b)
 #use fast_io(c)
 #use fast_io(d)
 #use fast_io(e)
 void steady_init(){
 int var1,var2,var4,var5,var6;
 unsigned long int r,s,t;
 char k,d,e,f,g,h,j,p,q;
 p=7;
 q=13;
 loop3:
 port_b_pullups(TRUE);
 lcd_init();
 kbd_init();
 lcd_putc("\St    0123456789\n");
 lcd_gotoxy(9,2);
 lcd_putc("**.***mA");
 lcd_gotoxy(7,1);
 while (TRUE) {
 k=kbd_getc();
 if(k!=0)
 if(k=='6'){
 lcd_gotoxy(++p,1); }
 else if(k=='4'){
 lcd_gotoxy(--p,1); }
 else if(k=='2'){
 d=e=f=g=h=j=lcd_getc(p,1);
 switch  (d)
 {
 case '0': lcd_gotoxy(9,2);
 lcd_putc("0*.***mA");
 var1=0;
 break;
 case '1': lcd_gotoxy(9,2);
 lcd_putc("1*.***mA");
 var1=1;
 break;
 case '2': lcd_gotoxy(9,2);
 lcd_putc("2*.***mA");
 var1=2;
 break;
 default:  goto loop3;
 }
 while (TRUE) {
 k=kbd_getc();
 if(k!=0)
 if(k=='6'){
 lcd_gotoxy(++p,1); }
 else if(k=='4'){
 lcd_gotoxy(--p,1); }
 else if(k=='2'){
 d=e=f=g=h=j=lcd_getc(p,1);
 switch  (e)
 {
 case '0': lcd_gotoxy(10,2);
 lcd_putc("0.***mA");
 var2=0;
 break;
 case '1': lcd_gotoxy(10,2);
 lcd_putc("1.***mA");
 var2=1;
 break;
 case '2': lcd_gotoxy(10,2);
 lcd_putc("2.***mA");
 var2=2;
 break;
 case '3': lcd_gotoxy(10,2);
 lcd_putc("3.***mA");
 var2=3;
 break;
 case '4': lcd_gotoxy(10,2);
 lcd_putc("4.***mA");
 var2=4;
 break;
 case '5': lcd_gotoxy(10,2);
 lcd_putc("5.***mA");
 var2=5;
 break;
 case '6': lcd_gotoxy(10,2);
 lcd_putc("6.***mA");
 var2=6;
 break;
 case '7': lcd_gotoxy(10,2);
 lcd_putc("7.***mA");
 var2=7;
 break;
 case '8': lcd_gotoxy(10,2);
 lcd_putc("8.***mA");
 var2=8;
 break;
 case '9': lcd_gotoxy(10,2);
 lcd_putc("9.***mA");
 var2=9;
 break;      }
 
 //      if (var1==2)&&(var2>0){
 //    goto loop3;
 //    break;}
 
 while (TRUE) {
 k=kbd_getc();
 if(k!=0)
 if(k=='6'){
 lcd_gotoxy(++p,1); }
 else if(k=='4'){
 lcd_gotoxy(--p,1); }
 else if(k=='2'){
 d=e=f=g=h=j=lcd_getc(p,1);
 switch  (f)
 {
 case '0': lcd_gotoxy(12,2);
 lcd_putc("0**mA");
 var4=0;
 break;
 case '1': lcd_gotoxy(12,2);
 lcd_putc("1**mA");
 var4=1;
 break;
 case '2': lcd_gotoxy(12,2);
 lcd_putc("2**mA");
 var4=2;
 break;
 case '3': lcd_gotoxy(12,2);
 lcd_putc("3**mA");
 var4=3;
 break;
 case '4': lcd_gotoxy(10,2);
 lcd_putc("4**mA");
 var4=4;
 break;
 case '5': lcd_gotoxy(12,2);
 lcd_putc("5**mA");
 var4=5;
 break;
 case '6': lcd_gotoxy(12,2);
 lcd_putc("6**mA");
 var4=6;
 break;
 case '7': lcd_gotoxy(12,2);
 lcd_putc("7**mA");
 var4=7;
 break;
 case '8': lcd_gotoxy(12,2);
 lcd_putc("8**mA");
 var4=8;
 break;
 case '9': lcd_gotoxy(12,2);
 lcd_putc("9**mA");
 var4=9;
 break;      }
 while (TRUE) {
 k=kbd_getc();
 if(k!=0)
 if(k=='6'){
 lcd_gotoxy(++p,1); }
 else if(k=='4'){
 lcd_gotoxy(--p,1); }
 else if(k=='2'){
 d=e=f=g=h=j=lcd_getc(p,1);
 switch  (g)
 {
 case '0': lcd_gotoxy(13,2);
 lcd_putc("0*mA");
 var5=0;
 break;
 case '1': lcd_gotoxy(13,2);
 lcd_putc("1*mA");
 var5=1;
 break;
 case '2': lcd_gotoxy(13,2);
 lcd_putc("2*mA");
 var5=2;
 break;
 case '3': lcd_gotoxy(13,2);
 lcd_putc("3*mA");
 var5=3;
 break;
 case '4': lcd_gotoxy(13,2);
 lcd_putc("4*mA");
 var5=4;
 break;
 case '5': lcd_gotoxy(13,2);
 lcd_putc("5*mA");
 var5=5;
 break;
 case '6': lcd_gotoxy(13,2);
 lcd_putc("6*mA");
 var5=6;
 break;
 case '7': lcd_gotoxy(13,2);
 lcd_putc("7*mA");
 var5=7;
 break;
 case '8': lcd_gotoxy(13,2);
 lcd_putc("8*mA");
 var5=8;
 break;
 case '9': lcd_gotoxy(13,2);
 lcd_putc("9*mA");
 var5=9;
 break;      }
 while (TRUE) {
 k=kbd_getc();
 if(k!=0)
 if(k=='6'){
 lcd_gotoxy(++p,1); }
 else if(k=='4'){
 lcd_gotoxy(--p,1); }
 else if(k=='2'){
 d=e=f=g=h=j=lcd_getc(p,1);
 switch  (h)
 {
 case '0': lcd_gotoxy(14,2);
 lcd_putc("0mA");
 var6=0;
 break;
 case '1': lcd_gotoxy(14,2);
 lcd_putc("1mA");
 var6=1;
 break;
 case '2': lcd_gotoxy(14,2);
 lcd_putc("2mA");
 var6=2;
 break;
 case '3': lcd_gotoxy(14,2);
 lcd_putc("3mA");
 var6=3;
 break;
 case '4': lcd_gotoxy(14,2);
 lcd_putc("4mA");
 var6=4;
 break;
 case '5': lcd_gotoxy(14,2);
 lcd_putc("5mA");
 var6=5;
 break;
 case '6': lcd_gotoxy(14,2);
 lcd_putc("6mA");
 var6=6;
 break;
 case '7': lcd_gotoxy(14,2);
 lcd_putc("7mA");
 var6=7;
 break;
 case '8': lcd_gotoxy(14,2);
 lcd_putc("8mA");
 var6=8;
 break;
 case '9': lcd_gotoxy(14,2);
 lcd_putc("9mA");
 var6=9;
 break;      }
 lcd_gotoxy(1,1);
 lcd_putc("\St Value OK? Y/N\n");
 lcd_gotoxy(13,1);
 
 while (TRUE) {
 
 k=kbd_getc();
 if(k!=0)
 if(k=='6'){
 lcd_gotoxy(++q,1); }
 else if(k=='4'){
 lcd_gotoxy(--q,1); }
 else if(k=='2'){
 d=e=f=g=h=j=lcd_getc(q,1);
 switch  (j)
 {
 case 'N': goto loop3;
 
 case 'Y': lcd_gotoxy(1,1);
 lcd_putc("St Running!      ");
 break;
 default : goto loop3; }
 set_tris_c(0x00);
 set_tris_d(0x00);
 r=((var1*10000)+(var2*1000)+(var4*100)+(var5*10)+(var6*1));
 s=(r-4000);
 t=(s*(65536/16000));
 output_C(t & 0xFF); // mask
 output_D(t >> 8); // shift right
 
 
 
 //if (t==0){
 //lcd_gotoxy(1,1);
 //lcd_putc("000000000"); }
 //else if (t!=0){
 //lcd_gotoxy(1,1);
 //lcd_putc("11111111");
 //break;}
 
 ///printf(lcd_putc,"%,%,%,%,%,%\n",var1,var2,var3,var4,var5,var6);
 
 }
 }
 }
 }
 }
 }
 }
 }
 }
 }
 }
 }
 }
 | 
 
 and as we can see near the bottom is the point in question:
 
 output_C(t & 0xFF); // mask
 output_D(t >> 8); // shift right
 
 This is the end of one branch of this project which is designed to output a static 16bit parallel value over 2 ports. will conect the led's to,morrow and see if it works.
 
 Carl
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Feb 17, 2008 5:37 pm |   |  
				| 
 |  
				| That's not a test program.  That's your entire program.   A test program is a small program that tests only the problem area.   You said you had
 a problem with the output pins floating, even though you had set the TRIS
 to "all outputs", and were writing values to the ports.
 
 The program below tests this problem.  That's all it does.    If it doesn't
 work, then you look closely at the program for errors.  If you don't see
 any, then you look at the .LST file for problems.  If it looks OK, then
 look at your board for problems.   If there's no problem with the board,
 then you look at the Errata documentation from Microchip for the PIC.
 And so on.
 
 Now, looking at your code below, the first thing I see is that there is no
 oscillator fuse.    With no fuse, the compiler sets the oscillator config bits
 to use the LP oscillator.  But that's for a 32.768 KHz watch crystal.
 I doubt that it will run a 4 MHz crystal. So the PIC will never start running
 and the outputs will remain in the power-up state, which is floating.
 Problem solved.  Add the XT fuse.
 
 That's why a test program is so important.  It's small enough so that
 you are forced to concentrate on the problem, and not get lost in
 hundreds of lines of code.
 
  	  | Code: |  	  | #include <18F4525.h>
 #fuses NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
 #use delay(clock=4000000)
 
 #use fast_io(c)
 #use fast_io(d)
 
 unsigned long int t;
 
 //=====================
 void main()
 {
 set_tris_c(0x00);
 set_tris_d(0x00);
 
 t = 0x55AA;
 
 output_C(t & 0xFF);
 output_D(t >> 8);
 
 while(1);
 }
 | 
 |  |  
		|  |  
		| carl 
 
 
 Joined: 06 Feb 2008
 Posts: 240
 Location: Chester
 
 
			    
 
 | 
			
				| 16 bit |  
				|  Posted: Mon Feb 18, 2008 2:53 am |   |  
				| 
 |  
				| Ok I understand the posting procedure now.  Thanks PCM Programmer,  I will do it like this from now on. I will try out several things tonight and hope that it works. 
 Carl
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |