|
|
View previous topic :: View next topic |
Author |
Message |
gjs_rsdi
Joined: 06 Feb 2006 Posts: 468 Location: Bali
|
Serial communication with 16F1847 - SOLVED |
Posted: Thu Apr 28, 2016 4:53 am |
|
|
Hi
I can't find the reason the PIC16F1847 serial communication won't work at clock speed of 8MHz.
Code: | #include <16F648A.h>
#FUSES WDT
//***************FUSES for 8MHz external clock*********************
#FUSES EC_IO//for external clock
#use delay(clock=8000000,RESTART_WDT)//for external clock
//***************FUSES for 4MHz internal RC oscilator**************
//#FUSES INTRC_IO//for internal oscilator
//#use delay(clock=4000000,RESTART_WDT)//for internal oscilator
//*****************************************************************
#FUSES BROWNOUT,MCLR,NOLVP,PUT
//*****************************************************************
#FUSES PROTECT//for code protection
//#FUSES NOPROTECT//no code protection
//*****************************************************************
#FUSES NOCPD//Data EEPROM NOT Code Protected
//#FUSES CPD//Data EEPROM Code Protected
//*****************************************************************
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,restart_wdt)//for external clock
//#use rs232(baud=4800,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,restart_wdt)//for internal oscilator
//***************************************************************** |
The above one works
Code: | #include <16F1847.h>
#device ADC=10
#FUSES WDT
#FUSES ECH
#FUSES PLL
#FUSES NOIESO
#FUSES BORV25
#FUSES MCLR,NOLVP,PUT
#FUSES NOFCMEN
//*****************************************************************
#FUSES PROTECT
//*****************************************************************
#FUSES NOCPD
//*****************************************************************
#use delay(clock=32M)
//*****************************************************************
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,restart_wdt)
//***************************************************************** |
The above works
Code: | #include <16F1847.h>
#device ADC=10
#FUSES WDT
#FUSES INTRC_IO
#FUSES NOIESO
#FUSES BORV25
#FUSES MCLR,NOLVP,PUT
#FUSES NOFCMEN
//*****************************************************************
#FUSES PROTECT//for code protection
//*****************************************************************
#FUSES NOCPD//Data EEPROM NOT Code Protected
//*****************************************************************
#use delay(internal=16000000,restart_wdt)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,restart_wdt) |
The above works also
Code: | #include <16F1847.h>
#device ADC=10
#FUSES WDT
#FUSES NOIESO
#FUSES BORV25
#FUSES MCLR,NOLVP,PUT
#FUSES NOFCMEN
//*****************************************************************
#FUSES PROTECT
//*****************************************************************
#FUSES NOCPD
//*****************************************************************
#use delay(internal=32M)
//*****************************************************************
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,restart_wdt) |
The above works
Code: | #include <16F1847.h>
#device ADC=10
#FUSES WDT //Watch Dog Timer
#FUSES ECH,NOCLKOUT
#FUSES PLL_SW
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES MCLR,NOLVP,PUT //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOFCMEN
//*****************************************************************
#FUSES PROTECT//for code protection
//*****************************************************************
#FUSES NOCPD//Data EEPROM NOT Code Protected
//*****************************************************************
#use delay(clock=8000000,restart_wdt)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,restart_wdt) |
The above serial communication don't work, everything else works including LED blink
Code: | #include <16F1847.h>
#device ADC=10
#FUSES WDT //Watch Dog Timer
#FUSES INTRC_IO //internal oscillator
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES MCLR,NOLVP,PUT
#FUSES NOFCMEN
//*****************************************************************
#FUSES PROTECT//for code protection
//*****************************************************************
#FUSES NOCPD//Data EEPROM NOT Code Protected
//*****************************************************************
#use delay(internal=8000000,restart_wdt)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,restart_wdt) |
The above serial communication don't work, all other functions work including LED flash.
Any ideas?
Tested many time, same terminal, same hardware.
Best wishes
Joe
Last edited by gjs_rsdi on Fri Apr 29, 2016 11:32 pm; edited 1 time in total |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9226 Location: Greensville,Ontario
|
|
Posted: Thu Apr 28, 2016 5:58 am |
|
|
OK, I don't use that PIC but did download the datasheet...
The 8MHz option appears to be tied to the PLL as wel as the clk mux( divider) so it could be a compiler 'bug' not setting the correct bits though there is no 'disable' bit, would have to see a listing to decode though. And the compiler version !
I do recall seeing a similar problem here awhile ago perhaps same PIC or family member, maybe search for that thread.
As a general comment, normally you do not det the 'protect' fuse until product goes out the door .
Also during testing I never enable the WDT until I'm sure the othe rcode is 100%. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19511
|
|
Posted: Thu Apr 28, 2016 7:22 am |
|
|
Your very first one is saying it does work.....
Don't protect code when debugging. Doing so _shortens the life of the chip_.
It implies a full erase has to be performed every time even when only a tiny part of the code changes.....
Having the watchdog enabled, and then scattering 'restarts' into the code in delays and serial, is basically pointless as well. Do some reading on the watchdog, and understand why this is _not_ the way to use it.
Removing all the pointless remarked lines (and the protect).
Code: |
#include <16F648A.h>
#FUSES WDT
#FUSES EC_IO//for external clock
#use delay(clock=8000000,RESTART_WDT)
#FUSES BROWNOUT,MCLR,NOLVP,PUT
#use rs232(baud=9600, parity=N,x mit=PIN_B2,rcv=PIN_B1, bits=8, restart_wdt)
//for external clock
|
You say this does work?.
The one you say doesn't work, are you enabling the PLL in software?. If so, then 'of course' it won't work. The flash will be at the wrong speed.
Key thing with the LED flash, is to time it. If it is not at the speed it is meant to be, then your clock statement is wrong, and serial won't work. |
|
|
gjs_rsdi
Joined: 06 Feb 2006 Posts: 468 Location: Bali
|
|
Posted: Thu Apr 28, 2016 8:48 am |
|
|
Thank you for the advises temtronic and Ttelmah
With the 16F648A is a finished product and it works with 8MHz external clock and with the 4MHz internal RC after implementing the advises I got here. With the internal RC the communication is with no problems at 4,800.
Just wanted to migrate to the 16F1847 because I can run it at higher speed with the internal RC and the AC motor turning more smooth at 8MHz and up.
Added the code protection and WDT after all was working, forget to change at the 8MHz for the 16F1847.
Regarding the clock on both internal and external 8MHz it is correct as all the functions are working correct, including the AC motor that turns in the correct speeds and the LED blinks correctly, ones a second.
Not enabling PLL in software.
I will clear the unnecessary things per Ttelmah advice (for the 16F1847 as the 16F648A works OK) and will post the results.
Best wishes
Joe |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19511
|
|
Posted: Thu Apr 28, 2016 9:34 am |
|
|
OK.
Code: |
#include <16F1847.h>
#device ADC=10
#FUSES NOWDT //Watch Dog Timer - off for test
#FUSES ECH,NOCLKOUT
#FUSES PLL_SW
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES MCLR,NOLVP,PUT
#FUSES NOFCMEN
#FUSES STVREN
#use delay(clock=8MHz)
#use rs232(baud=9600,parity=N,UART1,bits=8,errors)
#byte APFCON0 = getenv("SFR:APFCON0")
#byte APFCON1 = getenv("SFR:APFCON1")
void main(void)
{
APFCON0=APFCON1=0;
delay_ms(1000);
printf("Test string\n");
while(TRUE);
}
|
The compiler is defaulting to setting the APFCON registers to 1. They are meant to default to 0. Hence the UART TX and RX are on the alternate pins, and your code will be using software serial.
I just tried this on a chip with an external frequency generator set to 8MHz, and it merrily output 9600bps data.
Compiler 5.058
As a comment you should always have 'ERRORS' when using the hardware UART, unless you are adding your own error handling code. |
|
|
gjs_rsdi
Joined: 06 Feb 2006 Posts: 468 Location: Bali
|
|
Posted: Thu Apr 28, 2016 3:07 pm |
|
|
Thanks Ttelmah
If I understand correct, with my initialization I am using software rs232?
Including at 16 and 32MHz?
I always used hardware rs232 (hope so) with:
Code: | enable_interrupts(INT_RDA);
disable_interrupts(INT_TBE);
enable_interrupts(INT_TBE); |
Same in this program
With:
Code: | #byte APFCON0 = getenv("SFR:APFCON0")
#byte APFCON1 = getenv("SFR:APFCON1")
APFCON0=APFCON1=0; |
I am forcing the chip to work with hardware rs232?
My compiler is the demo compiler: CCS PCM C Compiler, Version 5.056d, 1
Going to test it shortly
Best wishes
Joe |
|
|
gjs_rsdi
Joined: 06 Feb 2006 Posts: 468 Location: Bali
|
|
Posted: Thu Apr 28, 2016 3:47 pm |
|
|
Hi Ttelmah
Thank you for the help.
With 8MHz external clock tested and it works
With 8MHz internal clock tested, works, but sometimes don't answer to my request from the PC
the settings are:
Code: | #include <16F1847.h>
#device ADC=10
#FUSES NOWDT //Watch Dog Timer - off for test
#FUSES INTRC_IO //internal oscillator
//#FUSES ECH,NOCLKOUT
#FUSES PLL_SW
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES MCLR,NOLVP,PUT
#FUSES NOFCMEN
#FUSES STVREN
//#use delay(clock=8MHz)
#use delay(internal=8MHz)
#use rs232(baud=9600,parity=N,UART1,bits=8,errors)
#byte APFCON0 = getenv("SFR:APFCON0")
#byte APFCON1 = getenv("SFR:APFCON1")
APFCON0=APFCON1=0;//in main |
My question also, I am working with the hardware rs232 now? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Apr 28, 2016 4:38 pm |
|
|
Quote: | My question also, I am working with the hardware rs232 now? |
I'll tell you how to check this by yourself.
Make a short little program with your setup and a putc() statement
in main(). 0x55 is chosen as the character because it's a constant
and will be coded as a MOVLW 55 by the compiler, and it's easy to
locate in the .LST file. Other than that, the 0x55 is not important.
Code: |
#include <16F1847.h>
#device ADC=10
#FUSES NOWDT //Watch Dog Timer - off for test
#FUSES INTRC_IO //internal oscillator
//#FUSES ECH,NOCLKOUT
#FUSES PLL_SW
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES MCLR,NOLVP,PUT
#FUSES NOFCMEN
#FUSES STVREN
//#use delay(clock=8MHz)
#use delay(internal=8MHz)
#use rs232(baud=9600,parity=N,UART1,bits=8,errors)
#byte APFCON0 = getenv("SFR:APFCON0")
#byte APFCON1 = getenv("SFR:APFCON1")
//==========================
void main()
{
APFCON0=APFCON1=0;
putc(0x55);
while(TRUE);
} |
Compile it, then look at the .LST file below. Scroll down past main() until
you see this section below. Sometimes, the complete code will be here (if
it's hardware UART code). With this PIC and this compiler version (5.056)
the putchar code is not placed here. Instead it calls the @putchar routine.
Code: | .................... putc(0x55);
0021: MOVLW 55
0022: MOVLB 00
0023: GOTO @PUTCHARI_BIU_1
|
The @putchar routine is not labeled in the .LST file if you're using Symbolic
format for the .LST file. There are 2-3 ways to find the address and
location of the putchar routine. One is to load the .SYM file and look at
this section:
Code: | ROM Allocation:
000003 @PUTCHARI_BIU_1
00000A main
00000A @cinit1
00001E @cinit2 |
It shows us that @putchar is at program memory address 0003.
Going back to the .LST file, you can look at the code at address 0003.
It's just below the #use rs232() statement, which makes sense.
Quote: | .................... #use rs232(baud=9600,parity=N,UART1,bits=8,errors)
0003: BTFSS PIR1.TXIF
0004: GOTO 003
0005: MOVLB 03
0006: MOVWF TXREG
0007: MOVLP 00
0008: MOVLB 00
0009: GOTO 024 (RETURN) |
You can see that @putchar is accessing the hardware transmit status bit
TXIF, and it's writing data to the hardware transmit data register TXREG.
Therefore, the compiler is using hardware rs232. |
|
|
gjs_rsdi
Joined: 06 Feb 2006 Posts: 468 Location: Bali
|
|
Posted: Thu Apr 28, 2016 6:41 pm |
|
|
Hi PCM programmer
Thank you for the answer
I implemented the software you posted and tested
Following your instructions step by step, everything as you have written, except:
Code: | .................... #use rs232(baud=9600,parity=N,UART1,bits=8,errors)
0003: BTFSS 11.4
0004: GOTO 003
0005: MOVLB 03
0006: MOVWF 1A
0007: MOVLP 00
0008: MOVLB 00
0009: GOTO 024 (RETURN) |
Is 11.4 the PIR1.TXIF ? In the data sheet is byte 11 bit 4, I suppose it is correct
Is 1A the TXREG ? In the data sheet TXREG is at 19A, TMR2 at 01A
Page 22 in the data sheet
Thanks again for your help
Joe |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Apr 28, 2016 6:47 pm |
|
|
Go to the Project Build Options menu in your IDE and select
Symbolic Format for the list file format. Then re-compile and
you will see the register names. |
|
|
gjs_rsdi
Joined: 06 Feb 2006 Posts: 468 Location: Bali
|
|
Posted: Thu Apr 28, 2016 7:13 pm |
|
|
Hi PCM programmer
Made Symbolic Format for the LST file, project and .c but have no symbols, same as before.
I suppose is because of the demo program.
Joe |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Apr 28, 2016 7:17 pm |
|
|
The demo page claims the compiler demo is fully functional.
http://www.ccsinfo.com/ccsfreedemo.php
If it isn't, then CCS support needs to be informed of this.
After selecting Symbolic format, did you re-compile and re-load the .LST file ?
Anyway, look up the register addresses in the PIC data sheet.
That will allow you to interpret the .LST file. |
|
|
gjs_rsdi
Joined: 06 Feb 2006 Posts: 468 Location: Bali
|
|
Posted: Thu Apr 28, 2016 8:50 pm |
|
|
Hi PCM programmer
I done as you said, it didn't show Symbolic format.
My old compiler version 3.249 changing to Symbolic format (16F648A).
Regarding .LST interpretation as I wrote that page 22 of the data sheet states TXREG at 19A, TMR2 at 01A.
I tried the demo on my old computer and is OK.
Must be something in the new computer MPLAB or CCS installation.
Best wishes
Joe |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Apr 28, 2016 9:16 pm |
|
|
I'm sorry I wasted all these posts on Symbolic mode. Here is the answer:
Quote: | Is 11.4 the PIR1.TXIF ? In the data sheet is byte 11 bit 4, I suppose it is correct |
Yes, that's right.
Quote: | Is 1A the TXREG ? In the data sheet TXREG is at 19A |
Yes, it's TXREG.
Quote: | TMR2 at 01A
Page 22 in the data sheet |
That's right, but TMR2 is in Bank 0, but the code does a MOVLB 03 which
selects bank 3. That makes address 1A become 19A, which is TXREG. |
|
|
gjs_rsdi
Joined: 06 Feb 2006 Posts: 468 Location: Bali
|
|
Posted: Thu Apr 28, 2016 10:28 pm |
|
|
Thanks PCM programmer
I don't think you wasted your time, you helped me a lot and I am sure helped and will help people that will face the same problem
Thank you again for all your help
Joe |
|
|
|
|
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
|