Autor Tema: lecturas y salidas (digitales y analogicas) en lengua c para pic  (Leído 13052 veces)

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

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #15 en: 22 de Marzo de 2016, 22:26:36 »
KILLERJC aaaaaaaaaa ya te entendí que lo que puse es orientado a el lenguaje de programación en c pero no orientado a pic verdad y si es asi eso es lo mismo que me e encontrado que no e encontrado ejemplos de la aplicación de la alarma pero orientado en lenguaje c para pic por eso voy a trabajar con lo que me digan puesto tienen mucha experimenta. supongo que ya se an encontrado con este tipo de aplicaciones por lo pronto creo creo lo digo bien creo porque los que saben más de esto son los que llevan más tiempo programando tengo que entender al 100% las dos rutinas la A y la B que me mando w3-sistemas y colocarle al código lo que le falta como son los fusibles, la velocidad del cristal el pic que debe de ser uno que tiene 3 puertos veo y hay poco a poco hacerlo 

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #16 en: 22 de Marzo de 2016, 22:44:01 »
 mi buen w3-sistemas
lo que no aprece en el codigo que lo pones como #include "main.h" lo puedo sustituir por esto

#include <18f2550.h>

#fuses HSPLL, PUT, BROWNOUT, NOWDT, NOPROTECT, NOLVP
#fuses NODEBUG, USBDIV, PLL5, CPUDIV1, VREGEN, CCP2B3// VIT DE CONFIGURACION

#USE delay(clock=48000000)

#org 0x0000, 0x0FFF{}

#use standard_io(A)
#use standard_io(B)
#use standard_io(C)

comentamen si me falta declarar alguna constante global o variable goblal o alguna interrucin o que mas para ir poco a poco entendiendolo y completandolo

y tambien si me explicas esta parte if(SWbits.fSw1) segun yo
if            significa si
SWbit     definicion que no veo de swich asignado a un bits
.fSw1      el . es una asignacion a una direccion de memoria y
fsw1 el nombre que se le dio a la direccion de memoria
comentame por fa como voy gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #17 en: 22 de Marzo de 2016, 23:43:03 »
Por eso mismo decia que era muy avanzado e incompleto.

Citar
, y en tus ejemplos estas poniendo enum, struct, y defines que ni siquiera estan en el texto, switch / break. Lo cual me parece a mi que lo va a marear mas.

Por ahora me extiendo un poco y luego voy a tu pregunta.

el . es para acceder a los elementos de una estructura o una union, personalmente no creo que sea correcto por ahora ir por ese camino, pero si te interesa como usarlo o como funciona te dejo una idea. Supongamos que tenes una estructura (struct) de 3 elementos, 2 int8 y uno int16

Código: C
  1. // Definicion de la estructura, es decir como esta conformada la misma
  2.  
  3. struct MyStructTag {
  4.         int8    variable1;
  5.         int8    variable2;
  6.         int16   variable3;
  7. }
  8.  
  9. // Creacion de una estructura
  10.  
  11. struct MyStuctTag MyStruct1;
  12. struct MyStuctTag MyStruct2;
  13.  
  14. // Para acceder a los elementos de la estructura haces:
  15.  
  16. MyStruct1.variable1 = 0 ;               // Pongo a 0 variable 1, de MyStruct1
  17. MyStruct1.variable3 = 1024;             // Pongo a 1024 la variable 3 de MyStruct1
  18. MyStruct2.variable3 = 100;              // Pongo a 100 la variable 3 de MyStruct2

Como ves hay variables pero de 8 bits.. por ahi quisieras variables de 1 bit. Y tambien poder acceder a todo como si fuera una de 8 bits, algo asi como los puertos.
En las estructuras tenes lo que se conoce como bit field. Es decir declaras la cantidad de bits que ocupan.

Código: C
  1. struct BitStuctTag {
  2.         unsigned Bit0                    :1;
  3.         unsigned Bit1                    :1;
  4.         unsigned Bit2                    :1;
  5.         unsigned Bit3                    :1;
  6.         unsigned Bit4                    :1;
  7.         unsigned Bit5                    :1;
  8.         unsigned Bit6                    :1;
  9.         unsigned Bit7                    :1;
  10. };

Y ahora podes acceder a cada uno de los bits de eso.. es decir si declaramos una estructura con el nombre "bitStruct" podria acceder a bitStruct.Bit0 y lo que me devolveria es 0 o 1 ya que es de 1 bit. Esto seria bastante parecido a hacer algo asi:

Código: C
  1. #define BIT0 0b00000001
  2. #define BIT1 0b00000010
  3. #define BIT2 0b00000100
  4. #define BIT3 0b00001000
  5. // Aca lso demas
  6.  
  7. int8 myvar;
  8.  
  9. if ((myvar & BIT0) == 0)                // Pregunto por si el Bit 0 esta en 0
  10. myvar |= BIT0;                          // Pongo a 1 el bit 0 de myvar
  11. myvar &= ~BIT0;                         // Pongo a 0 el bit 0 de myvar

Pero segun el compilador la implementacion puede ser muy mala. Hacer lo que hice antes puede que el compilador efectivametne necesite hacer una OR, etc, y no usar una instruccion que simplemente ponga a 1 el bit, todo depende del grado de optimizacion que posee el compilador.

Ahora si tu pregunta

Código: C
  1. if(SWbits.fSw1)

Es un condicional, es decir si lo que esta dentro de los parentesis es TRUE, va a ejecutar el codigo dentro de las llaves { }, Para que algo sea considerado TRUE debe ser distinto de 0. En el caso ese si fSw1 perteneciente a la estructura SWbits es 1, va a entrar y ejecutar el if.

Citar
// VIT DE CONFIGURACION

Es Bits o palabras.

Consejo no uses las directivas ORG en C, al menos no por ahora, y son casos especiales en los que deberias usarlo, me refiero a esto:

Citar
#org 0x0000, 0x0FFF{}

Citar
colocarle al código lo que le falta como son los fusibles, la velocidad del cristal el pic que debe de ser uno que tiene 3 puertos veo y hay poco a poco hacerlo
El codigo que te paso w3-sistemas para mi va a hacer que tengas mas problemas que si te manejas con simples if() , pero es bueno que veas un codigo, preguntes e intentes entenderle.
« Última modificación: 22 de Marzo de 2016, 23:45:14 por KILLERJC »

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #18 en: 24 de Marzo de 2016, 02:18:47 »
Hola mi buen KILLERJC asu  mecha ya casi me estoy quedando siego jejejej buscando y leyendo lo que hay en el foro pero es descomunal la información pero aun seguiré buscando como ir avanzando veo que si sabes un buen de esto por las repuestas que das eres de otro nivel: mrgreen:

por otro lado gracias por la explicación que me diste de las estructuras y en lo que el leído ese tipo de cosas  las utilizan en las matrices verdad por que leen datos de varios bits y si es correcto tengo que estudiar mas y mas para ir entendiendo más gracias

y me hago la pregunta me continuarías ayudando para ir desarrollando la famosa alarma que quiero realizar con leer entradas y salidas del pic te acuerdas a el condigo que me ayudaste con los if - else al simularlo no función me puedes decir que paso ósea no da erro al compilarlo solo que al simularlo no hace nada de nada

#include <16f84a.h>         //el pic a utilizar es por que solo requiero de pocos recursos para la alarma
#use delay(clock=4000000)   //tiempo del cristal 4 MG
#fuses NOWDT                //proteccion perro guardian of
#fuses PUT                  //proteccion para esperar que se estabilise la alimentacion del pic
                            // PORTB direccion es 06h y el TRISB la direccion es 86h


    void main(void){


            set_tris_b(0b0110101);  // RB0 y RB2,RB3,RB4,RB5 entradas Y RB1,RB3,RB7 salidas (10001010)
            output_low(PIN_B0);

            while(1)
            {
                    if(input(PIN_B0)==0)                    // Pregunto si la entrada del pin B0 es igual a 0
                    {
                            delay_ms(10);                   // Espero 10ms por si la llave esta rebotando (variando entre 1 y 0 )
                            while(input(PIN_B0)==0);        // Espero que suelte el boton, observa el ; al final, es decir un while(){}
                            output_toggle(PIN_B1);          // Cambio el valor del pin
                    }

                    if(input(PIN_B1)==1)
                    {
                            if(input(PIN_B2)==1)
                            {
                                    output_high(PIN_B3);          // Cambio el valor del pin
                            }
                            else
                            {
                                    output_low(PIN_B3);
                            }
                    }
                    else
                    {
                            output_low(PIN_B3);
                    }
            }
    }




Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #19 en: 24 de Marzo de 2016, 05:16:47 »
Es que le quitaste el

#use FAST_IO(B)

Es una trampa de CCS para la gente nueva.. A mi no me gusta.. pero es para que lo tengas en cuenta.
De forma normal el compilador esta en STANDART_IO

Entonces cuando hay funciones asi:
input(PIN_B0)==0

Lo que hace es hacer el pin una entrada, y si encuentra un output_low(PIN_Bx) lo transforma en salida.
Y por ahi eso NO es lo que uno quiere , tal ves uno quiere que siga como salida siempre y poder leer el estado que tiene el pin pero como salida.
Entonces al decirle FAST_IO, le decimos al compilador que no agrege codigo para pasarlo a entrada o salida.

Lo que nos queda es ahora definir cual pin va a ser entrada y cual salida. Para eso esta:

set_tris_b(0b0110101);

donde el bit 0 es decir el de la derecha pertenece a B0, un 1 significa entrada, un 0 salida.

Es por eso que no te funciona como vos queres, pero si te fijas en el antiguo post que preguntaste sobre eso y te di el codigo, tenia escrito el #use fast_io si no mal recuerdo.

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #20 en: 24 de Marzo de 2016, 17:27:40 »
asuuuuuuu KILLERJC si funciono ya   :-/ . hasta hay fíjate que yo le había  colocado #use standard_io(b) y me marcaba error pero no se me cerro el mundo cuando lo puse
 pero gracias le coloque #use FAST_IO(B)  y ya funciona en la simulación ahora voy a pensarle en donde lo anexo otras dos entradas y otras dos salidas con el if saludos  :mrgreen:

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #21 en: 25 de Marzo de 2016, 16:59:45 »
hola intente colocar la siguiente condicion pero me marca herror   if(input(PIN_B2)==1) || (input(pin_b4==1))

lo que me dise como erroe es

A numeric expression must appear here    lo traduje y dise  Una expresión numérica debe aparecer aquí    por que marca error me pueden ayudar


todo completo es asi

#include <16f84a.h>         //el pic a utilizar es por que solo requiero de pocos recursos para la alarma
#use delay(clock=4000000)   //tiempo del cristal 4 MG
#fuses NOWDT                //proteccion perro guardian of
#fuses PUT                  //proteccion para esperar que se estabilise la alimentacion del pic
#use FAST_IO(B)             // PORTB direccion es 06h y el TRISB la direccion es 86h


    void main(void){


            set_tris_b(0b0110101);  // RB0 y RB2,RB3,RB4,RB5 entradas Y RB1,RB3,RB7 salidas (10001010)
            output_low(PIN_B0);

            while(1)
            {
                    if(input(PIN_B0)==0)                    // Pregunto si la entrada del pin B0 es igual a 0
                    {
                            delay_ms(10);                   // Espero 10ms por si la llave esta rebotando (variando entre 1 y 0 )
                            while(input(PIN_B0)==0);        // Espero que suelte el boton, observa el ; al final, es decir un while(){}
                            output_toggle(PIN_B1);          // Cambio el valor del pin
                    }

                    if(input(PIN_B1)==1)
                    {
                            if(input(PIN_B2)==1) || (input(pin_b4==1))

                            {
                                    output_high(PIN_B3);          // Cambio el valor del pin
                            }
                            else
                            {
                                    output_low(PIN_B3);
                            }
                    }
                    else
                    {
                            output_low(PIN_B3);
                    }
            }
    }
« Última modificación: 25 de Marzo de 2016, 17:33:15 por nuevo mundo »

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #22 en: 25 de Marzo de 2016, 17:52:27 »
lo puse asi y no marca error pero  no realiza la condicion si algunos de los dos pines b2 o b4=1 dar salida en 1 a pin 3

 if(input(PIN_B2)==1 || input(pin_b4==1))

me pueden explicar por que en las dos formas no son correctas

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #23 en: 25 de Marzo de 2016, 18:22:50 »
Tu Error:

Observa los parentesis y trata e ir paso por paso

if( input(PIN_B2)==1) || (input(pin_b4==1) )

en ese caso existe un parentesis de menos antes del input(PIN_B2), ademas observa que es input(PIN_XX) y vos metiste el == dentro. Ahora lo voy a escribir bien y vamos a desmenuzarlo

if( (input(PIN_B2)==1) || (input(pin_b4)==1) )

Ahora si. los parentesis de afuera recubren todo lo de adentro , Adentro hay 2 elementos por una OR.

(input(PIN_B2)==1)              ||              (input(pin_b4)==1)

Como en una OR logica deberia hacer OR entre TRUE/FALSE me refiero a TRUE || FALSE, TRUE || TRUE , FALSE || FALSE, etc

Cada uno de esos elementos es una comparacion:

input(PIN_B2) == 1

input() es una funcion, que va a devolver un numero 1 o 0, segun el pin que posea el argumento. Si es 1 lo devuelto por esta funcion, esa condicion quedaria  1 == 1 , es decir 1 igual a 1 ? TRUE ( Verdadero ), sino puede que devuelva un 0 y quedar 0 == 1, 0 igual a 1?, FALSE ( Falso )

Entonces pensalo paso a paso. Suponete que B2 es igual a 0, y B4 igual a 1. el if quedaria asi:

if( (input(PIN_B2)==1) || (input(pin_b4)==1) )

if( ( 0 == 1 ) || ( 1 == 1 ) )
if( FALSE || TRUE )
if( TRUE )

Con lo que entraria al if por ser la condicion Verdadera.

Ahora vamos con el error y por que uno te funciono y otro no.

- El primer caso fue que le erraste en la cantidad de parentesis, como decia el if deberia encerrar TODO pero en el primer caso:

if(input(PIN_B2)==1) || (input(pin_b4==1))

Se cierra luego del primer ==1, lo cual esta mal el if() quedando algo asi:

if(input(PIN_B2)==1)                ||             (input(pin_b4==1))

Como si ese OR y lo demas fuera aparte. y no es asi.

- Tu segundo codigo en cambio no tiene problemas de parentesis, observaras que los parentesis del input() abren y cierran 1 ves, en cada caso y el parentesis del if abre y cierra en todo.

if(       input(PIN_B2)==1 || input(pin_b4==1)       )

El problema aca es el segundo input(), me refiero a :

input(   pin_b4 == 1      )

Como observas no le estoy pasando el valor PIN_B4 a input, sino que le estoy pasando el valor PIN_B4 == 1, es decir un TRUE o un FALSE. A pesar que uno pienso que ese PIN_B4 sea el pin exacto, para el programa PIN_B4 no es mas que un numero, que luego dentro de input, segun el numero ingresado leera la entrada que se desee. Tal ves ahi estabas leyendo A0 o A1, o tal ves un mal valor por que le estabas pasando un 0 o un 1. Distinto es como tenias antes:

input(PIN_B2) == 1

Y que como analizamos primero se resuelve la funcion, esta devuelve un valor (0 o 1 en este caso) que se compara con 1.
Espero que veas donde te estas equivocando. Son cosas muy basicas, pero muy basicas.
Pero segui que pronto va a ser todo mas facil.

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #24 en: 25 de Marzo de 2016, 22:32:37 »
ok enterado lo voy a colocar de esa forma y lo simulare asta horita no e encontrado en red de ejemplos de múltiples condiciones con un if o de algún otra forma metodo que se pueda realizar si tienes algún enlace o en realidad con tus habilidades creo que tienes unos cuantos en la mente jejejeje  :mrgreen: en serio se que hay voy poco a poco nadien nace sabiendo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #25 en: 25 de Marzo de 2016, 22:36:51 »
Es que con el ejemplo que te di ya deberias tener suficiente. Lo que realmente importa es que sepas que hace el if, como funciona, y Donde poner la condicion.

Lo demas es pura logica. if(x=0)..else    es lo mismo que: si (x=0) hacer ... si no lo es hacer

Si ya no entendes esa simple logica por mas cantidad de ejemplos que uno pueda poner es imposible que lo entiendas.

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #26 en: 26 de Marzo de 2016, 01:52:25 »
ok si comprendi segun yo pero para estar seguro partiendo con que En una compuerta OR,  la salida será “1″,cuando en cualquiera de sus entradas haya un “1″. 
segun mi logica (input(PIN_B2)==1) es una entra de la or y la otra (input(pin_b4)==1) y colocandole entre paretesis quedan dentro del if que si una de las dos lecturas de los pines es =1 el if es verdadero y hara o que sigue que es ensender el pin rb3 asi lo entiendo es correcto ?????
por que segun lo que quiero es que si RB2 O RB4 estan en un estado alto cuando lea la condicion se encienda RB3
y con todo esto que e visto para que se entienda mejor deberia de asignar variables a los led que son salidas y a los swich que son entrada para una mejor comprencion pero creo que primero que aga esto verdad 

oyes soy el peor alumno que as tenido verdad jajajaja es un chascarrilo para salir un momentito ala risa



Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #27 en: 26 de Marzo de 2016, 03:49:01 »
ya loo coloque de manera correcta segun pero no lo ejecuta de manera correcto  :5] uuuf

if((input(PIN_B2)==1) || (input(pin_B4==1)))
 al accionar el interuptor que esta en RB4 =1 no ensiende RB3 solo  cuando se acciona RB2

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #28 en: 26 de Marzo de 2016, 04:59:37 »
Citar
segun mi logica (input(PIN_B2)==1) es una entra de la or y la otra (input(pin_b4)==1) y colocandole entre paretesis quedan dentro del if que si una de las dos lecturas de los pines es =1 el if es verdadero y hara o que sigue que es ensender el pin rb3 asi lo entiendo es correcto ?????
por que segun lo que quiero es que si RB2 O RB4 estan en un estado alto cuando lea la condicion se encienda RB3

En parte es correcto, esa OR en realidad dice que cuando una de las 2 condiciones que nombras es verdadera entraria al if. Sea lo que sea que tengas analizando como verdadero o falso. En tu caso justamente estas analizando las entradas y una condicion es si esta en 1 B2, y la otra si esta en 1 B4.

ya loo coloque de manera correcta segun pero no lo ejecuta de manera correcto  :5] uuuf

if((input(PIN_B2)==1) || (input(pin_B4==1)))
 al accionar el interuptor que esta en RB4 =1 no ensiende RB3 solo  cuando se acciona RB2

Mostra el programa completo, ademas ese if, vuelve a tener un problema, mira el == del pin_b4 donde esta

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #29 en: 27 de Marzo de 2016, 03:35:42 »
si es correcto solo al colocarle el paréntesis que faltaba funciono la condición   :mrgreen: y creo que es la primera vez que veo un ejemplo de dos condiciones dentro de un if  para manejo de pines.
se siente bien ir poco a poco avanzando pero realmente sin tu ayuda aun no tuviera avance gracias
 creo que tendre que ponerme lentes jejejejej
aora segire abansando colocare 2 mas aver que pasa jejejeje


 

anything