Traducir código Arduino a PIC (para pic c compiler,ccs, ldmicro)

#1
Hola quería pedir por favor si pudieran ayudarme a usar esta forma de código del arduino para PIC, y así poder usar mi código " ansi c " que genera un software libre llamado LDMICRO, a decir verdad este código que quiero que me " traduzcan " ; lo uso para el código ansi c de ldmicro para arduino y funciona de maravilla pero en PIC me falta este código que no consigo como quien dice traducir, ya he usado timer1, 0, la librería #USE TIMER, pero necesito este código:



#include " ladder.h "
#define interval 10

unsigned long waitUntil=0;

void setup() {
PlcSetup();
}

void loop() {
if ((unsigned long)(millis() - waitUntil) >= interval)
{
PlcCycle();

waitUntil = waitUntil + interval; // wait another interval cycle
return true;
}
return false;
}




*P.D.: UN COMPAÑERO DE OTRO PAÍS ME DIO ESTE CÓDIGO PARA PIC PERO NO CONSIGO ENTENDERLO, POR ESO ACUDO A SU AYUDA :

static unsigned long timer1_raw_tics_80_49 = 0; // MSB 32 bits size

static unsigned long timer1_raw_tics_48_17 = 0; // Midle 32 bits size

// LSB is Timer1 value. // LSB 16 bits size

/* service routine for timer 1 interrupt */
void interrupt timer1_isr(void)
{
timer1_raw_tics_48_17++;
if(timer1_raw_tics48_17 == 0) timer1_raw_tics_80_49++;
TMR1IF = 0;
}

Like in Aruino
unsigned long millis()
{
//covert timer1_raw_tics_80_49,timer1_raw_tics_48_17,Timer1 value to milliseconds
}

unsigned long micros()
{
//covert timer1_raw_tics_80_49,timer1_raw_tics_48_17,Timer1 value to microseconds
} ...
 
Última edición:
#2
¿Específicamente cual es el problema? ¿recrear la función millis()?

LDmicro podía generar el HEX directamente, si lo planeas pasar a otro programa debes aportar la HAL(ladder.h)

No tendría caso usar millis en el PIC si planeas hacerlo con otro compilador, en el caso de Arduino Millis esta corriendo por que se usa el timer0 para generar los delay, por ello es mejor emplearlo en lugar de meterse con los timer donde otras partes dele código pueden requerirlos, pero si tu PIC únicamente correrá esa ejecución, directamente usas la interrupción del timer para disparar PlcCycle();
 
#3
Gracias por responder, si ya tengo mi ladder.h (es para pic18f4550) y he usado el siguiente código con timer1 que me da 10ms de tiempo de ciclo para llamar la función PlcCycle(), funciona bien pero el detalle esta en que si esa es la forma correcta de llamar PlcCycle(), porque en otro foro me dijeron que PlcCycle() no es una instrucción solo es una herramienta para medir el tiempo adecuado para llamar mi función contenida en PlcCycle(), debo admitir que de repente estoy confundiendo las cosas, en todo caso la pregunta sería si esta es la forma correcta de llamar PlcCycle() :

#INT_TIMER1
void timer1()
{
clear_interrupt(INT_TIMER1);
set_timer1(59286);

PlcCycle();


}
void main()
{
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(59286);
clear_interrupt(INT_TIMER1);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);


while(TRUE) ;
}
 
#4
Y donde leíste eso? PlcCycle(); es tipo void, no devuelve nada, solo se ejecuta, lo único que debes hacer es agregar las funciones para acceder a los pines, lo otro es ejecutar periódicamente PlcCycle() según el tiempo que usaste al configurarlo.
 
#5
Entonces debe ser un si, que si es una forma correcta de llamar al PlcCycle().

Respondiendo a tu pregunta, dicha información me la dieron en el foro de LDMICRO, por otro lado gracias por tu respuesta, ahora ya tengo todo para poder hacer proyectos con ansi c de LDMICRO



Una consulta Nuyel, veo que estas familiarizado con con el tema de ldmicro, podrías por favor darme un ejemplo de ansi c con ldmicro, algo simple, como un blink led cada 1 segundo por ejemplo o etc , claro sin usar delay_ms(1000), gracias
 
Última edición:
#6
Yo uso 3 cosas (archivos):

1) El ladder.h (donde asigno los pines, pic, configuraciones).
2) El programa ansi c propiamente dicho.
3) El main para llama a PlcCycle.

y me funciona pero veo que tu tienes otra forma más adecuada.
 
#7
Sin usar delay. . . pues con la interrupción del timmer ya lo haces, otra cosa, LDmicro no usa temporizadores ni funciones delay, emplea contadores y las cuentas las realiza por los ciclos de ejecución basándose en el periodo de esta según como lo configuraste, mientras el programa pueda completar la ejecución antes de la próxima llamada, debería mantener los tiempos adecuados.
 
#8
Mi estimado Nuyel, gracias por responder nuevamente, pero todo lo que me haz dicho ya lo se, a lo que me refería cuando dije delay era esto:

void main(void)
{
CLRWDT();
init();
while(1)
{
CLRWDT(); // clear WDT unlimited
__delay_ms(100);// Time step for PlcCycle() 100 ms

// Check inputs, process outs..
// Main Ladder diagramm cycle is here
PlcCycle();
}
}


Te fijas que en este código llama a PlcCycle() usando DELAY, se que el timer en ansi c es un contador como dices, tienes toda la razón ya lo haz explicado, el detalle esta en que al inicio de este post quería saber si el código con hice para llamar PlcCycle usando el timer1 era una manera adecuada de hacerlo, nada más, y si tu tenías otra forma de llamar a PlcCycle() sin usar DELAY como se muestra en el código de arriba, porque delay no es la mejor opción.
 
#9
El timer es la mejor opción, incluso si no requieres de otros periféricos puedes mandar el CPU a modo de bajo consumo y esperar al timer para despertar, honestamente no trabajo con PIC por que me fastidia la manera no normalizada con la que se programan (cada compilador se inventa su forma de trabajarlos), me dan muchos conflictos cuando mueves un programa de uno a otro.
 
#10
Entonces seguiré usando el timer1, gracias por la aclaración, y si, tienes razón, yo decidí usar Pic c compiler CCS, y comprobando lo que dices el mismo código lo use en Matlab IDE y sabes que?,, el tiempo de ciclo no era el mismo era mucho más mayor con el mismo código, hay mucho compiladores, eso es algo tedioso en PIC´s me gustaría aprender AVR, pero en mi ciudad no venden los atmel solo PIC´s, gracias nuevamente por la aclaración, saludos.
 

Temas similares