Dr. Zoidberg
Well-known-Papá Pitufo
No hay posibilidad de programacion paralela en un PIC, pero podes usar programacion concurrente via interrupciones a pedal o usar un RTOS como el de CCS.
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Dr. Zoidberg dijo:No hay posibilidad de programacion paralela en un PIC, pero podes usar programacion concurrente via interrupciones a pedal o usar un RTOS como el de CCS.
electroconico dijo:No se puede en paralelo porque va ejecutando tus lineas de código una tras otra.
Si fuera programación de hardware si se podría,pero ya hablamos de otras cosas.
La solución a esto es el uso de interrupciones.
Puedes usar interrupción externa,la mayoria de los pics tienes pines dedicados a esta función marcados como "INT1,INT2,INT..."
Usar la interrupción por cambio de estado de X puerto. ( IOC interrupt on change)
Saludos!
TRILO-BYTE dijo:o quitar los delays y hacer una base de tiempo
RTOS = Real Time Operating System ==> Sistema Operativo de Tiempo RealVMAN dijo:Lo de las interrupciones sí estoy al tanto, el problema para mí es que mi PIC al menos, tiene sólo el RB0 como interrupción "Específica". En qué consiste lo de RTOS?
RTOS = Real Time Operating System ==> Sistema Operativo de Tiempo Real
Te permite programar funciones para ejecutarlas a intervalos precisos predefinidos... entre otras cosas.
while(1)
{
tarea1();
tarea2();
tarea3();
}
unsigned int hayQueParpadearLed, tickPeriodoLed, tick;
const unsigned int periodoLed = 1000; //cambiar de acuerdo a carga del micro, un embole
void main(void)
{
Inicializar();
tick = 0;
tickPeriodoLed = periodoLed;
while(1)
{
leerEntradas();
parpadearLed();
tick++;
}
}
void parpadearLed()
{
if (hayQueParpaderLed)
{
if(tick==tickPeriodoLed)
{
output_toggle( );
tickPeriodoLed += periodoLed;
}
}
}
void leerEntradas(void)
{
if(condicion para parpadear)
{
hayQueParpadearLed = 1;
tickPeriodoLed = tick + periodoLed;
output_high(pinLed);
}
if(condicion para no parpadear)
{
hayQueParpadearLed = 0;
output_low(pinLed);
}
}
void main(){
// TODO: USER CODE!!
// Eliminar Ruido
output_low(pin_b1);
output_low(pin_b2);
Inicializar();
tick = 0;
tickPeriodoLed = periodoLed;
while(1){
leerEntradas();
parpadearLed();
tick++;
}
}
void parpadearLed(){
if (hayQueParpaderLed){
if(tick==tickPeriodoLed)
{
output_toggle(pin_b1);
tickPeriodoLed += periodoLed;
}
}
}
void leerEntradas(){
if(input(pin_b7)==0){
hayQueParpadearLed = 1;
tickPeriodoLed = tick + periodoLed;
output_high(pin_b1);
}
if(input(pin_b6)==0){
hayQueParpadearLed = 0;
output_low(pin_b1);
}
}
lo unico que lograran haser usando el RTOS es aprender a programar de una forma bien marrana pues no se esta aprendiendo bien yo sugiero que usen una base de tiempo
se puede haser con un delay muy corto o usando interrupcion del timer
Gracias Ardogan, sí, entiendo al menos conceptualmente la ídea. Aunque para comprenderla de mejor manera, transcribí el código a PIC C Compiler. Reemplacé las variables necesarias pero... y disculpa mi ignorancia, no sé como solucionar el mensaje de error "Undefined identifier" que me tira con cada función excluyendo el Main.
Según entiendo ese mensaje de error es cuando no encuentra declaradas las variables, pero sí las veo declaradas, exceptuando por "Inicializar" :S.
Adjunto el código final:
Código:void main(){ // TODO: USER CODE!! // Eliminar Ruido output_low(pin_b1); output_low(pin_b2); Inicializar(); tick = 0; tickPeriodoLed = periodoLed; while(1){ leerEntradas(); parpadearLed(); tick++; } } void parpadearLed(){ if (hayQueParpaderLed){ if(tick==tickPeriodoLed) { output_toggle(pin_b1); tickPeriodoLed += periodoLed; } } } void leerEntradas(){ if(input(pin_b7)==0){ hayQueParpadearLed = 1; tickPeriodoLed = tick + periodoLed; output_high(pin_b1); } if(input(pin_b6)==0){ hayQueParpadearLed = 0; output_low(pin_b1); } }
///originalmente micro1 siempre era master
///Hay un jaleo en la combersion pic1-master--->pic1-slave CONCEPTO RECIVIDO es ENVIO ENVIO es RECIVIDO
void protSlave(){///protocolo de recivo vajo SPI pic2SLAVE
output_high(PIN_C6);//S.envio=true -----> pic2_b7_MASTER/E.envio
delay_ms(7); ///valido (8)
output_low(PIN_C6);
delay_ms(7);
}
//////////////////RECOGE
void recoge(){//0-1-2 IDEN 4 peti,salir,cliente,target[cliente]
output_low(PIN_C6);///S.envio 0 = pic2_B7_MASTER/E.envio
//output_high(PIN_C1);//RS TRUE
int8 co;
int1 muta=0;
//if (Input(PIN_C0)==1) { }
while (Input(PIN_C0)==0) { }
//while(!spi_data_is_in()){ output_low(PIN_C1); delay_ms(2); output_high(PIN_C1); delay_ms(2); }
output_high(PIN_C1);//RS TRUE ESTE PIN DEBERIA PASAR A FALSE pero micro1 se suele quedar aqui atrapado
grp2=spi_read();
//if (peti==101) { output_high(PIN_C6); delay_ms(4); }
protSlave();
grp3=spi_read();///gp[2] = int1_gp3_Master refresco(x,x,1,x,x)
protSlave();
if (grp2==1) {////**per 2 (estado-salidas pic1)
for (co=0;5>co;co++){
ladra[co]=spi_read();
protSlave();
}
}////**per 2
if (grp3==1) {////**per 3
peti=spi_read();// int8 peti
protSlave();
salir=spi_read();// salir
protSlave();
cliente=spi_read();// cliente
protSlave();
target[cliente]=spi_read();// int1 targe[ ]
protSlave();
tarje=spi_read();// int1 tarje
protSlave();
union UNI M32;//int32 mony
for(co=0;co<4;co++){
M32.bytes[co] = spi_read();
protSlave(); }
mony=M32.dat32;
}////**per 3
muta=spi_read();// *cliente
output_high(PIN_C6);//S.envio=true -----> pic2_b7_MASTER/E.envio
if (grp2==1) {
if (ladra[0]) { output_high(PIN_a0); } else { output_low(PIN_a0); } delay_ms(1); //delay_ms(2);
if (ladra[1]) { output_high(PIN_a1); } else { output_low(PIN_a1); } delay_ms(1);
if (ladra[2]) { output_high(PIN_a2); } else { output_low(PIN_a2); } delay_ms(1);
if (ladra[3]) { output_high(PIN_a3); } else { output_low(PIN_a3); } delay_ms(1);
if (ladra[4]) { output_low(PIN_a4); } else { output_high(PIN_a4); } delay_ms(1);//neg
} else {
delay_ms(5); }
delay_ms(2);
output_low(PIN_C6);
output_low(PIN_C1);//RS FIN
if (muta) { COMBERSION(1); delay_ms(16); }
}
void COMBERSION(int1 Soy){
if (Soy){
MASTER=1; set_tris_c(208); delay_ms(2);// 1101 0000 /// "C5_S C4_E C3_S 01 0"
setup_spi(spi_master | spi_l_to_h | spi_clk_div_16); delay_ms(4);//| SPI_XMIT_L_TO_H); //);// | SPI_XMIT_L_TO_H);
output_high(PIN_c7);
} else {
MASTER=0; set_tris_c(240); delay_ms(2); // 1111 0000 /// "C5_E C4_E C3_S 11 0"
setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16); delay_ms(2);//| SPI_XMIT_L_TO_H); //);// | SPI_XMIT_L_TO_H);
output_low(PIN_c7);
}