View previous topic :: View next topic |
Author |
Message |
alain-debutant
Joined: 03 Oct 2024 Posts: 10
|
problem UART pic18f6723 |
Posted: Fri Oct 18, 2024 10:50 am |
|
|
hello everyone
my problem concerns RS232 with a pic18f6723
to send my 2 bytes I use the terminal "Hterm.exe"
i can correctly send and receive two bytes on port1 with int_RDA: example sending "BC" I light up my led, "BD" I turn off my led
on the other hand on port2 with int_RDA2 I send the same command I enter the RDA2 interrupt but it does not work, with the debugger my variable "pbuf" takes as value 1 (no more) and therefore my variable "buf" remains empty, while for port1 "pbuf2 " takes the value 2 and of course my variable "buf2" gives me "BC" or "BD"
i checked my pcb everything is OK
i despair ... can you help me please
thanks in advance for your help
code .C
/*
compilateur Picc compiler V5.118
programmateur : ICDU40 / ICDU80
*/
#include "main.h"
#ZERO_RAM
#INT_RDA2
void RDA2_isr(void)
{
buf[pbuf++] = fgetc(PORT2);
}
#INT_RDA
void RDA_isr(void)
{
buf2[pbuf2++] = fgetc(PORT1);
}
void main() {
output_low(led_t3);
pbuf = 0;
pbuf2 = 0;
enable_interrupts(INT_RDA);
enable_interrupts(INT_RDA2);
enable_interrupts(GLOBAL);
while(true) {
if(pbuf > 0) {
switch(buf[0]) {
case 'B':
if(pbuf == 2) { // Commande en 1 data ('B' + <data>)
switch(buf[1]) { // Switch prend une seule valeur (caractère ou nombre)
case 'C':
// ALLUMER LEDs
output_high(LED_t3);
pbuf = 0;
break;
case 'D':
// Eteindre LEDs
output_low(LED_t3);
pbuf = 0;
break;
default: // Autres cas
// Allumer 3e LED
// output_high(LED_TRANSPARENT);
break;
}
// pbuf = 0;
}
break;
}
}
if(pbuf2 > 0) {
switch(buf2[0]) {
case 'B':
output_high(led_t3);
if(pbuf2 == 2) { // Commande en 1 data ('B' + <data>)
switch(buf2[1]) { // Switch prend une seule valeur (caractère ou nombre)
case 'C':
// ALLUMER LEDs
output_high(LED_t3);
pbuf2 = 0;
break;
case 'D':
// Eteindre LEDs
output_low(LED_t3);
pbuf2 = 0;
break;
default: // Autres cas
// Allumer 3e LED
// output_high(LED_TRANSPARENT);
break;
}
// pbuf2 = 0;
}
break;
}
}
}
}
code .H
#include <18F6723.h>
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(crystal=10000000)
#use rs232(baud=9600,parity=N,xmit=PIN_G1,rcv=PIN_G2,bits=8,ERRORS,stream=PORT2) // int RDA2
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,ERRORS,stream=PORT1) /// ecran int RDA
#DEFINE led_t3 PIN_B3
char buf[8]; // 5 : taille maximale buffer
int pbuf;
char buf2[8]; // 5 : taille maximale buffer
int pbuf2; |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Fri Oct 18, 2024 5:13 pm |
|
|
hmm, you've got me confused....
Maybe I'm reading it wrong ??
data from the 2nd UART gets stored in the buf array while data from 1st UART gets stored in the buf2 array.
I'd like to see better naming, uart1 links to port1 links to buffer1. |
|
|
alain-debutant
Joined: 03 Oct 2024 Posts: 10
|
|
Posted: Sat Oct 19, 2024 5:53 am |
|
|
hello Temtronic
thanks for your interest in me, yes you read correctly, port1 = data buf2 in int_RDA
port 2 = data buf in in_RDA2
i simplified the code as much as possible in plain text to test I send the same thing to port1 and port 2
port 1 works correctly while port 2 does not take my bytes in the interrupt it enters it well but does nothing !!
i have already done this type of test in another pic like 26k22 and everything works I do not see where the problem is
thanks for your help, cordially |
|
|
alain-debutant
Joined: 03 Oct 2024 Posts: 10
|
problem UART pic18f6723 |
Posted: Sat Oct 19, 2024 6:17 am |
|
|
I just did a test on another board with the SAME code with a pic 18f87k90 just by changing the #include <18F87k90.h> and the 2 ports work correctly, there must be a subtlety for this pic 18f6723 !!!! but I found nothing. I count on your knowledge ....
cordially |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19495
|
|
Posted: Sat Oct 19, 2024 11:31 am |
|
|
Try setting up 'no_analogs' for the ADC port.
Your chip does not show analogs on these pins. However the 87K90 does.
By default the compiler will automatically turn off an analog peripheral
if present. Now given the 6723 does not show analogs on the pins this
won't be happening with this chip.
It is possible that the data sheet is in error and these pins do need the
analog turned off. |
|
|
alain-debutant
Joined: 03 Oct 2024 Posts: 10
|
problem UART pic18f6723 |
Posted: Sun Oct 20, 2024 6:07 am |
|
|
Thank you Telmah for your response, I did what you recommended but it doesn't change anything. Could this be due to a problem with the defective pic? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19495
|
|
Posted: Sun Oct 20, 2024 10:52 am |
|
|
It was worth a try.
It could easily be a faulty chip, especially if it has not come from a legitimate
source. However I'll take the time tomorrow to see if the code being generated
for this UART is sensible.
Must admit I agree with Jay, you really should make the names reflect
what they are talking to. buff1 for UART1 etc. Not doing this increases the
chances of making a silly mistake somewhere. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19495
|
|
Posted: Mon Oct 21, 2024 1:27 am |
|
|
There is a very severe problem in how the code works.
If the UART does not return 'B' into that first character, and then
'C' or 'D', into the second location,
the buffer will carry on filling. After a few characters it will overflow, and
start overwriting values like the pbuf variable itself. Result disaster.
You have zero margin for any form of incorrect reception, and no recovery
if anything at all goes wrong.
Now it is very possible that the 6723, wakes it's crystal faster than your
alternative chip. If so, there may well be garbage received as a first
character. on the second port. It only takes the UART line to have not
gone completely high when the UART starts, and this will be the case.
Try something simpler and with trapping to prevent a buffer overflow
(in this case actually two traps):
Code: |
//.h
#include <18F6723.h>
#device ADC=12
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(crystal=10000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,ERRORS,stream=PORT1)
#use rs232(baud=9600,parity=N,xmit=PIN_G1,rcv=PIN_G2,bits=8,ERRORS,stream=PORT2)
#DEFINE led_t3 PIN_B3
char buf1[8]; // 5 : taille maximale buffer
int pbuf1;
char buf2[8]; // 5 : taille maximale buffer
int pbuf2;
//.c
#include "main.h"
#ZERO_RAM
#INT_RDA
void RDA_isr(void)
{
buf1[pbuf1++] = fgetc(PORT1);
if (pbuf1>6)
pbuf1=0; //reset if overflow)
}
#INT_RDA2
void RDA2_isr(void)
{
buf2[pbuf2++] = fgetc(PORT2);
if (pbuf2>6)
pbuf2=0; //reset if overflow)
}
void main(void)
{
output_low(led_t3);
pbuf1 = 0;
pbuf2 = 0;
enable_interrupts(INT_RDA);
enable_interrupts(INT_RDA2);
enable_interrupts(GLOBAL);
while(true)
{
if(pbuf1 >= 2)
{
if (buf1[0] == 'B')
{
switch(buf1[1])
{ // Switch prend une seule valeur (caractère ou nombre)
case 'C':
// ALLUMER LEDs
output_high(LED_t3);
break;
case 'D':
// Eteindre LEDs
output_low(LED_t3);
break;
default: // Autres cas
break;
}
}
pbuf1=0; //If we have receieved two characters reset.
}
if(pbuf2 >= 2)
{
if (buf2[0] == 'B')
{
switch(buf2[1])
{ // Switch prend une seule valeur (caractère ou nombre)
case 'C':
// ALLUMER LEDs
output_high(LED_t3);
break;
case 'D':
// Eteindre LEDs
output_low(LED_t3);
break;
default: // Autres cas
break;
}
}
pbuf2=0; //If we have receieved two characters reset.
}
}
}
|
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Mon Oct 21, 2024 3:36 pm |
|
|
As a followup comment...
It'd be nice to have separate LEDs for status.
That way you know WHICH serial port has sent the commands..... |
|
|
alain-debutant
Joined: 03 Oct 2024 Posts: 10
|
|
Posted: Thu Oct 24, 2024 5:41 am |
|
|
Hello everyone
thank you Ttelmah for your answer and my updated code
i did the test and i still had the same problem. so i replaced the pic and with your code EVERYTHING is ok
thank you again for your help
good luck, cordially |
|
|
|