Autor Tema: Ayuda con codificación de dos pics 16f877 tx-rx 9 canales  (Leído 1396 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado beamandymess

  • PIC10
  • *
  • Mensajes: 1
Ayuda con codificación de dos pics 16f877 tx-rx 9 canales
« en: 11 de Septiembre de 2013, 23:14:56 »
Hola. Em, soy nueva en el foro. Y la verdad que hace rato que venía por acá para mirar sobre pics porque estoy trabajando con ellos en el colegio y no nos mostraron bien como funcionaban y tuve que rebuscarmelas y acá encontré bastante info.
Empecé a programar y a hacer cosas con un libro que me está ayudando. Necesito un guía para poder terminar este programa y que funcione mi circuito en el simulador. Uso el CCS 4.0 como compilador y el Proteus 8.0 como mi simulador. En fin, lo que estoy tratando de hacer es una grúa móvil a control remoto, con 9 canales. Y transmitir los datos con un RF. En el tema del RF estoy completamente perdida, ya leí bastante pero no estoy aún segura de cómo hacer mi programa. Hice un intento, les paso los códigos y me dicen que está mal. Ahora si luego me quieren ayudar con mi simulación sería incluso mejor, pero mi esquemático está horrible. Ahí les va más o menos lo que intento hacer. Un algoritmo y luego el código. Si me dicen qué necesito para que funcione bien con un módulo de 433MHz o algo se los agradecería. Creo que mi mayor problema es la comunicación, y luego la parte de los pulsos de salida. Pero lo que quiero es saber si al menos envío de forma correcta los datos. No sé si me doy a entender.


TRANSMISION DE DATOS    
         PINES A SER UTILIZADOS
//
//       PINA0 = adelante
//       PINA4 = retroceso
//       PINA2 = izquierda
//       PINA3 = derecha
//
//       PINB0 = grua hacia izquierda
//       PINB1 = grua hacia derechan
//
//       PINB4 = polea abajo
//       PINB5 = polea arriba
//
//       PINC1 = IMAN PRENDIDO
//       PINC2 = IMAN APAGADO
//
//
//             !!!!!!!!!!!!TRAMAS!!!!!!!!!!!!!
//    TRAMA DE ERROR= 100
//
//    Si adelante y derecha = 150
//    Si adelante e izquierda =  250
//    Si adelante solo = 50
//
//    Si retroceso y derecha = 140
//    si retroceso e izquierda = 240
//    si retroceso solo = 40
//
//    Si izquierda sola o derecha sola= 100
//    si adelante y retroceso juntos = 100
//    si izquierda y derecha juntos = 100
//
//    Si grua hacia izquierda = 170
//    si grua hacia derecha = 180
//    si grua ambos lados= 100
//
//    si polea hacia abajo = 210
//    si polea hacia arriba = 220
//    si polea ambos lados = 100
//
//    prender iman= 80
//    apagar iman= 90
//
//    polea y grua juntos = 100
//    grua y movimiento juntos = 100//



//         RECEPCIÓN Y USO DE PINES SALIDAS.


GIRO DE LOS MOTORES SEGUN NECESIDAD

adelante    = horario
atras         = antihorario
izq            = horario
derecha    = antihorario
gizq          = horario
gderecha   = antihorario
poleabajo  = horario
polearriba = antihorario




ELEMENTOS A SER USADOS, PINES DE CONEXION AL PIC

MOTOR1(adelante, atras)        = PINB0(1A), PINB1(2A)
MOTOR2(izquierda, derecha)     = PINB2(3A), PINB3(4A)
MOTOR3(gizquierda, gderecha)   = PINB4(1A), PINB5(2A)
MOTOR4(poleabajo, polearriba)  = PINB6(3A), PINB7(4A)
IMAN1 (prendido, apagado)      = PINC1

(son motores dc y tienen un driver con puentes h para controlar la direccion del giro)


TRAMA
funciones
estados de salidas

150   
Mover motor1 adelante(h), mover motor2 derecha(ah).      
PINB0=0, PINB1=1. PINB2=1, PINB3=0.

250   
Mover motor1 adelante(h), mover motor2 izquierda(h).      
PINB0=0, PINB1=1. PINB2=0, PINB3=1.

50   
Mover motor1 adelante(h)               
PINB0=0, PINB1=1.

140   
Mover motor1 atras(ah), mover motor2 derecha(ah)      
PINB0=1, PINB1=0. PINB2=1, PINB3=0.

240   
Mover motor1 atras(ah), mover motor2 izquierda(h)      
PINB0=1, PINB1=0. PINB2=0, PINB3=1.

40   
Mover motor1 atras(ah)                  
PINB0=1, PINB1=0.

170   
 Mover motor3 gizquierda(h)               
PINB4=0, PINB5=1.

180   
Mover motor3 gderecha(Ah)               
PINB4=1, PINB5=0.

210   
Mover motor4 poleabajo(h)               
PINB6=0, PINB7=1.

220   
Mover motor4 polearriba(ah)               
PINB6=1, PINB7=0.

80   
IMAN1 prendido                     
PINC1=1.

90   
IMAN1 apagado                     
PINC1=0.[/table]
 


este es un intento del transmisor que no me funcionó bien. No estoy segura por qué D:

Código: [Seleccionar]
#include "C:\Users\Acer\Documents\codigos en c\prueba1.h"
 #use fast_io (A)
 #use fast_io (B)
 #use fast_io (C)
 
int TRAMA()
{
   int valor, ad, at, iz, der, giz, gder, pab, par, ipr, iap;
   set_tris_A (0xFF);
   set_tris_B (0xFF);
   set_tris_C (0x0F);
   
   port_b_pullups (TRUE);
   
   ad = input(PIN_A0);
   at = input(PIN_A4);
   iz = input(PIN_A2);
   der = input(PIN_A3);
   giz = input(PIN_B0);
   gder = input(PIN_B1);
   pab = input(PIN_B4);
   par = input(PIN_B5);
   ipr = input(PIN_C1);
   iap = input(PIN_C2);
   
   
   if (ad==1)
   {
      if (iz==1){
         valor=250;
      }else if (der==1){
         valor=150;
      }
      valor=50;
   } else if (at==1)
   {
      if (iz==1){
         valor=240;
      }else if (der==1){
         valor=140;
      }
      valor=40;
   }
   if (giz==1){
   valor=170;
   }
   if (gder==1){
   valor=180;
   }
   if (pab==1){
   valor=210;
   }
   if (par==1){
   valor=220;
   }
   if (ipr==1){
   valor=80;
   }
   if (iap==1){
   valor=90;
   }
   valor=0;
   return (valor)
   }
   
   
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   

   // TODO: USER CODE!!
   int i
   
while (TRUE)
   {
      putc(10);
      delay_ms(100);
      if (TRAMA!=0)
      {
       putc(TRAMA);
       delay_ms(100);
       i++;
      }
    if (i>255)
      putc(0);
      delay_ms(100);
      i=0;
   }
 

}

Luego hice también este.. Tampoco funcionó bien :S
Código: [Seleccionar]
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

  #include <stdio.h>
 #use fast_io (A)
 #use fast_io (B)
 #use fast_io (C)
 int TRAMA, puertoA, puertoB;
void main(void)
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!

   set_tris_A (0xFF);
   set_tris_B (0xFF);
   set_tris_C (0x0F);
   
   While (TRUE)
   {
      while (input(PIN_A0)== 1)  //lee el pin acelerar//
      {
         if (input(PIN_A2)== 1)  //esta pulsando pin doblar izquierda?//
           {
           TRAMA= 250;
           PUTC(TRAMA);    //MANDA LA TRAMA EN TODOS LOS CASOS POR EL SERIAL
           }
         else if( input (PIN_A3)== 1) //esta pulsando pin doblar derecha?//
            {
            TRAMA= 150;
            PUTC(TRAMA);
            }
           
         TRAMA= 50;     // si solo pulsa el de acelerar//
         PUTC(TRAMA);
      }
     
      while (input(PIN_A4)== 1)   // se presiona el pin retroceso
       {
            if (input(PIN_A2)== 1) //esta pulsando pin doblar izquierda?//
              {
                  TRAMA= 240;
                  PUTC(TRAMA);
              }
               else if( input (PIN_A3)== 1)  //esta pulsando pin doblar derecha?//
               {
                  TRAMA= 140;
                  PUTC(TRAMA);
               }
               
            TRAMA= 40;           // si solo pulsa el de retroceder//
            PUTC(TRAMA);
       }
   
       while ((input(PIN_A0)&& input (PIN_A4))== 1)   //se presiona acelerar y retroceder juntos, error//
         {
            TRAMA= 100;
            PUTC(TRAMA);
         }
       while ((input(PIN_A2)&& input (PIN_A3))== 1)   //se presiona izquierda y derecha juntos, error//
          {
             TRAMA= 100;
             PUTC(TRAMA);
          }
     
      while (input (PIN_B0)== 1)          //pin mover grua hacia la derecha//
         {
            TRAMA= 170;
            PUTC(TRAMA);
         }
      while (input (PIN_B1)==1)      //pin mover grua hacia la izquierda//
         {
            TRAMA= 180;
            PUTC(TRAMA);
         }
      while ((input (PIN_B0) && input (PIN_B1))== 1)     //se quiere mover la grua hacia ambos lados, error//
         {
            TRAMA= 100;
            PUTC(TRAMA);
         }
         
      while (input (PIN_B4)== 1)         //pin mover polea hacia abajo//
         {
            TRAMA= 210;
            PUTC(TRAMA);
         }
      while (input (PIN_B5)==1)      //pin mover polea hacia arriba//
         {
            TRAMA= 220;
            PUTC(TRAMA);
         }
      while ((input (PIN_B4) && input (PIN_B5))== 1)     //se quiere mover la polea en ambas direcciones, error//
         {
           TRAMA= 100;
           PUTC(TRAMA);
         }
         
      while (input (PIN_C1)== 1)         //prender iman//
         {
            TRAMA= 80;
            PUTC(TRAMA);
         }
      while (input (PIN_C2)==1)            //apagar iman//
         {
            TRAMA= 90;
            PUTC(TRAMA);
         }
         
       while (((input(PIN_B4)|| input(PIN_B5))&& (input(PIN_B1) || input(PIN_B0)))== 1) //se quiere usar la polea y la grua juntas, error//
         {
            TRAMA= 100;
            PUTC(TRAMA);
         }
       while (((input(PIN_A0) || input(PIN_A2)|| input(PIN_A3)|| input(PIN_A4))&& (input(PIN_B1) && input(PIN_B0))) == 1)  //se quiere usar el movimiento y la grua juntos, error//
          {
            TRAMA= 100;
            PUTC(TRAMA);
          }
   }
}


Y luego hice un receptor... Adivinen. Simulé todo junto y tampoco funcionaba  :x
Código: [Seleccionar]
#include "C:\Users\Acer\Documents\codigos en c\receptorpruebah\receptorpruebah.h"
int trama;
#use standard_io (A)
#use standard_io (B)
#use standard_io (C)
#int_RDA
void RDA_isr()
{
   trama= getc();
}



void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   // TODO: USER CODE!!
   
   while(TRUE)
      {
         switch (trama)
         {
         case (150):
            {
             output_high(PIN_B1);
             output_low (PIN_B0);
             output_high(PIN_B2);
             output_low (PIN_B3);
             delay_ms(100);
            }
         case (250):
            {
             output_high(PIN_B1);
             output_low (PIN_B0);
             output_high(PIN_B3);
             output_low (PIN_B2);
             delay_ms(100);
            }
         case (50):
            {
             output_high(PIN_B1);
             output_low (PIN_B0);
             delay_ms(100);
            }
         case (140):
            {
             output_high(PIN_B0);
             output_low (PIN_B1);
             output_high(PIN_B2);
             output_low (PIN_B3);
             delay_ms(100);
            }
         case (240):
            {
             output_high(PIN_B0);
             output_low (PIN_B1);
             output_high(PIN_B3);
             output_low (PIN_B2);
             delay_ms(100);
            }
         case (40):
            {
             output_high(PIN_B0);
             output_low (PIN_B1);
             delay_ms(100);
            }
         case (170):
            {
             output_high(PIN_B5);
             output_low (PIN_B4);
             delay_ms(100);
            }
         case (180):
            {
             output_high(PIN_B4);
             output_low (PIN_B5);
             delay_ms(100);
            }
         case (210):
            {
             output_high(PIN_B7);
             output_low (PIN_B6);
             delay_ms(100);
            }
         case (220):
            {
             output_high(PIN_B6);
             output_low (PIN_B7);
             delay_ms(100);
            }
         case (80):
            {
             output_high (PIN_C1);
             delay_ms(100);
            }
         case (90):
            {
             output_low (PIN_C1);
             delay_ms(100);
             break;
            }
         }   
      }
}

En fin, soy novata total.. Si me ayudaran me harían un gran favor.

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 129
    • Desarrollos y Servicios Digitales
Re: Ayuda con codificación de dos pics 16f877 tx-rx 9 canales
« Respuesta #1 en: 14 de Febrero de 2014, 17:48:21 »
Hola,

Estoy con el mismo problema que vos,

¿Tuviste algún avance? ¿Pudiste resolver la comunicación RF?

Gracias y saludos
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/