// ***** FITXERS INCLOSSOS EN EL COMPILADOR *********************************
#include <Config IO.h>
#include <Driver LCD 4x20.C>
// ***** DEFINICIONS DEL PROGRAMA *******************************************
#define desactiva output_low
#define activa output_high
#define canvia output_toggle
// ***** CONSTANTS DEL PROGRAMA *********************************************
const float AdvanceX = 160.0; // RELACIÓ D'AVANÇ - POLSOS x MILIMETRE - EIX X - M8 = 1,25 mm/360º
const float AdvanceY = 200.0; // RELACIÓ D'AVANÇ - POLSOS x MILIMETRE - EIX Y - M6 = 1 mm/360º
const float AdvanceZ = 200.0; // RELACIÓ D'AVANÇ - POLSOS x MILIMETRE - EIX Z - M6 = 1 mm/360º
// ***** VARIABLES DEL PROGRAMA *********************************************
long Index = 0; // INDEX MENU
long Speed[3] = {25,25,25}; // VELOCITAT EIXOS X-Y-Z
long Counter[3] = {100,100,100}; // CONTADOR PER GENERAR FRECUENCIA EIXOS X-Y-Z
long ControlX = 0; // VALOR CONVERSOR AD CONTROL EIX X
long ControlY = 0; // VALOR CONVERSOR AD CONTROL EIX Y
long ControlZ = 0; // VALOR CONVERSOR AD CONTROL EIX Z
float AkkuABSX = 0.0; // CONTADOR ACUMULADOR ABSOLUT EIX X
float AkkuABSY = 0.0; // CONTADOR ACUMULADOR ABSOLUT EIX Y
float AkkuABSZ = 0.0; // CONTADOR ACUMULADOR ABSOLUT EIX Z
float PosABSX = 0.0; // POSICIO EIX X ABSOLUT - MILIMETRES
float PosABSY = 0.0; // POSICIO EIX Y ABSOLUT - MILIMETRES
float PosABSZ = 0.0; // POSICIO EIX Z ABSOLUT - MILIMETRES
float MemoryX = 0.0; // MEMORIA POSICIO RELATIVA EIX X
float MemoryY = 0.0; // MEMORIA POSICIO RELATIVA EIX Y
float MemoryZ = 0.0; // MEMORIA POSICIO RELATIVA EIX Z
float PosRELX = 0.0; // POSICIO EIX X RELATIU - MILIMETRES
float PosRELY = 0.0; // POSICIO EIX Y RELATIU - MILIMETRES
float PosRELZ = 0.0; // POSICIO EIX Z RELATIU - MILIMETRES
int StatusPB = 0; // VALOR ACTUAL SENYALS EN PORT B
int LastPB = 0; // VALOR ANTERIOR SENYALS EN PORT B
int Enables = 0; // ESTAT PINS HABILITACIONS EIXOS
int Directions = 0; // ESTAT PINS DIRECCIONS EIXOS
short MotorON = 0; // HABILITACIO POTENCIA
char MenuTXT[20] = ""; // TEXTES MENU
// ***** INTERRUPCIO TIMER 2 - GENERACIO FRECUENCIA
#int_TIMER2
void TIMER2_isr(void){
canvia(EnableX);
}
// ***** INICIALIZEM PIC ****************************************************
void InitializePIC (){
// CONFIGURACIÓ CANALS ANALÓGICS
setup_adc_ports(AN0_TO_AN2|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
// SERIAL SPI I TEMPORITZADORS INTERNS
setup_psp(PSP_DISABLED); // DESHABILITEM PSP
setup_spi(SPI_SS_DISABLED); // DESHABILITEM SERIAL PORT
setup_wdt(WDT_OFF); // DESHABILITEM WATCHDOG
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8|RTCC_8_bit); // CONFIGURACIO TIMER 0 - 409us 0xFF
setup_timer_1(T1_DISABLED); // CONFIGURACIO TIMER 1
setup_timer_2(T2_DIV_BY_16,30,5); // CONFIGURACIO TIMER 2 - 496uS
setup_timer_3(T3_DISABLED|T3_DIV_BY_1); // CONFIGURACIO TIMER 3
// CONFIGURACIÓ LCD
lcd_init();
// CONFIGURACIÓ PORTS DIGITALS
port_b_pullups(TRUE);
// INICIALITZACIÓ SENYALS DIGITALS
desactiva(DirectionX);
desactiva(DirectionY);
desactiva(DirectionY);
desactiva(EnableX);
desactiva(EnableY);
desactiva(EnableZ);
desactiva(Rele);
// CONTROL INTERRUPCIONS
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
}
// ***** ACTUALITZEM PANTALLA LCD ********************************************
void UpdateLCD (){
PosABSX = (AkkuABSX / AdvanceX); // POSICIO ABSOLUTA nnn.nn EN mm EIX X
PosABSY = (AkkuABSY / AdvanceY); // POSICIO ABSOLUTA nnn.nn EN mm EIX Y
PosABSZ = (AkkuABSZ / AdvanceZ); // POSICIO ABSOLUTA nnn.nn EN mm EIX Z
PosRELX = (PosABSX - MemoryX); // POSICIO RELATIVA nnn.nn EN mm EIX X
PosRELY = (PosABSZ - MemoryY); // POSICIO RELATIVA nnn.nn EN mm EIX Y
PosRELZ = (PosABSZ - MemoryZ); // POSICIO RELATIVA nnn.nn EN mm EIX Z
switch(Index){ // CARREGUEM TEXTE MENU
case 0: MenuTXT = "CNC V1.0 -Menu- "; break;
case 1: MenuTXT = "Reiniciar ABS Eix X?"; break;
case 2: MenuTXT = "Reiniciar ABS Eix Y?"; break;
case 3: MenuTXT = "Reiniciar ABS Eix Z?"; break;
case 4: MenuTXT = "Reiniciar ABS Tots? "; break;
case 5: MenuTXT = "Reiniciar REL Eix X?"; break;
case 6: MenuTXT = "Reiniciar REL Eix Y?"; break;
case 7: MenuTXT = "Reiniciar REL Eix Z?"; break;
case 8: MenuTXT = "Reiniciar REL Tots? "; break;
case 9: MenuTXT = "Velocitat % Eix X "; break;
case 10: MenuTXT = "Velocitat % Eix Y "; break;
case 11: MenuTXT = "Velocitat % Eix Z "; break;
default:break;}
lcd_gotoxy(1,1);
lcd_gotoxy(1,2);
printf(lcd_putc
, "X: %05.2f %05.2f %03Lu",PosABSX
,PoSRELX
,Speed
[0]); lcd_gotoxy(1,3);
printf(lcd_putc
, "Y: %05.2f %05.2f %03Lu",PosABSY
,PoSRELY
,Speed
[1]); lcd_gotoxy(1,4);
printf(lcd_putc
, "Z: %05.2f %05.2f %03Lu",PosABSZ
,PoSRELZ
,Speed
[2]); }
// ***** RUTINA PRINCIPAL ****************************************************
void Main(void) {
InitializePIC (); // INICIALITZEM PIC
while (TRUE){
UpdateLCD ();
canvia(EnableY);
}
}