View previous topic :: View next topic |
Author |
Message |
otxoasound
Joined: 07 May 2013 Posts: 6
|
Please, help! (18F series) |
Posted: Tue May 07, 2013 1:27 am |
|
|
Hello.
It is the first time I post here. I need help. It is the first time I am using a 18F26J53. The program is very simple. I am just trying to blink a led. I am using the internal oscillator with the PLL to get 48 MHz. The program works in Proteus, but not in the real circuit. Here is the code:
#include <18f26j53.h>
#fuses PLL2 //8 MHz internal oscillator divided by 2 to get 4 MHz to PLL.
#fuses PLLEN //Enables PLL.
#fuses NOCPUDIV //I want 48 MHz, so I don´t need to divide it.
#fuses NOPROTECT //Code not protected.
#fuses NOWDT //No Watchdog.
#fuses INTRC_PLL_IO //Internal oscillator with PLL. No CLKOUT in RA6.
#fuses SOSC_DIG //I want to use RC0 an RC1 as digital IO.
#fuses NOCLOCKOUT //No clockout in RA6.
#fuses NOFCMEN //Disables Fail-safe monitoring.
#fuses NOIESO //Disables switching between internal and external osc.
#fuses NODSWDT //Watchdog disabled in sleep mode.
#fuses IOL1WAY //Multiple remappable pin configurations disabled.
#fuses NOWPCFG //Configuration words not protected.
#fuses LS48MHZ //If we use low speed USB (48 MHz/8 = 6 MHz).
#fuses RTCOSC_INT //RTCC uses internal oscillator.
#use delay (clock=48000000)
#byte port_B=0xF81
//--------------------------------------------------------------------------------
void main (void)
{
set_tris_b(0x00);
while(TRUE)
{
port_B=0xFF;
delay_ms(1000);
port_B=0x00;
delay_ms(1000);
}
}
Thank you in advance for you help!!! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19546
|
|
Posted: Tue May 07, 2013 3:05 am |
|
|
Try disabling the ADC.
Normally the port wakes up set up for analog I/O.
So:
(use the code buttons...)
Code: |
#include <18f26j53.h>
#fuses PLL2 //8 MHz internal oscillator divided by 2 to get 4 MHz to PLL.
#fuses PLLEN //Enables PLL.
#fuses NOCPUDIV //I want 48 MHz, so I don´t need to divide it.
#fuses NOPROTECT //Code not protected.
#fuses NOWDT //No Watchdog.
#fuses INTRC_PLL_IO //Internal oscillator with PLL. No CLKOUT in RA6.
//#fuses SOSC_DIG //This enables the secondary oscillator in digital mode...
#fuses NOCLOCKOUT //No clockout in RA6.
#fuses NOFCMEN //Disables Fail-safe monitoring.
#fuses NOIESO //Disables switching between internal and external osc.
#fuses NODSWDT //Watchdog disabled in sleep mode.
#fuses IOL1WAY //Multiple remappable pin configurations disabled.
#fuses NOWPCFG //Configuration words not protected.
#fuses LS48MHZ //If we use low speed USB (48 MHz/8 = 6 MHz).
#fuses RTCOSC_INT //RTCC uses internal oscillator.
#use delay (clock=48000000)
//--------------------------------------------------------------------------------
void main (void)
{
//set_tris_b(0x00);
setup_adc_ports(NO_ANALOGS);
while(TRUE)
{
output_b(0xFF);
delay_ms(1000);
output_b(0x0);
delay_ms(1000);
}
}
|
I can confirm that with the original code, ADCON0, and ADCON1, are set to zero, which means that all pins are set as analog.
As a comment, if you do start using the USB, you need to set the value 'USB_USE_FULL_SPEED' to FALSE before loading the USB drivers.
Best Wishes |
|
|
otxoasound
Joined: 07 May 2013 Posts: 6
|
|
Posted: Tue May 07, 2013 4:11 am |
|
|
Hello.
Thanks for your help. When I simulate the code in MPLAB, the ADCON registers does not change. I add setup_adc(adc_off) too and nothing changes. Also, when I try to write FF to port A, in MPLAB, the register adquires the value EF. I can put FF in port A, only EF.
Thank you again. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue May 07, 2013 6:55 am |
|
|
Quote: | when I try to write FF to port A, in MPLAB, the register adquires the value EF. I can put FF in port A, only EF. | Only one answer: RTFM
If you can only set 0xEF then it means there is a problem with RA4.
Chapter 10.2 wrote: | PORTA is a 7-bit wide, bidirectional port. | 7 bit, not 8 bit. Now, check the tables 10-3 and 10-4... Surprise RA4 is missing! It is not implemented in the hardware for this chip.
Also, always post your compiler version number (4.xxx), just in case it is a known compiler problem. |
|
|
otxoasound
Joined: 07 May 2013 Posts: 6
|
|
Posted: Tue May 07, 2013 7:47 am |
|
|
Hello.
Yes, I forgot that port A was a 7 bit port. Thank you. The problem is that it does not work. The leds does not blink (always off). There is a voltage of 0,3 V in the port pins. I noticed that I forgot enable PLL. But it has not solved the problem. The new code (using port B) is:
Code: |
#include <18f26j53.h>
#fuses PLL2
#fuses PLLEN
#fuses NOCPUDIV
#fuses NOPROTECT
#fuses NOWDT
#fuses INTRC_PLL_IO
#fuses SOSC_DIG
#fuses NOCLOCKOUT
#fuses NOFCMEN
#fuses NOIESO
#use delay(internal=48MHZ)
//***********************************************************
void main (void)
{
setup_oscillator(OSC_PLL_ON);
set_tris_b(0x00);
while(TRUE)
{
output_b(0xFF);
delay_ms(1000);
output_b(0x00);
delay_ms(1000);
}
} | Thanks!!!! |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue May 07, 2013 8:14 am |
|
|
You are not a quick learner, aren't you?
- Ttelmah said to disable the ADC as this is enabled by default. PortB pins 0 to 3 all have analog inputs...
- I asked you to post your compiler version number, you didn't post it. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19546
|
|
Posted: Tue May 07, 2013 8:51 am |
|
|
otxoasound wrote: | Hello.
Thanks for your help. When I simulate the code in MPLAB, the ADCON registers does not change. I add setup_adc(adc_off) too and nothing changes. Also, when I try to write FF to port A, in MPLAB, the register adquires the value EF. I can put FF in port A, only EF.
Thank you again. |
Mistype.
ANCON, not ADCON.
Read the data sheet. Quote:
"The ANCON0 and ANCON1 registers are used to
configure the operation of the I/O pin associated with
each analog channel. Setting any one of the PCFG bits
configures the corresponding pin to operate as a digital
only I/O. Clearing a bit configures the pin to operate as
an analog input for either the A/D Converter or the
comparator module. All digital peripherals are disabled
and digital inputs read as ‘0’. As a rule, I/O pins that are
multiplexed with analog inputs default to analog
operation on device Resets."
The pins will _never_ work as digital I/O, till they are deselected from being analog. The line:
setup_adc_ports(NO_ANALOGS);
Does this.
You always need to ensure that everything else that uses pins is turned off, before they will run as normal I/O.
On port B:
Comparator.
SPI
CCP |
|
|
otxoasound
Joined: 07 May 2013 Posts: 6
|
|
Posted: Tue May 07, 2013 9:12 am |
|
|
This is for ckielstra: Maybe I am not a quick learner, but you should read before write. In previous posts I wrote that I disabled all analog inputs (turning off the ad converter and disabling all analog inputs) so this is not the problem.
This is for the pollite people (not ckielstra, of course): the compiler version is 4.114
Thanks |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue May 07, 2013 12:28 pm |
|
|
Maybe I'm not nice (I admit it is not my best day today), but all we have is your posted code and in the last version you didn't disable the analog ports.
I don't have v4.110. Can you post the full list file (*.lst) so we can compare the generated code to a newer compiler version? |
|
|
otxoasound
Joined: 07 May 2013 Posts: 6
|
|
Posted: Wed May 08, 2013 1:43 am |
|
|
Hello.
Here is the .lst file:
Code: |
CCS PCH C Compiler, Version 4.114, xxxxx 07-may-13 15:14
Filename: C:\Documents and Settings\Otxoa\Escritorio\parpadeo\parpadeo.lst
ROM used: 150 bytes (0%)
Largest free fragment is 65378
RAM used: 5 (0%) at main() level
6 (0%) worst case
Stack: 1 locations
*
0000: GOTO 002C
.................... #include <18f26j53.h>
.................... //////// Standard Header file for the PIC18F26J53 device ////////////////
.................... #device PIC18F26J53
.................... #list
....................
.................... #fuses PLL2
.................... #fuses PLLEN
.................... #fuses NOCPUDIV
.................... #fuses NOPROTECT
.................... #fuses NOWDT
.................... #fuses INTRC_PLL_IO
.................... #fuses SOSC_DIG
.................... #fuses NOCLOCKOUT
.................... #fuses NOFCMEN
.................... #fuses NOIESO
.................... #use delay(internal=48MHZ)
0004: CLRF FEA
0006: MOVLW 06
0008: MOVWF FE9
000A: MOVF FEF,W
000C: BZ 002A
000E: MOVLW 0F
0010: MOVWF 01
0012: CLRF 00
0014: DECFSZ 00,F
0016: BRA 0014
0018: DECFSZ 01,F
001A: BRA 0012
001C: MOVLW 8F
001E: MOVWF 00
0020: DECFSZ 00,F
0022: BRA 0020
0024: NOP
0026: DECFSZ FEF,F
0028: BRA 000E
002A: RETLW 00
....................
.................... void main (void)
.................... {
002C: CLRF FF8
002E: BCF FD0.7
0030: CLRF FEA
0032: CLRF FE9
0034: MOVLW 40
0036: MOVWF F9B
0038: MOVLW 70
003A: MOVWF FD3
003C: MOVF FD3,W
003E: MOVLW FF
0040: MOVLB F
0042: MOVWF x48
0044: BCF FC2.6
0046: BCF FC2.7
0048: MOVF x49,W
004A: ANDLW E0
004C: IORLW 1F
004E: MOVWF x49
0050: CLRF x25
0052: CLRF FD1
0054: CLRF FD2
.................... setup_oscillator(OSC_PLL_ON);
0056: MOVLW 40
0058: MOVWF F9B
005A: CLRF FD3
005C: MOVF FD3,W
.................... set_tris_b(0x00);
005E: MOVLW 00
0060: MOVWF F93
.................... while(TRUE)
.................... {
.................... output_b(0xFF);
0062: CLRF F93
0064: MOVLW FF
0066: MOVWF F8A
.................... delay_ms(1000);
0068: MOVLW 04
006A: MOVWF 05
006C: MOVLW FA
006E: MOVWF 06
0070: MOVLB 0
0072: RCALL 0004
0074: DECFSZ 05,F
0076: BRA 007A
0078: BRA 007E
007A: MOVLB F
007C: BRA 006C
.................... output_b(0x00);
007E: CLRF F93
0080: CLRF F8A
.................... delay_ms(1000);
0082: MOVLW 04
0084: MOVWF 05
0086: MOVLW FA
0088: MOVWF 06
008A: RCALL 0004
008C: DECFSZ 05,F
008E: BRA 0086
.................... }
0090: MOVLB F
0092: BRA 0062
.................... }
....................
0094: BRA 0094
Configuration Fuses:
Word 1: F70C NOWDT PLL2 PLLEN NOSTVREN NOXINST DEBUG NOCPUDIV NOPROTECT
Word 2: FF12 INTRC_PLL_IO SOSC_DIG NOCLOCKOUT NOFCMEN NOIESO WDT32768
Word 3: FBFF DSWDTOSC_INT RTCOSC_T1 DSBOR DSWDT DSWDT2147483648 IOL1WAY ADC10 MSSPMSK7
Word 4: FBBF WPFP NOWPCFG WPDIS WPBEG LS48MHZ
Some fuses have been forced to be compatible with the ICD debugger. |
|
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Wed May 08, 2013 5:05 am |
|
|
You're still not disabling analogue, and there is no need in CCS for the TRIS.
Ttelmah showed you both of these with a rewritten code sample in his first response.
Mike |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed May 08, 2013 6:04 am |
|
|
I don't have the time now to check everything, but it turns out the CCS compiler adds code for disabling the analog ports by default: Code: | 003E: MOVLW FF
0040: MOVLB F
0042: MOVWF x48
0044: BCF FC2.6
0046: BCF FC2.7
0048: MOVF x49,W |
CCP is also disabled by the compiler on startup.
If the analog port and CCP aren't the problem then perhaps it is a problem with the clock circuit?
Like I said, I don't have time to look into it so perhaps someone else can have a look? |
|
|
kaem1189
Joined: 27 Dec 2011 Posts: 12
|
|
Posted: Wed May 08, 2013 7:27 pm |
|
|
Hello,
Have you tried disabling spi, i2c and uart as well as ccp? I see that port B is multiplexed with these features. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu May 09, 2013 2:02 am |
|
|
I don't have an 18F26J53, but I do have an 18F27J53 and they are in
the same PIC family. This code works. It was tested in hardware with
vs. 4.114.
Code: |
#include <18F27J53.h>
#fuses INTRC_PLL_IO, PLL2, PLLEN
#use delay(clock=48M)
//=================================
void main()
{
setup_oscillator(OSC_8MHZ);
while(1)
{
output_b(0xFF);
delay_ms(500);
output_b(0x00);
delay_ms(500);
}
} |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19546
|
|
Posted: Thu May 09, 2013 4:07 am |
|
|
Yes. The code I posted, worked for me on 4.110, which didn't automatically set the bits for digital I/O. I gave up at that point....
Best Wishes |
|
|
|