|
|
View previous topic :: View next topic |
Author |
Message |
Jerry I
Joined: 14 Sep 2003 Posts: 96 Location: Toronto, Ontario, Canada
|
printf problem (Solved) |
Posted: Tue Mar 01, 2016 9:03 pm |
|
|
Thank you in advance for any help.
I got a new PIC16F1619 to use CLC Functions
I have used the PIC16F1509 with no problems. The code I ported is from the PIC16F1509 which
worked with no problems.
Compiler version PCM 5.052
The problem is the interupt #int_timer2 routine.
If I uncomment any code in the #int_timer2 routine the printf("Hello World\r\n")
in the main() loop code will get corrupted (chopped up).
I will post part of my program which will compile.
Code: |
#device PIC16F1619
#include <16F1619.h>
#fuses intrc_io, nowdt, noprotect, nolvp, put
#fuses nomclr, nodebug
#device *=16
#device adc=8
#byte TRISA = getenv("SFR:TRISA")
#byte TRISB = getenv("SFR:TRISB")
#byte TRISC = getenv("SFR:TRISC")
// #define CLOCK98MHZ
// #define CLOCK8MHZ
#define CLOCK16MHZ
#define TEST_BIT rc1
#define TEST_BIT2 rc2
#define PHASE_B ra3
#define PHASE_A rc7
// #define EL_PHASE_A rd2
// #define EL_PHASE_B rd3
#case
#ifdef CLOCK8MHZ
#use delay(clock=8000000, internal) //one instruction=0.2us
#endif
#ifdef CLOCK16MHZ
#use delay(clock=16000000, internal) //one instruction=0.2us
#endif
#ifdef CLOCK98MHZ
#use delay(clock=9830400) /////////// Check Crystal Value ////////////
#endif
#define BAUD1_SPEED 9600
#define BAUD2_SPEED 19200
#define BAUD3_SPEED 38400
#use rs232(baud=BAUD1_SPEED,xmit=PIN_B7,rcv=PIN_B5, ERRORS)
int32 tmr0cnt, tmr1cnt;
signed int16 encDelta;
signed int16 last;
signed int32 enc_cnt;
int1 last_A, last_B, new_A, new_B, A_error, B_error;
int16 error_A_cnt, error_B_cnt;
signed int16
DnCount, // Holds accumulated 'up' pulses
UpCount, // Holds accumulated 'down' pulses
prevDnCount, // Previous Holds accumulated 'up' pulses
prevUpCount, // Previous Holds accumulated 'down' pulses
mvelocity, // Measured motor velocity
prev_mvelocity // Holds prev UP/DOWN Counts
;
signed int32
travel_to,
position, // Commanded position.
mposition; // Actual measured position.
#int_timer2 // Quadrature Encoder read counters
void timer2_isr(void)
{
signed int16 new, diff;
mvelocity = DnCount; // UNCOMMENTING ANY OF THESE LINES printf gets corrupt
mvelocity -= UpCount; // UNCOMMENTING ANY OF THESE LINES printf gets corrupt
//! prev_mvelocity = mvelocity; // UNCOMMENTING ANY OF THESE LINES printf gets corrupt
//!
//! UpCount = tmr0cnt + get_timer0(); // UNCOMMENTING ANY OF THESE LINES printf gets corrupt
//! DnCount = get_timer1(); // UNCOMMENTING ANY OF THESE LINES printf gets corrupt
}
#int_timer0 // Quadrature Encoder read counters
void timer0_isr(void)
{
tmr0cnt = tmr0cnt + 0x0100;
}
void main()
{
signed int16 cnt = 0;
setup_adc(ADC_OFF);
TRISA = 0b00101011;
port_a_pullups(0x04);
TRISB = 0b11110111; // All Inputs Lower nibble Interrupt on change
TRISC = 0b11010000;
setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_EXTERNAL_SYNC);
tmr0cnt = 0L;
tmr1cnt = 0L;
set_timer0(0);
set_timer1(0L);
setup_timer_2(T2_DIV_BY_4, 64, 10);
mvelocity = 0;
prev_mvelocity = 0;
DnCount = 0;
UpCount = 0;
prevUpCount = 0;
prevDnCount = 0;
mposition = 0;
clear_interrupt(INT_TIMER0); // Timer
clear_interrupt(INT_TIMER2); // Timer
enable_interrupts(INT_TIMER0); // TIMER2 Int
enable_interrupts(INT_TIMER2); // TIMER2 Int
enable_interrupts(GLOBAL);
printf("Hello World Test \r\n\r\n");
while(TRUE)
{
printf("Hello World\r\n");
delay_ms(2000);
}
}
|
[img]http://postimg.org/image/5ewb01cid/[/img]
Any Ideas??
Thanks
Jerry
Last edited by Jerry I on Wed Mar 02, 2016 7:58 pm; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Mar 01, 2016 9:30 pm |
|
|
Quote: | If I uncomment any code in the #int_timer2 routine the printf("Hello
World\r\n") in the main() loop code will get corrupted (chopped up). |
That's the symptom of a software UART with its bit timing disrupted by
interrupts. You can see it's a software UART by looking at the .LST file.
To fix it you need to use a hardware UART. Just by playing around with it,
I was able to get the setup code that gives a hardware UART:
Code: |
#pin_select U1TX = PIN_B7
#pin_select U1RX = PIN_B5
#use rs232(baud=BAUD1_SPEED, ERRORS, UART1) |
This can be confirmed by looking at the .LST file. You will see it's using
the hardware UART registers. |
|
|
Jerry I
Joined: 14 Sep 2003 Posts: 96 Location: Toronto, Ontario, Canada
|
|
Posted: Wed Mar 02, 2016 8:04 pm |
|
|
Thanks again PCM Programmer.
This is the first time I used a Pic where the use of pin_select for a peripheral.
Now I wondering if the timers that I am using also require to define external input pins as T0CKI and T1CKI with pin_select??.
Thanks again.
Jerry |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Mar 03, 2016 1:48 am |
|
|
Quote: |
Now I wondering if the timers that I am using also require to define
external input pins as T0CKI and T1CKI with pin_select ? |
No, you don't have to. They have default pins. See this table in the
16F1619 data sheet: Table 13-1: PPS Input Register Reset Values
The default pin for Timer0 external clock is RA2.
The default pin for Timer1 external clock is RA5. |
|
|
Jerry I
Joined: 14 Sep 2003 Posts: 96 Location: Toronto, Ontario, Canada
|
|
Posted: Thu Mar 03, 2016 2:06 pm |
|
|
Thanks for info,
What about the CLC outputs, I will have 2 each feeding the 2 external clock inputs. Do I have to set pin_select pins?.
Thanks again,
Jerry |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9245 Location: Greensville,Ontario
|
|
Posted: Thu Mar 03, 2016 2:49 pm |
|
|
This again is easy stuff... just read the datasheet....page 6, table 1 shows the available inputs/outputs including the CLC peripheral.
While I don't have or use this PIC it does seem fairly easy to use....
CCS may have an example of using the CLC, I haven't checked and my version of PCM is rather old, bound to be some 'how to use' stuff in the manual. Interesting PIC though I like the idea of the NCO.......
too many PICs... too little time
Jay |
|
|
|
|
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
|