Autor Tema: Activación de reles  (Leído 893 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RamonGarcia

  • PIC10
  • *
  • Mensajes: 16
Activación de reles
« en: 27 de Marzo de 2022, 23:58:21 »
Qué tal, disculpen estoy trabajando en el lenguaje CCS compiler con el pic18f4550, en la activación de unos reles, los cuales me realicen diferentes combinaciones, mientras unos están activados, otros desactivados y se presenten en una lcd, pero no se si estoy realizando de manera adecuada la activación de los reles, porque cuando corro mi programa unos si se activan y los que deben permanecer desactivados se respeta la combinación pero hasta dicha pulsación ya no respeta la combinación, estoy usando dos push boton, la programación la hice de manera de incremento y a su vez en decremento si es que quiero que se haga una combinación anterior.

Dejo el programa, no se si me puedan ayudar por favor.
#include<18F4550.H>
#fuses HSPLL, PLL5, USBDIV, NOWDT, CPUDIV1, NOPROTECT, NODEBUG, NOPBADEN, NOLVP, NOVREGEN 
#use delay (clock=4000000)             //Fosc=4Mhz
#define LCD_DATA_PORT getenv("SFR:PORTD")

#include <lcd.c>
#BYTE PORTA = 0xF80
// Memoria de los puertos 18F4550
#BYTE PORTA = 0xFF
#BYTE PORTA = 0XF0
#BYTE PORTB = 0xF1
#BYTE PORTA = 0x0F


int push;

VOID MAIN(){
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("PROGRAMA");
push=0;
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("PROGRAMA CHIDO");


while (true){

delay_ms(500);

if (input(pin_B0)==01){
push=push+1;
}
if (input(pin_B1)==01){
push=push-1;
}
if(push==1){

output_low(pin_A3);
output_high(pin_A1);
output_high(pin_A2);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("A-N+=0 GRADOS");
   
}

if(push==2){
output_high(pin_A2);
output_low(pin_A3);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("C+A-=30 GRADOS");

}

if(push==3){
output_high(pin_A2);
output_low(pin_A3);
output_low(pin_A4);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("C+N-=60 GRADOS");

}

if(push==4){
output_low(pin_A4);
output_high(pin_A2);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("B-C+=90 GRADOS");

}

if(push==5){
output_low(pin_A4);
output_high(pin_A0);
output_high(pin_A2);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("B-N+=120 GRADOS");

}

if(push==6){
output_high(pin_A0);
output_low(pin_A4);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("A+B-=150 GRADOS");

}

if(push==7){
output_high(pin_A0);
output_low(pin_A4);
output_low(pin_A5);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("A+N-=180 GRADOS");

}

if(push==8){
output_low(pin_A5);
output_high(pin_A0);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("C-A+-=210 GRADOS");

}

if(push==9){
output_low(pin_A5);
output_high(pin_A0);
output_high(pin_A1);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("C-N+=240 GRADOS");

}

if(push==10){
output_high(pin_A2);
output_low(pin_A5);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("B+C-=270 GRADOS");

}

if(push==11){
output_high(pin_A2);
output_low(pin_A3);
output_low(pin_A5);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("B+N-=300 GRADOS");

}

if(push==12){
output_low(pin_A3);
output_high(pin_A1);
lcd_init();
    lcd_gotoxy(1,1);
    lcd_putc("A-B+=330 GRADOS");

}

if(push==13){
push=0;
}
}
}

Conectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Activación de reles
« Respuesta #1 en: 28 de Marzo de 2022, 02:45:46 »
Código: [Seleccionar]
#BYTE PORTA = 0xF80
// Memoria de los puertos 18F4550
#BYTE PORTA = 0xFF
#BYTE PORTA = 0XF0
#BYTE PORTB = 0xF1
#BYTE PORTA = 0x0F

Por qué no hacés directamente
Código: [Seleccionar]
#BYTE PORTB = getenv("SFR:PORTB")
#BYTE PORTA = getenv("SFR:PORTA")
en lugar de ensayar direcciones.


No se entiende como querés activar/desactivar los relays, porque ahí arranca el puerto A en alta impedancia y a partir de ahí al bit que va a '1' o '0' nada lo hace cambiar de estado.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Activación de reles
« Respuesta #2 en: 28 de Marzo de 2022, 07:20:30 »
Por qué no hacés directamente
Código: [Seleccionar]
#BYTE PORTB = getenv("SFR:PORTB")
#BYTE PORTA = getenv("SFR:PORTA")
en lugar de ensayar direcciones.

Para mi seria: "Porque mejor no usa las funciones de CCS y deja de tocar los registros a mano" especialmente cuando no los usa...


Luego hay miles de errores

lcd_init() en todos lados, cuando deberia solamente existir en un solo lugar
Push no tiene limites
El caso que Push sea 0 no esta contemplado
Hay que tener presionado el boton por 500ms o mas para que te lo tome.
Agregando protecciones...
Quitando referencias a que debe activarse en el LCD (aunque se puede agregar de la misma forma que con los numeros)

Todos esos if... cuando uno nota que es siempre el mismo código repetido quiere decir que se puede realizar de otra forma. Ejemplo.

Código: C
  1. char salidas[] = [0b1110,0b1100,0b1101,0b1001,0b1011,0b0011, ... etc];


Luego haces (sin ningun if)

Código: C
  1. output_a(salidas[push]);
  2. lcd_gotoxy(1,1);
  3. lcd_putc("%u GRADOS",push*30);

Entonces el programa simple quedaria:

Código: C
  1. #include<18F4550.H>
  2. #fuses HSPLL, PLL5, USBDIV, NOWDT, CPUDIV1, NOPROTECT, NODEBUG, NOPBADEN, NOLVP, NOVREGEN
  3. #use delay (clock=4000000)             //Fosc=4Mhz
  4. #define LCD_DATA_PORT getenv("SFR:PORTD")
  5.  
  6. #include <lcd.c>
  7.  
  8.  
  9. char salidas[] = [0b1110,0b1100,0b1101,0b1001,0b1011,0b0011, ... etc];
  10. int push = 0 , pushanterior = 0xFF;
  11.  
  12. VOID MAIN(){
  13.     lcd_init();
  14.     lcd_gotoxy(1,1);
  15.     lcd_putc("PROGRAMA CHIDO");
  16.     delay_ms(500);
  17.  
  18.  
  19. while (true){
  20.  
  21.    if (input(pin_B0)==1){
  22.        while(input(pin_B0));
  23.        if(push<13) {push=push+1;}
  24.    }
  25.    if (input(pin_B1)==1){
  26.        while(input(pin_B1));
  27.        if(push!=0) {push=push-1;}
  28.    }
  29.  
  30.    if(pushanterior != push) {
  31.       output_a(salidas[push]);
  32.       lcd_gotoxy(1,1);
  33.       lcd_putc("C+A-=%u GRADOS",push*30);
  34.       pushanterior = push;
  35.    }
  36. }

Desconectado RamonGarcia

  • PIC10
  • *
  • Mensajes: 16
Re:Activación de reles
« Respuesta #3 en: 29 de Marzo de 2022, 00:06:44 »
Gracias por la observación KillerJC, pero crees que me pueda funcionar para realizar todas las combinaciones, es decir, de acuerdo al programa que e realizado, quiero activar el primer paso que si es igual a 1 los reles que se deben de activar en NO lo hagan y los que no deben permanecer en NC.
Crees que pudiese ser mejor por casos y como lo realizaría?
No se si me he explicado de manera adecuada, espero tu respuesta saludos.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 571
Re:Activación de reles
« Respuesta #4 en: 29 de Marzo de 2022, 12:14:18 »
Los pulsadores poseen algún sistema anti rebotes por hardware? Porque por soft, no los veo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Activación de reles
« Respuesta #5 en: 29 de Marzo de 2022, 16:34:16 »
Gracias por la observación KillerJC, pero crees que me pueda funcionar para realizar todas las combinaciones, es decir, de acuerdo al programa que e realizado, quiero activar el primer paso que si es igual a 1 los reles que se deben de activar en NO lo hagan y los que no deben permanecer en NC.
Crees que pudiese ser mejor por casos y como lo realizaría?
No se si me he explicado de manera adecuada, espero tu respuesta saludos.

Pone que salidas deben estar activas y cuales desactivas en cada caso. Y se arma el array.

Robert tiene razon, yo me olvide el antirebote, pero son dos delays pequeños.


 

anything