View previous topic :: View next topic |
Author |
Message |
MCUprogrammer
Joined: 08 Sep 2020 Posts: 221
|
CLC problem |
Posted: Wed Feb 22, 2023 3:44 am |
|
|
I used MPLAB X IDE GUI. I copied the resulting code and added it with getenv(). But when I compile I get an error. The error I get is: Expecting an identifier Bad SFR name.
CCS C 5.114
Code: |
#include <18F57Q43.h>
#use delay(internal=64MHz)
#byte CLCSELECT = getenv("SFR:CLCSELECT")
#byte CLCnPOL = getenv("SFR:CLCnPOL")
#byte CLCnSEL0 = getenv("SFR:CLCnSEL0")
#byte CLCnSEL1 = getenv("SFR:CLCnSEL1")
#byte CLCnSEL2 = getenv("SFR:CLCnSEL2")
#byte CLCnSEL3 = getenv("SFR:CLCnSEL3")
#byte CLCnGLS0 = getenv("SFR:CLCnGLS0")
#byte CLCnGLS1 = getenv("SFR:CLCnGLS1")
#byte CLCnGLS2 = getenv("SFR:CLCnGLS2")
#byte CLCnGLS3 = getenv("SFR:CLCnGLS3")
#byte CLCDATA = getenv("SFR:CLCDATA")
#byte CLCnCON = getenv("SFR:CLC1CON")
void CLC1_Initialize(void) // CLCIN0=0,CLCIN1=0,CLCIN2=1 CLCOUT(F0) = 0 else = 1
{
// Set the CLC1 to the options selected in the User Interface
// SLCT 0;
CLCSELECT = 0x00;
// G1POL not_inverted; G2POL not_inverted; G3POL not_inverted; G4POL inverted; POL not_inverted;
CLCnPOL = 0x08;
// D1S CLCIN0 (CLCIN0PPS);
CLCnSEL0 = 0x00;
// D2S CLCIN1 (CLCIN1PPS);
CLCnSEL1 = 0x01;
// D3S CLCIN2 (CLCIN2PPS);
CLCnSEL2 = 0x02;
// D4S CLCIN0 (CLCIN0PPS);
CLCnSEL3 = 0x00;
// G1D3N disabled; G1D2N disabled; G1D4N disabled; G1D1T disabled; G1D3T disabled; G1D2T disabled; G1D4T disabled; G1D1N enabled;
CLCnGLS0 = 0x01;
// G2D2N enabled; G2D1N disabled; G2D4N disabled; G2D3N disabled; G2D2T disabled; G2D1T disabled; G2D4T disabled; G2D3T disabled;
CLCnGLS1 = 0x04;
// G3D1N disabled; G3D2N disabled; G3D3N enabled; G3D4N disabled; G3D1T disabled; G3D2T disabled; G3D3T disabled; G3D4T disabled;
CLCnGLS2 = 0x10;
// G4D1N disabled; G4D2N disabled; G4D3N disabled; G4D4N disabled; G4D1T disabled; G4D2T disabled; G4D3T disabled; G4D4T disabled;
CLCnGLS3 = 0x00;
// CLC1OUT 0;
CLCDATA = 0x00;
// EN enabled; INTN disabled; INTP disabled; MODE 4-input AND;
CLCnCON = 0x82;
}
void main(void)
{
CLC1_Initialize();
while(TRUE)
{
}
} |
_________________ Best Regards...
MCUprogrammer
_______________________________
Work Hard |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Wed Feb 22, 2023 5:24 am |
|
|
It looks as if getenv doesn't know all the CLC register names. Report it
to CCS. Meantime the automatic file generator (in tools), happily generates
an include file for CLC as:
Code: |
#byte CLCnGLS3 = 0x0DF
#bit G4D1N = CLCnGLS3.0
#bit G4D1T = CLCnGLS3.1
#bit G4D2N = CLCnGLS3.2
#bit G4D2T = CLCnGLS3.3
#bit G4D3N = CLCnGLS3.4
#bit G4D3T = CLCnGLS3.5
#bit G4D4N = CLCnGLS3.6
#bit G4D4T = CLCnGLS3.7
#byte CLCnGLS2 = 0x0DE
#bit G3D1N = CLCnGLS2.0
#bit G3D1T = CLCnGLS2.1
#bit G3D2N = CLCnGLS2.2
#bit G3D2T = CLCnGLS2.3
#bit G3D3N = CLCnGLS2.4
#bit G3D3T = CLCnGLS2.5
#bit G3D4N = CLCnGLS2.6
#bit G3D4T = CLCnGLS2.7
#byte CLCnGLS1 = 0x0DD
#bit G2D1N = CLCnGLS1.0
#bit G2D1T = CLCnGLS1.1
#bit G2D2N = CLCnGLS1.2
#bit G2D2T = CLCnGLS1.3
#bit G2D3N = CLCnGLS1.4
#bit G2D3T = CLCnGLS1.5
#bit G2D4N = CLCnGLS1.6
#bit G2D4T = CLCnGLS1.7
#byte CLCnGLS0 = 0x0DC
#bit G1D1N = CLCnGLS0.0
#bit G1D1T = CLCnGLS0.1
#bit G1D2N = CLCnGLS0.2
#bit G1D2T = CLCnGLS0.3
#bit G1D3N = CLCnGLS0.4
#bit G1D3T = CLCnGLS0.5
#bit G1D4N = CLCnGLS0.6
#bit G1D4T = CLCnGLS0.7
#byte CLCnSEL3 = 0x0DB
#byte CLCnSEL2 = 0x0DA
#byte CLCnSEL1 = 0x0D9
#byte CLCnSEL0 = 0x0D8
#byte CLCnPOL = 0x0D7
#bit G1POL = CLCnPOL.0
#bit G2POL = CLCnPOL.1
#bit G3POL = CLCnPOL.2
#bit G4POL = CLCnPOL.3
#bit POL = CLCnPOL.7
#byte CLCnCON = 0x0D6
#bit MODE0 = CLCnCON.0
#bit MODE1 = CLCnCON.1
#bit MODE2 = CLCnCON.2
#bit INTN = CLCnCON.3
#bit INTP = CLCnCON.4
#bit OUT = CLCnCON.5
#bit OE = CLCnCON.6
#bit EN = CLCnCON.7
#byte CLCSELECT = 0x0D5
#byte CLCDATA = 0x0D4
#bit CLC1OUT = CLCDATA.0
#bit CLC2OUT = CLCDATA.1
#bit CLC3OUT = CLCDATA.2
#bit CLC4OUT = CLCDATA.3
#bit CLC5OUT = CLCDATA.4
#bit CLC6OUT = CLCDATA.5
#bit CLC7OUT = CLCDATA.6
#bit CLC8OUT = CLCDATA.7
|
Which should get you going. |
|
|
MCUprogrammer
Joined: 08 Sep 2020 Posts: 221
|
|
Posted: Wed Feb 22, 2023 7:27 am |
|
|
I sent an email to CCS. I added what you did to the code. There was no problem in compiling. But I didn't see any movement at the exit. _________________ Best Regards...
MCUprogrammer
_______________________________
Work Hard |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Wed Feb 22, 2023 8:02 am |
|
|
You seem to be trying to setup a 3 input OR gate. (AND, with all the
inputs inverted, using three physical inputs, and one pin wired high).
You don't show the PPS setups for CLCIN0, CLCIN1 or CLCIN2.
Remember you have to enable the TRIS on the pin used as the CLC
output. By default all pins are set as inputs. |
|
|
MCUprogrammer
Joined: 08 Sep 2020 Posts: 221
|
|
Posted: Wed Feb 22, 2023 8:16 am |
|
|
CLCIN0 PIN_A0
CLCIN1 PIN_A1
CLCIN2 PIN_B0
CLCOUT PIN_F0
Code: |
#include <18F57Q43.h>
#use delay(crystal = 16MHz)
#use FAST_IO(a)
#use FAST_IO(b)
#use FAST_IO(d)
#byte CLCnGLS3 = 0x0DF
#bit G4D1N = CLCnGLS3.0
#bit G4D1T = CLCnGLS3.1
#bit G4D2N = CLCnGLS3.2
#bit G4D2T = CLCnGLS3.3
#bit G4D3N = CLCnGLS3.4
#bit G4D3T = CLCnGLS3.5
#bit G4D4N = CLCnGLS3.6
#bit G4D4T = CLCnGLS3.7
#byte CLCnGLS2 = 0x0DE
#bit G3D1N = CLCnGLS2.0
#bit G3D1T = CLCnGLS2.1
#bit G3D2N = CLCnGLS2.2
#bit G3D2T = CLCnGLS2.3
#bit G3D3N = CLCnGLS2.4
#bit G3D3T = CLCnGLS2.5
#bit G3D4N = CLCnGLS2.6
#bit G3D4T = CLCnGLS2.7
#byte CLCnGLS1 = 0x0DD
#bit G2D1N = CLCnGLS1.0
#bit G2D1T = CLCnGLS1.1
#bit G2D2N = CLCnGLS1.2
#bit G2D2T = CLCnGLS1.3
#bit G2D3N = CLCnGLS1.4
#bit G2D3T = CLCnGLS1.5
#bit G2D4N = CLCnGLS1.6
#bit G2D4T = CLCnGLS1.7
#byte CLCnGLS0 = 0x0DC
#bit G1D1N = CLCnGLS0.0
#bit G1D1T = CLCnGLS0.1
#bit G1D2N = CLCnGLS0.2
#bit G1D2T = CLCnGLS0.3
#bit G1D3N = CLCnGLS0.4
#bit G1D3T = CLCnGLS0.5
#bit G1D4N = CLCnGLS0.6
#bit G1D4T = CLCnGLS0.7
#byte CLCnSEL3 = 0x0DB
#byte CLCnSEL2 = 0x0DA
#byte CLCnSEL1 = 0x0D9
#byte CLCnSEL0 = 0x0D8
#byte CLCnPOL = 0x0D7
#bit G1POL = CLCnPOL.0
#bit G2POL = CLCnPOL.1
#bit G3POL = CLCnPOL.2
#bit G4POL = CLCnPOL.3
#bit POL = CLCnPOL.7
#byte CLCnCON = 0x0D6
#bit MODE0 = CLCnCON.0
#bit MODE1 = CLCnCON.1
#bit MODE2 = CLCnCON.2
#bit INTN = CLCnCON.3
#bit INTP = CLCnCON.4
#bit OUT = CLCnCON.5
#bit OE = CLCnCON.6
#bit EN = CLCnCON.7
#byte CLCSELECT = 0x0D5
#byte CLCDATA = 0x0D4
#bit CLC1OUT = CLCDATA.0
#bit CLC2OUT = CLCDATA.1
#bit CLC3OUT = CLCDATA.2
#bit CLC4OUT = CLCDATA.3
#bit CLC5OUT = CLCDATA.4
#bit CLC6OUT = CLCDATA.5
#bit CLC7OUT = CLCDATA.6
#bit CLC8OUT = CLCDATA.7
void CLC1_Initialize(void)
{
// Set the CLC1 to the options selected in the User Interface
// SLCT 0;
CLCSELECT = 0x00;
// G1POL not_inverted; G2POL not_inverted; G3POL not_inverted; G4POL inverted; POL inverted;
CLCnPOL = 0x88;
// D1S CLCIN0 (CLCIN0PPS);
CLCnSEL0 = 0x00;
// D2S CLCIN1 (CLCIN1PPS);
CLCnSEL1 = 0x01;
// D3S CLCIN2 (CLCIN2PPS);
CLCnSEL2 = 0x02;
// D4S CLCIN0 (CLCIN0PPS);
CLCnSEL3 = 0x00;
// G1D3N disabled; G1D2N disabled; G1D4N disabled; G1D1T disabled; G1D3T disabled; G1D2T disabled; G1D4T disabled; G1D1N enabled;
CLCnGLS0 = 0x01;
// G2D2N enabled; G2D1N disabled; G2D4N disabled; G2D3N disabled; G2D2T disabled; G2D1T disabled; G2D4T disabled; G2D3T disabled;
CLCnGLS1 = 0x04;
// G3D1N disabled; G3D2N disabled; G3D3N disabled; G3D4N disabled; G3D1T disabled; G3D2T disabled; G3D3T enabled; G3D4T disabled;
CLCnGLS2 = 0x20;
// G4D1N disabled; G4D2N disabled; G4D3N disabled; G4D4N disabled; G4D1T disabled; G4D2T disabled; G4D3T disabled; G4D4T disabled;
CLCnGLS3 = 0x00;
// CLC1OUT 0;
CLCDATA = 0x00;
// EN enabled; INTN disabled; INTP disabled; MODE 4-input AND;
CLCnCON = 0x82;
}
void main(void)
{
set_tris_a(0x03);
set_tris_b(0x00);
set_tris_d(0x01);
CLC1_Initialize();
while(TRUE)
{
}
} |
_________________ Best Regards...
MCUprogrammer
_______________________________
Work Hard |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Wed Feb 22, 2023 8:46 am |
|
|
output_drive(PIN_F0);
Otherwise it is set as an input.
Also B0 is used as an input, but you have it set as an output:
set_tris_b(0x00);
Needs to be:
set_tris_b(0x01); |
|
|
MCUprogrammer
Joined: 08 Sep 2020 Posts: 221
|
|
Posted: Wed Feb 22, 2023 9:00 am |
|
|
I added these 2 codes. But again it didn't work.
Code: |
#use FAST_IO(f)
set_tris_f(0x00); |
I typed wrong. PIN_D0 , B0 is not used. _________________ Best Regards...
MCUprogrammer
_______________________________
Work Hard |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Wed Feb 22, 2023 10:42 am |
|
|
Er. You said:
CLCIN2 PIN_B0
But you have this pin set as an output. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Wed Feb 22, 2023 10:49 am |
|
|
just a comment..
be REAL CAREFUL about using FAST_IO() and SET_TRIS...() !!
If you edit code wrongly, you'll run into problems !!
For now, stay with STANDARD_IO() and let the compiler handle it. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Wed Feb 22, 2023 10:55 am |
|
|
However, since he is manually programming the CLC, not using CCS
functions, he will have to manually program the TRIS for this. |
|
|
MCUprogrammer
Joined: 08 Sep 2020 Posts: 221
|
|
Posted: Thu Feb 23, 2023 12:30 am |
|
|
Now I rearranged it.
I used mplab GUI.
Inputs/Outputs;
CLCIN0 = A0
CLCIN1 = A1
CLCIN2 = B0
CLCOUT = F0
No error occurs when I compile. However, it does not work correctly. It works when I do the same operations with the CCS C compiler. Where is the mistake?
Code: |
//MPLAB GUI
#include <18F57Q43.h>
#use delay(crystal = 16MHz)
#use fast_io(a)
#use fast_io(b)
#use fast_io(f)
#byte CLCnGLS3 = 0x0DF
#byte CLCnGLS2 = 0x0DE
#byte CLCnGLS1 = 0x0DD
#byte CLCnGLS0 = 0x0DC
#byte CLCnSEL3 = 0x0DB
#byte CLCnSEL2 = 0x0DA
#byte CLCnSEL1 = 0x0D9
#byte CLCnSEL0 = 0x0D8
#byte CLCnPOL = 0x0D7
#byte CLCnCON = 0x0D6
#byte CLCSELECT = 0x0D5
#byte CLCDATA = 0x0D4
void CLC1_Initialize(void)
{
// Set the CLC1 to the options selected in the User Interface
// SLCT 0;
CLCSELECT = 0x00;
// G1POL not_inverted; G2POL not_inverted; G3POL not_inverted; G4POL inverted; POL inverted;
CLCnPOL = 0x88;
// D1S CLCIN0 (CLCIN0PPS);
CLCnSEL0 = 0x00;
// D2S CLCIN1 (CLCIN1PPS);
CLCnSEL1 = 0x01;
// D3S CLCIN2 (CLCIN2PPS);
CLCnSEL2 = 0x02;
// D4S CLCIN0 (CLCIN0PPS);
CLCnSEL3 = 0x00;
// G1D3N disabled; G1D2N disabled; G1D4N disabled; G1D1T disabled; G1D3T disabled; G1D2T disabled; G1D4T disabled; G1D1N enabled;
CLCnGLS0 = 0x01;
// G2D2N enabled; G2D1N disabled; G2D4N disabled; G2D3N disabled; G2D2T disabled; G2D1T disabled; G2D4T disabled; G2D3T disabled;
CLCnGLS1 = 0x04;
// G3D1N disabled; G3D2N disabled; G3D3N disabled; G3D4N disabled; G3D1T disabled; G3D2T disabled; G3D3T enabled; G3D4T disabled;
CLCnGLS2 = 0x20;
// G4D1N disabled; G4D2N disabled; G4D3N disabled; G4D4N disabled; G4D1T disabled; G4D2T disabled; G4D3T disabled; G4D4T disabled;
CLCnGLS3 = 0x00;
// CLC1OUT 0;
CLCDATA = 0x00;
// EN enabled; INTN disabled; INTP disabled; MODE 4-input AND;
CLCnCON = 0x82;
}
void main(void)
{
set_tris_a(0x03);
set_tris_b(0x01);
set_tris_f(0x00);
CLC1_Initialize();
while(TRUE)
{
}
}
/////////////////////////////////////////////////////////////////////
//CCS C CODE
#include <18F57Q43.h>
#use delay(internal=64MHz)
#define A PIN_A0
#define B PIN_A1
#define C PIN_B0
#pin_select CLCIN0=A
#pin_select CLCIN1=B
#pin_select CLCIN2=C
#define OUT PIN_F0
#pin_select CLC1OUT=OUT
void CLC1_Initialize(void)
{
//setup CLC1 inputs
clc1_setup_input(1, CLC_INPUT_CLCIN0);
clc1_setup_input(2, CLC_INPUT_CLCIN1);
clc1_setup_input(3, CLC_INPUT_CLCIN2);
//setup CLC1 gates
clc1_setup_gate(1, CLC_GATE_INVERTED_INPUT_1);
clc1_setup_gate(2, CLC_GATE_INVERTED_INPUT_2);
clc1_setup_gate(3, CLC_GATE_NON_INVERTED_INPUT_3);
clc1_setup_gate(4, CLC_GATE_SET);
//setup CLC1
setup_clc1(CLC_ENABLED | CLC_MODE_AND | CLC_OUTPUT_INVERTED); // 0 0 1 = 0
}
void main(void)
{
CLC1_Initialize();
while(TRUE)
{
}
}
|
_________________ Best Regards...
MCUprogrammer
_______________________________
Work Hard |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Thu Feb 23, 2023 2:46 am |
|
|
What you post as the MPLAB version, does not show PIN_SELECT entries.
The CCS version does.
You need these. The gate will not work without these. |
|
|
MCUprogrammer
Joined: 08 Sep 2020 Posts: 221
|
|
Posted: Thu Feb 23, 2023 3:16 am |
|
|
So how do I do this? Do I add the same lines? _________________ Best Regards...
MCUprogrammer
_______________________________
Work Hard |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Thu Feb 23, 2023 3:22 am |
|
|
Yes.
Or just use the CCS code version.
Why if you are using the CCS compiler, would you want to directly write
the registers?. |
|
|
MCUprogrammer
Joined: 08 Sep 2020 Posts: 221
|
|
Posted: Thu Feb 23, 2023 4:14 am |
|
|
The GUI is much easier to use. By the way, I did what you said and it worked. Thank you very much. Yes it works with CCS. Actually, I can go on. But I want to solve this problem too. It's not that hard after all. But not working is very frustrating.. _________________ Best Regards...
MCUprogrammer
_______________________________
Work Hard |
|
|
|