| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| georpo 
 
 
 Joined: 18 Nov 2008
 Posts: 281
 Location: Athens, Greece.
 
 
			    
 
 | 
			
				| PIC16F1934 TRIS |  
				|  Posted: Thu May 20, 2010 12:22 am |   |  
				| 
 |  
				| Hello, 
 I am using a PIC16F1934 to interface a custom made lcd.
 
 I cannot get the tris registers to work. The "set_tris" function does not work.
 
 I tried this:
 
 
  	  | Code: |  	  | 
 #byte   TRISA = 0x8C
 #byte   TRISB = 0x8D
 #byte   TRISC = 0x8E
 #byte   TRISD = 0x8F
 #byte   TRISE = 0x90
 
 
 TRISA=0b00001100;
 TRISB=0b00000110;
 TRISC=0b00011000;
 
 
 
 | 
 
 The above should work but the disassembly listing says:
 
  	  | Code: |  	  | 
 TRISA=0b00001100;
 MOVLW 0xc
 MOVWF 0xc
 
 TRISB=0b00000110;
 MOVLW 0x6
 MOVWF 0xd
 
 TRISC=0b00011000;
 MOVLW 0x18
 MOVWF 0xe
 
 
 | 
 
 for some reason it writes to the PORT register and not the tris register.
 
 And the strangest thing, I tried this in assembly:
 
 
  	  | Code: |  	  | #asm
 CLRF   0x8C
 
 MOVLW   0x6
 MOVWF   0x8d
 
 MOVLW   0x18
 MOVWF   0x8e
 
 CLRF   0x8f
 #endasm
 
 | 
 
 The result is again:
 
 
  	  | Code: |  	  | 
 #asm
 CLRF   0x8C
 CLRF 0xc
 
 MOVLW   0x6
 MOVLW     0x6
 MOVWF   0x8d
 MOVWF     0xd
 
 MOVLW   0x18
 MOVLW     0x18
 MOVWF   0x8e
 MOVWF     0xe
 
 CLRF   0x8f
 CLRF 0xf
 #endasm
 
 | 
 
 It does not write to the register that I want. It write to the port register.
 
 Any help appreciated.
 
 George.
 |  | 
	
		|  | 
	
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 20, 2010 12:34 am |   |  
				| 
 |  
				| This type of PIC was recently added to the compiler.  What's your compiler version ?
 |  | 
	
		|  | 
	
		| georpo 
 
 
 Joined: 18 Nov 2008
 Posts: 281
 Location: Athens, Greece.
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 20, 2010 3:25 am |   |  
				| 
 |  
				| 4.093 |  | 
	
		|  | 
	
		| georpo 
 
 
 Joined: 18 Nov 2008
 Posts: 281
 Location: Athens, Greece.
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 20, 2010 4:25 am |   |  
				| 
 |  
				| And another question, 
 where is the EEPROM located? org 0x2100 does not work.
 |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19967
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 20, 2010 4:52 am |   |  
				| 
 |  
				| Look a few lines _above_ the assembler you show. The compiler will not switch banks, if it is already using the right page. Writing to address 0c, would be 'right', if the BSR is already pointing to the required page... 
 On the EEPROM, details of this are always found in the 'programming' data sheet for the chip. 0x1E000 for your chip.
 
 Best Wishes
 |  | 
	
		|  | 
	
		| georpo 
 
 
 Joined: 18 Nov 2008
 Posts: 281
 Location: Athens, Greece.
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 20, 2010 5:01 am |   |  
				| 
 |  
				| Ok, I agree with the bank Nr as far as it goes for assembly but in C it should work with the method below without caring about the banks. right? 
  	  | Code: |  	  | #byte   TRISA = 0x8C
 #byte   TRISB = 0x8D
 #byte   TRISC = 0x8E
 #byte   TRISD = 0x8F
 #byte   TRISE = 0x90
 
 
 TRISA=0b00001100;
 TRISB=0b00000110;
 TRISC=0b00011000;
 
 | 
 
 I have already tried 0x1E000, it does not work.
 
 #rom 0x1E000= {0,1,32,45,66,75}
 
 Any ideas?
 
 Thanks for the reply!
 |  | 
	
		|  | 
	
		| georpo 
 
 
 Joined: 18 Nov 2008
 Posts: 281
 Location: Athens, Greece.
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 20, 2010 5:11 am |   |  
				| 
 |  
				| I found a post by PCM programmer, he says: 
 http://www.ccsinfo.com/forum/viewtopic.php?t=42386&highlight=0x2100
 
 
  	  | Quote: |  	  | 
 To get the physical address in the PIC, divide the Hex file address by 2.
 This means the data eeprom starts at 0xF000.
 
 
 | 
 
 I tried this and it works.
 
 One problem solved!
 
 
 Now, I am searching for the tris problem.
 
 Thanks!
 |  | 
	
		|  | 
	
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 20, 2010 3:26 pm |   |  
				| 
 |  
				| I installed vs. 4.093 and compiled the following test program: 
  	  | Code: |  	  | #include <16F1934.h>
 #fuses INTRC_IO, NOWDT, PUT, NOLVP
 #use delay(clock=4000000)
 
 //==============================
 void main()
 {
 
 set_tris_a(0x55);
 set_tris_b(0xAA);
 set_tris_c(0x22);
 
 while(1);
 }
 
 | 
 
 Here is part of the .LST file, with my comments added.
 It shows that the correct TRIS register addresses are being used.
 The TRIS registers are in Bank 1, and that's the currently selected
 bank in the code below:
 
  	  | Code: |  	  | 0016:  MOVLB  01    // Bank 1
 0017:  CLRF   17    // WDTCON = 0
 0018:  MOVLW  07
 0019:  MOVWF  1C    // ADRESH = 0  ***Bug: not needed
 ....................
 .................... set_tris_a(0x55);
 001A:  MOVLW  55
 001B:  MOVWF  0C    // TRISA = 0x55
 .................... set_tris_b(0xAA);
 001C:  MOVLW  AA
 001D:  MOVWF  0D    // TRISB = 0xAA
 .................... set_tris_c(0x22);
 001E:  MOVLW  22
 001F:  MOVWF  0E    // TRISC = 0x22
 ....................
 
 | 
 |  | 
	
		|  | 
	
		| georpo 
 
 
 Joined: 18 Nov 2008
 Posts: 281
 Location: Athens, Greece.
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 20, 2010 11:06 pm |   |  
				| 
 |  
				| Yes, but TRISA = 0x8C and not 0xC. 
 Am I missing something here?
 |  | 
	
		|  | 
	
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 20, 2010 11:33 pm |   |  
				| 
 |  
				| It's all about bank selection.   Look at this table in the PIC data sheet: 
  	  | Quote: |  	  | TABLE 3-3: PIC16F1933/1934 MEMORY MAP, BANKS 0-7 | 
 Find the row for 00Ch on the left.  Then find the column for Bank 1.
 Now find the intersection of the row and the column.  It says "TRISA".
 That's because it's at offset 0x0C and it's in Bank 1.   Look just to the
 left of "TRISA", and you'll see the address, which is 0x8C.
 |  | 
	
		|  | 
	
		| Sica001 
 
 
 Joined: 14 Dec 2011
 Posts: 1
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Dec 14, 2011 2:51 am |   |  
				| 
 |  
				| I try yesterday with 4.129 version and problem is not solved. In my program output is ok but input not work(even input_state). Somebody know how to solve this problem ? 
 Regards
 Marius
 |  | 
	
		|  | 
	
		| ckielstra 
 
 
 Joined: 18 Mar 2004
 Posts: 3680
 Location: The Netherlands
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Dec 14, 2011 7:50 am |   |  
				| 
 |  
				| Marius, 
 Please don't ask your new and unrelated question in a thread that was solved and closed 1.5 years ago.
 
 We have no clue what you are talking about.
 Start a new thread. Post a short but complete example program of maximum 20 lines. If the question is related to inputs and outputs then describe in short the hardware connected to these pins, even better, post a schematic.
 |  | 
	
		|  | 
	
		|  |