View previous topic :: View next topic |
Author |
Message |
Ttelmah
Joined: 11 Mar 2010 Posts: 19537
|
|
Posted: Sat Jun 25, 2022 10:02 am |
|
|
How dare you use such language on the site!... |
|
|
nailuy
Joined: 21 Sep 2010 Posts: 159
|
|
Posted: Sat Jun 25, 2022 1:51 pm |
|
|
Thank you for reply.
This is real project, test with scope for input/output for confirmation where is the hardware problem.
I use USB serial and is working in PUTTY when is RX-TX in short.
Normaly I must receive from chip 0X01 and 0X10 and infinitly 0X10.
I use FT232R chip, so pinout is correctly OKY.
But why not even simply blinking led is not working.
Also A0 where I have LED with 470R is OFF.
code is:
Code: | #include <16F1826_uart.h>
void main()
{
setup_adc_ports(sAN1, VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_oscillator (OSC_8MHZ | OSC_PLL_on);
putc(0X01); ///<<<<<<<< there is the problem/bloking the program
output_low(LED);
while(TRUE)
{
putc(0X10);
if(kbhit()){
MEM_SERIAL = getc();
}
if (MEM_SERIAL==100){
output_toggle(PIN_A7);
}
output_low(LED);
delay_ms(DELAY);
output_high(LED);
delay_ms(DELAY);
}
} |
and
Code: | #include <16F1826.h>
#device ADC=8
#FUSES MCLR
#FUSES NOBROWNOUT
#FUSES IESO
#FUSES FCMEN
#FUSES NOWRT
#FUSES STVREN
#FUSES BORV19
#FUSES LVP
#use delay(internal=32MHz)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=PORT1)
#define LED PIN_A0
#define DELAY 1000
static unsigned int8 MEM_SERIAL; |
so where is the problem? |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Sat Jun 25, 2022 5:18 pm |
|
|
this ...
#FUSES LVP
change to NOLVP
as very, very few programming devices are actually 'low voltages'.
Also add 'ERRORS' to the Use rs232 (...options...),actually always add it !
and disable the comparators , pretty sure the default is 'enabled'..
Found that RX, TX are remappable using APFCONx pins ! Need to check datasheet to see what they default to be...
hmm, you Do have a pullup resistor on MCLR pin ?
It'd be a lot easier to see the whole program as ONE program. Instead of the xxxuart.h header and 'main', combine into ONE program. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19537
|
|
Posted: Sat Jun 25, 2022 10:27 pm |
|
|
and also don't use ADC_CLOCK_INTERNAL
Doesn't matter for the serial, but on 99% of PIC's (all except some of
the very newest chips and the DSPIC's), the internal RC clock should
only be used by stopping the processor when the reading is taken.
Otherwise accuracy plummets. |
|
|
nailuy
Joined: 21 Sep 2010 Posts: 159
|
|
Posted: Sun Jun 26, 2022 1:49 am |
|
|
Thank you for reply.
I made adjustment to program as your replied but still not working.
Code: | #include <16F1826_uart.h>
void main()
{
//setup_adc_ports(sAN1, VSS_VDD);
//setup_adc(ADC_CLOCK_INTERNAL);
setup_oscillator (OSC_8MHZ | OSC_PLL_on);
setup_comparator (NC_NC_NC_NC);
BIT_SET(RXDTSEL,0); //RX to RB1
BIT_SET(TXCKSEL,0); //TX to RB2
//output_low(LED); //<<<<< when is enabled outpus is at 0V
putc(0X01); //<<<<< there is the problem ?!?!?
output_low(LED);
while(TRUE)
{
putc(0X10);
if(kbhit()){
MEM_SERIAL = getc();
}
if (MEM_SERIAL==100){
output_toggle(PIN_A7);
}
output_low(LED);
delay_ms(DELAY);
output_high(LED);
delay_ms(DELAY);
}
} |
and
Code: |
#include <16F1826.h>
#device ADC=8
#FUSES NOMCLR
#FUSES NOBROWNOUT
#FUSES IESO
#FUSES FCMEN
#FUSES NOWRT
#FUSES STVREN
//#FUSES BORV19
#FUSES NOLVP
#use delay(internal=32MHz)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=PORT1,ERRORS)
#byte APFCON0 = getenv("SFR:APFCON0")
#bit RXDTSEL = APFCON0.7
#byte APFCON1 = getenv("SFR:APFCON1")
#bit TXCKSEL = APFCON1.0
#define LED PIN_A0
#define DELAY 1000
static unsigned int8 MEM_SERIAL;
|
|
|
|
nailuy
Joined: 21 Sep 2010 Posts: 159
|
|
Posted: Sun Jun 26, 2022 2:29 am |
|
|
oh, I changed to correct one.
Code: | BIT_clear(RXDTSEL,0); //RX to RB1
BIT_clear(TXCKSEL,0); //TX to RB2
|
But still not working
Also
Code: | //output_low(LED); //<<<<< when is enabled outpus is at 0V |
This confirm me that CPU is working, but after this line is like blocking. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Sun Jun 26, 2022 4:52 am |
|
|
really need to do the basic '1hz LED' test.
Just have main() , toggle an LED on odd at 1Hz
use this of your code...
output_low(LED);
delay_ms(DELAY);
output_high(LED);
delay_ms(DELAY);
where DELAY is 500.
forget about 'serial' parts of the program. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Jun 26, 2022 4:55 am |
|
|
Quote: | output_low(LED); // <<<<< when is enabled output is at 0V
This confirm me that CPU is working, but after this line is like blocking. |
Do you have a series resistor for your LED ?
If you don't have a series resistor, the PIC will probably shut down when
you turn on the LED.
You could use 220 ohms. |
|
|
nailuy
Joined: 21 Sep 2010 Posts: 159
|
|
Posted: Sun Jun 26, 2022 6:02 am |
|
|
About of resistor, I use 470ohm.
this code is working blinking once /second.
Code: | #include <16F1826_uart.h>
void main()
{
//setup_adc_ports(sAN1, VSS_VDD);
//setup_adc(ADC_CLOCK_INTERNAL);
setup_oscillator (OSC_8MHZ | OSC_PLL_on);
setup_comparator (NC_NC_NC_NC);
BIT_clear(RXDTSEL,0); //RX to RB1
BIT_clear(TXCKSEL,0); //TX to RB2
//output_low(LED); //<<<<< when is enabled outpus is at 0V
//putc(0X01); //<<<<< there is the problem ?!?!?
output_low(LED);
while(TRUE)
{
//putc(0X10);
//if(kbhit()){
// MEM_SERIAL = getc();
// }
//if (MEM_SERIAL==100){
// output_toggle(PIN_A7);
// }
output_low(LED);
delay_ms(DELAY);
output_high(LED);
delay_ms(DELAY);
}
}
#include <16F1826.h>
#device ADC=8
#FUSES NOMCLR
#FUSES NOBROWNOUT
//#FUSES IESO
//#FUSES FCMEN
#FUSES NOWRT
//#FUSES STVREN
//#FUSES BORV19
#FUSES NOLVP
#use delay(internal=32MHz)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=PORT1,ERRORS)
#byte APFCON0 = getenv("SFR:APFCON0")
#bit RXDTSEL = APFCON0.7
#byte APFCON1 = getenv("SFR:APFCON1")
#bit TXCKSEL = APFCON1.0
#define LED PIN_A0
#define DELAY 500
//static unsigned int8 MEM_SERIAL; |
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Sun Jun 26, 2022 6:54 am |
|
|
great so the PIC does work !
I've rearranged your code as one file, makes it a lot easier for me to read and 'flows' from the top down....silly me can't get it 'green' with code[] button.
Code: |
#include <16F1826.h>
#device ADC=8
#FUSES NOMCLR
#FUSES NOBROWNOUT
//#FUSES IESO
//#FUSES FCMEN
#FUSES NOWRT
//#FUSES STVREN
//#FUSES BORV19
#FUSES NOLVP
#use delay(internal=32MHz)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=PORT1,ERRORS)
#byte APFCON0 = getenv("SFR:APFCON0")
#bit RXDTSEL = APFCON0.7
#byte APFCON1 = getenv("SFR:APFCON1")
#bit TXCKSEL = APFCON1.0
#define LED PIN_A0
#define DELAY 500
//static unsigned int8 MEM_SERIAL;
void main()
{
//setup_adc_ports(sAN1, VSS_VDD);
//setup_adc(ADC_CLOCK_INTERNAL);
setup_oscillator (OSC_8MHZ | OSC_PLL_on);
setup_comparator (NC_NC_NC_NC);
BIT_clear(RXDTSEL,0); //RX to RB1
BIT_clear(TXCKSEL,0); //TX to RB2
//output_low(LED); //<<<<< when is enabled outpus is at 0V
//putc(0X01); //<<<<< there is the problem ?!?!?
output_low(LED);
while(TRUE)
{
//putc(0X10);
//if(kbhit()){
// MEM_SERIAL = getc();
// }
//if (MEM_SERIAL==100){
// output_toggle(PIN_A7);
// }
output_low(LED);
delay_ms(DELAY);
output_high(LED);
delay_ms(DELAY);
}
}
|
one possible problem is you have use delay set for 32MHz then later setup osc at 8MHz/pll on. I don't think you need the setup osc command.
I prefer to delete lines instead of commenting them out, again it makes it 'cleaner' to look at. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19537
|
|
Posted: Sun Jun 26, 2022 7:21 am |
|
|
As a comment, don't use all capitals for variables.
The 'standard' in C, is to reserve ALL CAPITALS for #defines. Then used
mixed case for variables. So Mem_Serial.
The advantage of this is when looking through your program and you
see VALUE, you then 'know' that VALUE is a macro. It is a very useful
little 'immediate bit of information'. |
|
|
nailuy
Joined: 21 Sep 2010 Posts: 159
|
|
Posted: Sun Jun 26, 2022 8:24 am |
|
|
I clean up much as possible so now, I modify the code for easy read/understand what is happening.
Code: | #include <16F1826_uart.h>
void main()
{
setup_comparator (NC_NC_NC_NC);
BIT_clear(RXDTSEL,0); //RX to RB1
BIT_clear(TXCKSEL,0); //TX to RB2
while(TRUE)
{
//output_low(LED); //
putc(0X01); //<<<<< there is the problem ?!?!?
output_low(LED);
delay_ms(DELAY);
output_high(LED);
delay_ms(DELAY);
} |
and Code: |
#include <16F1826.h>
#device ADC=8
#FUSES NOMCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
//#FUSES IESO //Internal External Switch Over mode enabled
//#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOWRT //Program memory not write protected
//#FUSES STVREN //Stack full/underflow will cause reset
//#FUSES BORV19 //Brownout reset at 1.9V
#FUSES NOLVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#use delay(internal=8MHz)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=PORT1,ERRORS)
#byte APFCON0 = getenv("SFR:APFCON0")
#bit RXDTSEL = APFCON0.7
#byte APFCON1 = getenv("SFR:APFCON1")
#bit TXCKSEL = APFCON1.0
#define LED PIN_A0
#define DELAY 500 |
why this is not working?
putc(0X01); |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19537
|
|
Posted: Sun Jun 26, 2022 8:55 am |
|
|
Almost certainly you are sending the wrong thing.
Do you really want to send the code 1?. In RS232 comms this is the code
for Start of header.
I suspect you actually want to send '1' (the ASCII code for the 'digit' 1.
So
putc('1');
Using hex this is 0x31. |
|
|
nailuy
Joined: 21 Sep 2010 Posts: 159
|
|
Posted: Sun Jun 26, 2022 8:58 am |
|
|
question:
If this pin TX (B2) is okay I must have 0V (or some digital oscillation 0-5V).
Why on this pin I have tristate ? voltage between 0-5V. When I put my hand I have 4V not steady value. So output is not activated for UART...
Last edited by nailuy on Sun Jun 26, 2022 9:15 am; edited 1 time in total |
|
|
nailuy
Joined: 21 Sep 2010 Posts: 159
|
|
Posted: Sun Jun 26, 2022 9:05 am |
|
|
Ttelmah wrote: | Almost certainly you are sending the wrong thing.
Do you really want to send the code 1?. In RS232 comms this is the code
for Start of header.
I suspect you actually want to send '1' (the ASCII code for the 'digit' 1.
So
putc('1');
Using hex this is 0x31. |
putc(0X01); is for testing
I can change to putc(100); |
|
|
|