|
|
View previous topic :: View next topic |
Author |
Message |
Prefekt
Joined: 21 Oct 2010 Posts: 85
|
PIC18F2525 uart |
Posted: Tue Jun 02, 2015 12:39 pm |
|
|
Hi,
I tried a new pic for me, the 18F2525 with a 20MHZ crystal.
Code: |
#include <18F2525.h>
//fuses
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG
#use delay(clock=20000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)
|
printf is ok, works. But I can't receive any char's!
This is not working
Code: |
while(!kbhit())
{
ch = getch();
printf("ch");
}
|
and the #INT_RDA is also not working
Code: |
#INT_RDA
void rs232_handler(void)
{
chr=getc();
printf("hallo");
}
|
Is it better to use a 10MHz crystal? |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Tue Jun 02, 2015 1:20 pm |
|
|
you should post your entire code as 'snippets' don't tell the WHOLE story.
for instance we don't KNOW if you're enabled the interrupt for INT_RDA.
Jay |
|
|
Prefekt
Joined: 21 Oct 2010 Posts: 85
|
|
Posted: Tue Jun 02, 2015 2:10 pm |
|
|
code below is working with a PIC18F2550 but not with the pic18f2525
Code: |
/////////////////////////////////////////////////////////////////////////////
//
// Include libraries
//
/////////////////////////////////////////////////////////////////////////////
#include <modul192.h>
/////////////////////////////////////////////////////////////////////////////
//
// Global definitions
//
/////////////////////////////////////////////////////////////////////////////
char chr='A';
int16 bitcounter = 0;
char InputData[C_TOTAL_LED_HEX];
char OutputData[C_TOTAL_LED_HEX];
char SCTData[C_SCT_COUNT][C_LED_COUNT_ON_SCT];
/////////////////////////////////////////////////////////////////////////////
//
// Sub Functions
//
/////////////////////////////////////////////////////////////////////////////
void SetSCTDataBin(int8 val, int sctindex, int ledindex)
{
int8 i;
for (i = 0; i < 8; i++)
{
if (val & 0x80) // test the MSB (Most significant bit (bit7))
SCTData[sctindex][ledindex] = '1';
else
SCTData[sctindex][ledindex] = '0';
ledindex++;
val <<= 1; // Shift left y by 1 bit
}
}
void SplitInputData()
{
int16 dataindex=0; //Input data index
int sctindex=0; //STC driver index
int ledindex=0; //LED index on serveral stc driver
for (dataindex=0; dataindex<C_TOTAL_LED_HEX;dataindex++)
{
SetSCTDataBin(InputData[dataindex], sctindex, ledindex);
ledindex+=8;
if((dataindex>0) && ((dataindex+1) % (C_LED_COUNT_ON_SCT_HEX) == 0))
{
//next stc driver
sctindex++;
ledindex=0;
}
}
}
//Clock SCT driver
void SCT_Clock(void)
{
output_high(SCT_CLK);
delay_us(1);
output_low(SCT_CLK);
}
//Move STCData to STC output register
void SCT_MoveDataToRegister(void)
{
int ledindex=0;
for (ledindex=0; ledindex<C_LED_COUNT_ON_SCT; ledindex++)
{
if(SCTData[0][ledindex]=='1') { output_high(SCT_SDI_1); }
else { output_low(SCT_SDI_1); }
if(SCTData[1][ledindex]=='1') { output_high(SCT_SDI_2); }
else { output_low(SCT_SDI_2); }
if(SCTData[2][ledindex]=='1') { output_high(SCT_SDI_3); }
else { output_low(SCT_SDI_3); }
if(SCTData[3][ledindex]=='1') { output_high(SCT_SDI_4); }
else { output_low(SCT_SDI_4); }
if(SCTData[4][ledindex]=='1') { output_high(SCT_SDI_5); }
else { output_low(SCT_SDI_5); }
if(SCTData[5][ledindex]=='1') { output_high(SCT_SDI_6); }
else { output_low(SCT_SDI_6); }
if(SCTData[6][ledindex]=='1') { output_high(SCT_SDI_7); }
else { output_low(SCT_SDI_7); }
if(SCTData[7][ledindex]=='1') { output_high(SCT_SDI_8); }
else { output_low(SCT_SDI_8); }
if(SCTData[8][ledindex]=='1') { output_high(SCT_SDI_9); }
else { output_low(SCT_SDI_9); }
if(SCTData[9][ledindex]=='1') { output_high(SCT_SDI_10); }
else { output_low(SCT_SDI_10); }
if(SCTData[10][ledindex]=='1') { output_high(SCT_SDI_11); }
else { output_low(SCT_SDI_11); }
if(SCTData[11][ledindex]=='1') { output_high(SCT_SDI_12); }
else { output_low(SCT_SDI_12); }
//Clock stc driver
SCT_Clock();
}
}
//Data latch STC
void SCT_LatchData(void)
{
output_high(SCT_LA);
delay_ms(1);
output_low(SCT_LA);
}
//Initialize STC driver
void SCT_Init()
{
//disable STC output
output_high(SCT_OE);
output_low(SCT_LA);
output_low(SCT_CLK);
}
//Send data via rs232
void SendData()
{
int i;
for (i=0;i<C_TOTAL_LED_HEX;i++)
{
putc(OutputData[i]);
}
putc('#');
}
/////////////////////////////////////////////////////////////////////////////
//
// Interrupts
//
/////////////////////////////////////////////////////////////////////////////
#INT_RDA
void rs232_handler(void)
{
chr=getc();
printf("hallo"); //only for testing
if(chr != '#')
{
//Catch Input Data
//printf("%c", chr);
InputData[bitcounter]=chr;
bitcounter++;
}
else
{
disable_interrupts(GLOBAL);
disable_interrupts(INT_RDA);
bitcounter=0;
//Send OutputData
SendData();
//Copy InputData to OutputData
memcpy(OutputData, InputData, sizeof(OutputData));
//Split InputData
SplitInputData();
//Send InputData to STC
SCT_MoveDataToRegister();
//Latch STC
SCT_LatchData();
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
}
}
/////////////////////////////////////////////////////////////////////////////
//
// Main
//
/////////////////////////////////////////////////////////////////////////////
void main()
{
char ch;
//Init STC driver
SCT_Init();
//Data init
for (int i=0; i<C_TOTAL_LED_HEX; i++)
{
OutputData[i] = 0x00;
InputData[i] = 0x00;
}
//for debug only
//char c[]={0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0xff,0xff,0xff,0xff,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80};
//memcpy(InputData, c, sizeof(c));
//Split InputData
SplitInputData();
//Send InputData to STC
SCT_MoveDataToRegister();
//Latch STC
SCT_LatchData();
//Enable interrupts
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
output_low(SCT_OE);
/* printf("Hallo");
while(!kbhit())
{
ch = getch();
printf("ch");
}
*/
while(TRUE)
{
//Get global OutputEnabled
if(input(GLOBAL_OE)==1)
{
output_high(SCT_OE);
//printf("1");
}
else
{
output_low(SCT_OE);
//printf("0");
}
}
}
|
heeader file
Code: |
#include <18F2525.h>
//fuses
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG
#use delay(clock=20000000)
// i/o pins
#define SCT_SDI_1 PIN_A0
#define SCT_SDI_2 PIN_A1
#define SCT_SDI_3 PIN_A2
#define SCT_SDI_4 PIN_A3
#define SCT_SDI_5 PIN_A4
#define SCT_SDI_6 PIN_A5
#define SCT_SDI_7 PIN_B0
#define SCT_SDI_8 PIN_B1
#define SCT_SDI_9 PIN_B2
#define SCT_SDI_10 PIN_B3
#define SCT_SDI_11 PIN_B4
#define SCT_SDI_12 PIN_B5
#define SCT_OE PIN_C1
#define SCT_CLK PIN_C2
#define SCT_LA PIN_C0
#define GLOBAL_OE PIN_C4
//serial interface
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)
//constants
#define C_LED_COUNT_ON_SCT 16
#define C_LED_COUNT_ON_SCT_HEX 2
#define C_SCT_COUNT 12
#define C_TOTAL_LED_HEX 24
|
|
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Tue Jun 02, 2015 3:27 pm |
|
|
Quote: |
while(!kbhit())
{
ch = getch();
printf("ch");
} |
will NEVER work if you have an INT_RDA set up........
AND could very well contend with it too,
as you are standing on the receive UART function WAITING in foreground!
what a mess of bad serial I/O
also get the PRINTF() out of the INT_RDA handler
as well as all the junk code for manipulation.
everything from here
on down should be moved to MAIN() and polled .....
AND
whatever might be in VAR ch
all you willever print is CH..CH..CH etc |
|
|
Prefekt
Joined: 21 Oct 2010 Posts: 85
|
|
Posted: Tue Jun 02, 2015 11:58 pm |
|
|
This thinks are only for testing the serial interface.
My problem is that I cant' read any data from serial interface with PIC18F2525. With PIC18F2550 it works.
I try the ccs sample and the pic doesen't receive characters. There are special configuration settings for the PIC18F2525? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Wed Jun 03, 2015 1:21 am |
|
|
1) A test program should be simple. What you want to show involves a dozen lines at most.... Currently you have so many things 'not involved' in the actual problem being used, that finding what is wrong is difficult...
2) Always with a problem like this, _post the compiler version_. This matters.
2) The actual logic you post for your 'read test' is wrong. Think about it. You want to wait 'while' there is not a key hit, and then when there is a key hit try to read the character. Currently you try to read the character if there is not one there, but if there is a character, never try to read it. If a character is seen on boot, the display will never be called....
Code: |
#include <18F2525.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG
#use delay(crystal=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1,errors)
int1 have_char=FALSE;
int8 ch;
#INT_RDA
void rs_rx(void)
{
ch=getch();
have_char=TRUE;
}
//interrupt version
void main(void)
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while (TRUE)
{
if (have_char)
{
have_char=false;
printf("ch"); //and print a message
}
}
}
//non interrupt version
void main2()
{
int8 ch;
while(TRUE)
{
while(!kbhit())
; //wait if there is no key
ch = getch(); //now get the key
printf("ch"); //and print a message
}
}
|
Two complete versions here. 'main' using interrupts, and 'main2' not using interrupts. Compile whichever you want to test.
Your existing test, could only print a character, if the chip doesn't see one when it boots. Now I'd suspect the 2525, is waking faster than the 2550 (the PLL in the clock on this takes a long time to wake), so the 2525, wakes up before the RS232 inverter has stabilised, so always sees a character, so never responds to the faulty test code.....
The compiler version matters a lot on these chips, because there was a change after the revision B silicon to the meaning of two bits in the baudcon register. An old compiler might well not set these correctly, which could result in the serial receive line actually being inverted. |
|
|
Prefekt
Joined: 21 Oct 2010 Posts: 85
|
|
Posted: Wed Jun 03, 2015 4:43 am |
|
|
thanks, i will test it.
compiler version is: 5.032 |
|
|
|
|
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
|