# Nuevo en programación con MikroC



## jgarcam (Jul 1, 2010)

Hola pues acudo este foro por que me gusta participar y en ocasiones he necesitado ayuda, en esta ocasión me ha surgido una duda, me he hecho de un programador USB y un PIC16F628A, y debido a que tengo un poco de experiencia en programación en C he elegido el compilador mikroC para introducirme a la programación de PIC's, ya he hecho mi "hola mundo"  y ha funcionado de maravilla!


```
void main() {
     PORTB = 0;
     TRISB = 0;
     while(1) { 
          PORTB.F0 = 1;
          Delay_Ms(500);
          PORTB.F0 = 0;
          Delay_Ms(500);
     }
}
```
*¿pero mi duda es como puedo hacer para usar todos los pines de un puerto en un ciclo for?*, tal vez no he buscado lo suficiente o adecuadamente, pero no encuentro la manera correcta de hacer algo asi:

```
for(i=0;i<8;i++)
{
     PORTA.F(i) = 1;
     Delay_Ms(500);
     PORTA.F(i) = 0;
}
```
Se que esta no es la manera correcta de hacerlo pero creo que la idea se entiende, que es que se haga una secuencia de luces recursiva usando los 8 pines del puerto B.
De antemano muchas gracias por su apoyo y espero que me puedan ayudar


----------



## ByAxel (Jul 1, 2010)

No hay mucha ciencia en eso...

Para acceder a pines hay varias formas, esta es una expresado en tu ejemplo.

```
for(i=0 ; i<8 ; i++)
{
     PORTB = 1 << i;   // Secuencial; esto enciende 1 pin a la vez y el resto apagado.
     Delay_Ms(500);
}
```

Un saludo


----------



## jgarcam (Jul 1, 2010)

Hombre pues muchas gracias me has proporcionado una muy buena ayuda, y pues me ha llamado la atención que mencionaste que hay varias formas, si no es mucho pedir podrías ejemplificar alguna(s) otra(s), también quisiera saber si modificando el ejemplo que escribiste se podrían encender 2 pines a cada vez y los demas apagados.

Te agradezco mucho tu ayuda y ojala pudieses responder a esta segunda pregunta


----------



## iDan (Jul 2, 2010)

Hola jgarcam


Esta es una modificacion que se le podria hacer al ejemplo que te puso Carlos Alexis:


```
int x;
void main(void)
{
INTCON=0;
TRISB=0;
PORTB=0;
while(1)
{
for(x=0;x<7;x++)
{
delay_ms(500);
PORTB=3<<x;
}
}
}
```


Otra forma de hacer esto (si en caso necesitaras controlar un motor Stepper) seria de esta:


```
char arreglo[8]={0b11,0b110,0b1100,0b11000,0b110000,0b1100000,0b11000000,0b10000001};
int x;
void main(void)
{
INTCON=0;
TRISB=0;
PORTB=0;
while(1)
{
for(x=0;x<8;x++)
{
PORTB=arreglo[x];
delay_ms(500);
}
}
}
```


----------



## jgarcam (Jul 2, 2010)

Muchas gracias, por tu respuesta iDan de verdad han sido de gran ayuda ambas respuestas, han despejado mis dudas y me han dado un buen enfoque para el uso de mikroC.


----------



## iDan (Jul 2, 2010)

De nada amigo...


Cuando quieras algo no dudes en preguntar, aqui hay expertos en el tema y tambien los que comenzamos a programar como tu y yo...


----------



## jgarcam (Jul 11, 2010)

Bueno hace tiempo hice la pregunta que abrió este tema, y ahora me ha surgido la duda respecto a la respuesta, quisiera saber *¿como es que funciona el operador <<?*, es decir, ¿que efecto tiene? en la linea de código:


```
PORTB = 1 << i;
```

porque me he percatado que el numero que esta antes del operador: << es puesto (en forma binaria) en la salida PORTX y luego se recorre un pin hasta que no hay nada ke mostrar y entonces se reinicia el bucle (dependiendo de si asi lo haya hecho el programador).

*¿Es esta toda la explicación?¿Hay alguna manera mas detallada de describir lo que ocurre?*

Gracias de antemano por su ayuda


----------



## iDan (Jul 14, 2010)

Hola jgarcam


Mira este es un operador a nivel de bit y es conocido como Operadores de Desplazamiento a Nivel de bit (<<;>>) entonces... consta de 3 partes:

x>>y ó x<<y siendo "x" y "y" valores enteros...


1) "X": La "x" es el valor que nos servira de referencia... como toda linea se lee de izquierda a derecha, "x" sera el primer valor que tendra nuestra variable o puerto para empezar el desplazamiento...


2) ">>" ó "<<": Nuestro desplazamiento a nivel de bit (ya sea de izquierda a derecha o viceversa) sera indicado por la direccion de los desplazadores... siendo ">>" un desplazamiento de bit hacia la derecha o un decremento, y "<<" un desplazamiento de bit hacia la izquierda o un incremento... todo dependiendo de nuestro valor "y"

3) "Y":  La "y" es el valor que nos servira para indicar el tamaño de nuestro desplazamiento para el valor que tengamos en "x" y si queremos que incremente o decremente (direccion)...


Ejemplo:

siendo nuestra variable "c" igual a: c=28 (decimal) ó c=0x1c (hexádecimal) ó c=0b00011100 (binario)

c=c<<1; //Indicamos que se corre hacia la izquierda y en un solo bit o pesor y el nuevo valor 
            //de "c" sera igual a c=56 ó c=0x38 ó c=0b00111000

Ya sea "y"=1 u otro valor, otro ejemplo:

Siendo c=1 ó c=0x01 ó c=0b00000001

c=c<<2; //Ahora el valor de "c" se corre a la izquierda y  en 2 bit o pesor, siendo el nuevo
            //valor de "c" igual a c=4 ó c=0x04 ó c=0b00000100

Espero que esto te haya ayudado a aclarar algunas dudas... sino... entonces avisas...!!  


Saludos


----------



## jgarcam (Jul 14, 2010)

Muchas gracias por tu ayuda iDan, estuve experimentando el alcance de esta operación conectando todo el puerto B a un display de barras y ahi pude observar y quedo aun mas claro lo que amablemente me explicaste, muchas gracias por tu excelente explicación .

Saludos, Jorge.

P.D. Si no eres profesor espero consideres serlo, te iria muy bien , hasta pronto.

Y si lo eres, pues muchas felicidades, eres muy bueno


----------



## JuanCarlosabigor (Oct 21, 2010)

Hola compañeros, yo tambien soy nuevo en la programacion de pic, y en mikroC, alguno de ustedes me podria ayudar, para saber la forma correcta de leer un puerto en c, ya que yo hago lo siguiente:

void main() {
PORTA=0;
TRISA=0;
PORTB=0;
TRISB=0x03;
leer:    if (PORTB & 0x03)     //si B0 y B1 se oprimen simultaneamente
                                     //enciende el circuito
          {
            porta=0Xff;        //ESTA INST. LA PONGO PARA SABER SI ENTRA AL IF
          }
          else{ goto leer;}
}
Oja y me puedan ayudar ya que en mikroc entra al if sin cumplir la condicion, de antemano gracias


----------



## jgarcam (Oct 21, 2010)

Hola pues la verdad yo opte por mudarme a CCS pero bueno, ammm no estoy muy seguro de que estes usando el if correctamente, yo lo pondría asi:


```
leer:
     if((PORTB.F0 == 1) && (PORTB.F1 == 1)){ //o tambien así PORTB == 0x03
           PORTA = 0xFF;
     }
     else{
           goto leer;
     }
```

La verdad no estoy seguro que sea así en mikroC pero se me hace lo mas lógico. Al parecer siempre entra al *if* por que la condicion PORTB&0x03 te la reconoce como una condicion valida y siempre es verdadera.
Epero haberte ayudado o por lo menos darte una idea de por donde vaya tu problema


----------



## iDan (Oct 21, 2010)

Hola amigos... paso rapido:


@JuanCarlosabigor:

Mira este es el programa que escribiste:



> void main() {
> PORTA=0;
> TRISA=0;
> PORTB=0;
> ...



mira si quieres evitarte hacer un tremendo loop con el famoso goto entonces has que todo tu programa entre en un ciclo que lo repita y asi no tengas que hacer loops... mira te doy un ejemplo simple ya que no se que PIC usas:


```
void main()
{
INTCON=0;
TRISA=0;
TRISB=3;
PORTA=0;
PORTB=0;
[B]while (1)[/B]
{
if(PORTB.F0==1 && PORTB.F1==1)
PORTA=1;
else
PORTA=0;
}
}
```


Ahora en programacion cuando usas una sentencia if-else, si la accion a realizar la sentencia es solo una linea, tal el caso de:


```
if(PORTB.F0==1 && PORTB.F1==1)
[B]PORTA=1;[/B]
```

entonces *NO* se utilizan llaves {} para indicarle al if donde empieza la accion a realizar y donde termina, ya cuando son 2 o mas lineas si las tienes que usar...

yo por lo pronto no miro mas problemas... pero si tienes alguna duda no pienses 2 veces en preguntar...


Saludos JuanCarlosabigor y jgarcam


----------



## JuanCarlosabigor (Oct 21, 2010)

Hola!
Gracias jgarcam y iDan, me ha ayudado mucho, ahora voy a entrarle a programar el taimer ya que lo requiero en mi proyecto, y pues si tengo algunas dudas les preguntare gracias.

Una duda mas, yo empeze programando con Mplab, pero no pude simular en C, un profe me dijo que tenia que descarga un programa de la pagina de Microchip para poder simular en C desde Mplab, pero la verdad no lo he encontrado, ¿saben cual es esta herramienta? de casualidad, bueno como siempre de antemano gracias y ¡Suerte!


----------



## jgarcam (Oct 21, 2010)

A pues la verdad no entendi muy bien tu pregunta JuanCarlosbigor pero espero que esto la responda, yo uso un COMPILADOR de C que se vincula mediante un PLUGIN con MPLAB, el compilador se llama CCS y tiene aglunas herramientas como debugger y otras, MPLAB por su parte tiene algunas herramientas de simulación y ayuda para programar estas se encuentran en el menu Tools.


----------



## AuPata (Mar 26, 2011)

Tambien soy nueva en MikroC, un saludo para todos, quisiera saber como se hace para leer y escribir un dato. 
Por ejemplo si por A0 me esta entrando 01000111, quisiera capturar estos datos, esperar a que lleguen los 8 y escribirlos por un puerto.... 
Muchas gracias a todos


----------



## jgarcam (Mar 27, 2011)

AuPata dijo:


> Tambien soy nueva en MikroC, un saludo para todos, quisiera saber como se hace para leer y escribir un dato.
> Por ejemplo si por A0 me esta entrando 01000111, quisiera capturar estos datos, esperar a que lleguen los 8 y escribirlos por un puerto....
> Muchas gracias a todos



Hola pues bienvenida y felicidades, ya tiene rato que abandoné la programación de micros y más en MikroC (T-T), como escribí más arriba me he mudado de compilador, pero bueno al tema, lo que tu tienes es un dato (o datos) en serie dado ke que los quieres leer por un solo pin, según tengo entendido para hacer esto debes tener por fuerza una sincronización, es decir, que tanto el dispositivo que envía el dato como el que lo lee "sepan" en que momento van a transmitir-leer, para ello hay dos formas generales:

1)Al enviar tu dato en un tren de pulsos inicias la lectura con el primer pulso de duración mayor a los demás, que al entrar por el pin del pic indique a éste que debe iniciar una lectura de un dato de n bits (la rutina que lo haga dependerá de ti y me parece que debes dominar las interrupciones para hacerlo). Este método lo utilizan los controles remotos de los aparatos electrónicos pero se puede aplicar también con cables, hay protocolos ya establecidos pero tu puedes crear tu propio código de comunicación.

2)Existen protocolos de comunicación serial como el RS232 o el one-wire, que utilizan muchos dispositivos como termómetros, memorias, etc. De esto hay mucha informacion y tutoriales en la web.

Si no te quedó muyclaro te recomiendo empezar tu búsqueda por aquí:
http://todopic.mforos.com/8826/1138399-leer-datos-en-forma-serial/


----------



## unifim (Jul 28, 2011)

hola a todos la verda que soy un poco nuevo en esto de los pics, estoy usando el mikroc para programarlos pero ahora cai en lio que no puedo salir, tengo una duda con esto, estuve haciendo una interrupcion externa peo en la simulacion no me sale como kiero.

lo que kiero es esto:

utilizando la interrupcion x cambio de estado, al ocurrir una interrupcion por el RB4 kiero que me de el mismao valor por el PORTD0 osea, si en RB4=1 entonces en PORTD=1
y si en RB4 esta en cero entonces kiero q tamien en PORTD se mantenga en cero, peo en proteus no c xq cuando ocurre el cambio de estado su valor en la simulacion retorna a cero

xfa aver si lo revisan y me dicen que es lo q me falta, soy un poco nuevo y la verda no ce donde esta el error. adjunto el codigo y la simulacion en proteus para q lo vean.

desde luego muchas gracias x su tiempo


----------



## tnxhawks (Mar 22, 2012)

Hola tengo un problema con un programa sencillo, lo que quiero hacer es leer el puerto RA0 y si es un 1 que encienda un led del puerto RB0, la compilacion no marca errores pero a la hora de simularlo no funciona, el codigo es el siguiente:

void configurar_puertos();
bit i;
void main() 
{
configurar_puertos();
PORTB=0x00;
 while(1)
 {
  if ( PORTA.F0 == 1)
   PORTB=0x01;
}}
void configurar_puertos()
{
 TRISB=0x00;
 TRISA=0xFF;
}


----------



## tannke (Mar 22, 2012)

Sería bueno pusieras que pic utilizas, la configuración de los fuses y una imagen del circuito montado.

En el codigo no veo error (segun el pic que utilices), por lo que lo mas probalble es que el fallo esté en la configuración de los fuses o en el montaje del circuito.

Un saludo


----------



## tnxhawks (Mar 22, 2012)

Utilizo un pic 18f4550 con un crystal externo de 20 MHz pero le hago preescaler para que el pic funcione a 48MHz

Gracias


----------



## tannke (Mar 23, 2012)

pues... no le veo fallo asi a vista rapida, ahora tampoco puedo ver el datasheet del 18f4550 estoy en el pc del trabajo y tengo muy limitados los accesos. Cuando llegue a casa lo revisaré un poco mejor. 
De todos modos piensa que en el simulador el cristal no hace nada ahi, tienes que entrar en las propiedades del pic y poner ahi la velocidad (48000000)

Un saludo y hasta luego


----------



## tannke (Mar 23, 2012)

visto, creo que faltaba configurar los puertos como digitales.
te pongo el codigo modificado


```
void configurar_puertos();
bit i;

void main()
{
configurar_puertos();
PORTB=0x00;

while(1)
  {
    if ( RA0_bit == 1)
    PORTB=0x01;
  }
}
void configurar_puertos()
{
   ADCON0=0x00;      //sin puertos analógicos
   ADCON1=0x3F;
   
   TRISB=0x00;
   TRISA=0xFF;
}
```

Para el circuito te recomiendo ponerle una resistencia al led (+- 330) y aumentar la resistencia del reset (-+10k)

Un saludo


----------



## tnxhawks (Mar 24, 2012)

Hola tannke gracias por la ayuda, en el circuito simulado configure la velocidad del micro y cambie los valores de los resistores del reset y del led, en el codigo configure las salidas/entradas digitales pero ahora cuando presiono el boton enciende pero ya no se apaga cuando lo dejo de presionar. Armado en circuito real si no aterrizo RA0 a tierra se queda encendido desde el principio y con solo desconectarla (quitarla de tierra)  y aunque no la ponga a Vcc se enciende el led.


----------



## tannke (Mar 25, 2012)

Primero un fallo mio, donde dige resistencia de reset quise decir resistencia de pull-down.

Ahora vayamos por partes, el que solo se encienda y no se apague es normal, es lo que está programado, en el programa solo le decimos que se encienda. Si tu lo que quieres es que cuando presionemos se encienda y cuando lo soltemos se apague, tendras que agregarle por ejemplo un else, te pongo 2 maneras que funcionarían:

con if/else:

```
while(1)
  {
    if ( RA0_bit == 1)
        PORTB=0x01;
    else
        PORTB=0x00;
  }
```

otra manera mas sencilla:

```
while(1)
  {
    RB0_bit = RA0_bit;
  }
```

Lo segundo que te está pasando, lo de no poner la resistencia pull-down (aterrizar RA0 a tierra) también es normal, no le estas dando ningun nivel lógico, "lo tienes conectado a una antena que te está cogiendo ruido y dando cualquier nivel en esa entrada".

Espero te sea util, un saludo


----------



## tnxhawks (Mar 25, 2012)

Muchas gracias tannke, es verdd no habia puesto la instruccion para apagar, y estuve investigando sobre las resistencias de pull-down pero la verdad no se si conectan fisicamente o se programan, segun yo se programan pero no se como hacerlo, no se si puedas ayudarme en esto, y por ultimo quisiera pedirte un gran favor y si no te molesta me podrias dar tu correo para futuras dudas.
Gracias y un saludo¡¡


----------



## tannke (Mar 25, 2012)

Bueno en tu circuito la resistencia pull-down es la que tienes en el pin 2 que va a masa, su función es mantener la linea en nivel lógico bajo hasta que aprietas el pulsador y la pones a nivel alto (5v).

Sobre el tema de programarlas por soft PULL-DOWN no es posible (almenos con los pic que conozco) preo sí puedes hacer PULL-UP a todas las entradas del puerto B.

En el pic 4550 esto se hace con el registro INTCON2 bit7 (RBPU), si lo pones a 1 las resistencias estan deshabilitadas(estado por defecto), si lo pones a 0 las habilitas.

Un saludo.


----------



## tnxhawks (Mar 25, 2012)

oh lo acabo de probar y funciona a la perfeccion muchas gracias tannke, con respecto a lo de tu e-mail espero puedas darmelo. 
Saludos


----------



## tannke (Mar 27, 2012)

Holas de nuevo, te paso mi correo: *políticas@delforo.com*
Esperé un poco para leer las normas del foro porque no sabía si se podía poner el correo. 

Un saludo


*Como no cumplo las Políticas del Foro. Me editaron el mensaje.*​


----------



## Norberto (Abr 21, 2012)

soy nuevo con mikroc, alguien me puede decir como hago para ver el valor que van teniendo las variables dentro del programa en c a medida que lo hago correr con F8


----------



## tannke (Abr 21, 2012)

en la pestaña de depuración (normalmente a la derecha) hay un recuadro que pone "Select variable from list", ahi buscas tu variable (puedes escribirla), cuando la tengas, le das a "Add" arriba, es un + verde. Ahora ya te aparecera en el listado de abajo donte te pone el nombre, valor (puedes seleccionar como visualizaro char, bin, hex...) y direccion.

Un saludo


----------



## Norberto (Abr 21, 2012)

Muchisimas gracias tanquee!!!


----------



## ByAxel (Sep 1, 2012)

Revisa la hoja de datos del PIC que estas programando, recuerda que muchos PIC (la mayoria hoy en dia) tienen módulos internos para trabajo especial y que algunos de estos comparten sus pines... Con eso supongo que el PORTA tiene por defecto el módulo ADC asociado a sus pines y trabajan como entradas análogas... entonces para que sean digitales lo debes configurar en el registro/s respectivo/s...  Busca en el foro, que estos temas ya se han hablado bastante.

Saludos


----------



## karo001 (Sep 20, 2012)

hola soy nueva en el mundo del microcontrolador y quisiera que me ayuden en un programa del alfabeto  que  muestre en un display alfanumero con el pic16f877  con el programa del mikroC  y estoy un poco perdida en ese tema quisiera que me ayuden


----------



## DJ DRACO (Sep 20, 2012)

Buenas, pero qué significa un poco perdida?

Sabes algo de programación en C o ASM al menos?

Entendés el funcionamiento de un display alfanumérico?

Deberías hacer alguna rutina de retardo para que cada letra se vea un par de segundos..o minutos..

Con tan poca información es dificil en qué ayudarte.

En el programa live wire hay un ejemplo, de cómo manejar los 16 bits para ir formando las letras, supongo que si definis eso en el programa es cuestión de hacer las 28 letras y listo...


----------



## karo001 (Sep 20, 2012)

gracias pero recien estoy llevando un poco de mikroC


----------



## DJ DRACO (Sep 20, 2012)

ok, recién empezando a estudiar el lenguaje digamos.

Bueno, basicamente por qué querés usar ese PIC?

Digamos que vas a usar ese PIC..como ya te dije para 1 sólo display alfanumérico necesitas 16 puertos del PIC o una especie de multiplexor, o decodificador, que no se si existe.

O tal vez lo puedas ir diseñando con decodificadores para 7 segmentos y compuertas lógicas, para ahorrar algunos puertos del PIC


----------



## karo001 (Sep 20, 2012)

podria usar los puertos B y puertosC

para el display en si el programa no lo tengo bien claro


----------



## DJ DRACO (Sep 20, 2012)

Yo sabría guiarte un poco en assembler, no tanto en C

Mi idea sería declarar las 28 letras como bits en 2 registros, uno para puerto B y otro para el C

Mandar de a 1 letra a los puertos y mantenerlos así digamos 5 segundos...apagar y mandar la siguiente letra ... y asi


----------



## karo001 (Sep 20, 2012)

si eso estaba pensando pero el programa tiene k ser  en mikroC pero estaba pensando  hacer unas tablas para el alfabeto y sacarlo en hexadecimal


----------



## niguel (Sep 20, 2012)

Esto seria una opción , es un video donde explica a groso modo como programar un pic con  mikroC en los ejemplos que muestra hace referencia a encender o apagar leds pero en tu caso tendrías que saber que "leds" te formarían las letras  en el display y asi encender o apagar los que sea necesario.
te dejo el link si te interesa


----------



## karo001 (Sep 20, 2012)

Ok gracias x la ayuda


----------



## carferper (Sep 21, 2012)

Lo mas facil es declarar 2 variables tipo array, por ejemplo para las primera letras y  asumiendo catodo comun:


```
int alphaB [3] = {
     //   abcdefgh
        0b11110011,  //   a
        0b00011111,  //   b
        0b11001111,  //   c
    };

int alphaD [3] = {
     //   kmnprstu
        0b00010001,  //   a
        0b00010001,  //   b
        0b00000000,  //   c
    };
```
 
Para mostrar las letras utilizas algo asi:


```
PORTB = alphaB[i];
         PORTD = alphaD[i];
         Delay_ms(500);
```

donde i es la letra que quieres mostrar.

saludos


----------



## jjv (Oct 26, 2012)

hola gente muy buenos sus aportes, ahora bien tengo un problema con el delay_ms en mikroc no me lo toma me dice q*ue* esta indefinido,necesito hacer el control de servos a*-*travez de pulsadores pero necesito un retardo para el PWM y no se como hacerlo si me pudieran ayudar se los agradecería


----------



## nironaCuChANOck (Jul 18, 2013)

Hola, inicio con la programación de pics estoy usando un 16f887 y quiero ejecutar 2 funciones simultaneas una para invertir el giro de un motor {puerto B2} y simultaneamente activar otro {puerto A3}, pero al esperar en la función delay no revisa o hace el resto del programa hasta acabar la orden 


```
if(portb.f2==1){ // Recibe señal de inicio
             delay_ms(300); // 1/2 pausa
             porta.f4=1; //giro derecha
             delay_ms(1000); //duracion del giro derecha
             porta.f4=0; //apaga giro derecha
             delay_ms(600); //pausa
             porta.f5=1;    // enciende giro izquierda
             delay_ms(1000); //duracion giro izquierda
             porta.f5=0; //apaga giro izquierda
             delay_ms(300); // 1/2 pausa
```

Espero puedan ayudarme, Gracias!


----------



## tannke (Jul 19, 2013)

Buenos días. Te cuento, en los microcontroladores (como norma general) solo corren un hilo de programa, es decir, no pueden ejecutar 2 instrucciones simultaneamente, se hace una cosa y despues otra. Piensalo como cuando lees un libro, vas leyendo palabra por palabra fila por fila, puedes saltar de una fila a otra o saltar paginas... pero estar leyendo 2 filas/paginas a la vez lo dejaremos a mentes privilegiadas.

Solución, hacer uso de interrupciones y/o contadores, busca información sobre esto. 

Cualquier otra duda pasate. Un saludo


----------



## Halowin (Mar 7, 2014)

Hola,

Alguien me puede decir como desactivar la opción de que al cerrar la llave "}" me meta en la linea anterior un comentario"//".

No lo veo en la configuracion y me está empezando a mosquear bastante.

Gracias


----------



## tannke (Mar 7, 2014)

No se si ya se habló de esto por aqui, en todo caso yo ya hace años desistí de intentar arreglar esto. No se si en las nuevas versiones le hayan dado solución ya, pero entonces la única manera de evitarlo era poniendo el teclado en modo inglés, donde ahi los simbolos cambian de lugar pasando a ser ^ para { y * para }. Es decir, las teclas que estan encima y pulsando Shift (May) en lugar de Alt.

Un saludo


----------



## superdrtl (May 15, 2015)

Buenas Noches amigos del foro, actualmente estoy desarrollando un proyecto y en una parte me quede atascado, ya que no encuentro como solucionar mi problema, espero alguno de ustedes pueda ayudarme.

La cuestión es la siguiente, tengo un contador que va contando de 1 en 1 a través de un pulsador, esa variable es /dist/, y a su vez esa variable la guardo en /contX=dist/, cuando hay una interrupción /H/, que es otro pulsador se resetea /dist/ y se cambia la variable de guardado a /contY=dist/, y cuando se vuelva a producir la interrupción /H/ esta vuelva a guardar /dist/ en /contX=dist/ y así sucesivamente. Tengo funcionando hasta que se cambia la variable y viceversa, pero lo que quiero saber es como podría guardar el valor en que quedo /contX/ antes de resetear /dist/, y cuando se vuelva a guardar en /contX/ la variable siga contando desde donde se dejo. Espero me haya explicado jeje.

Un ejemplo seria:
Empieza el contador a funcionar
contX=dist (hay pulso /dist/ valdría 1, /contX/ valdría 1)
contX=dist (hay pulso /dist/ valdría 1, /contX/ valdría 2)

Interrupción (Cambio de variable a guardar /dist/ se resetea)

contY=dist (hay pulso /dist/ valdría 1, /contY/ valdría 1)
contY=dist (hay pulso /dist/ valdría 1, /contY/ valdría 2)
contY=dist (hay pulso /dist/ valdría 1, /contY/ valdría 3)

Interrupción (Cambio de variable a guardar /dist/ se resetea)

contX=dist (hay pulso /dist/ valdría 1, /contX/ valdría 3)
contX=dist (hay pulso /dist/ valdría 1, /contX/ valdría 4)

Interrupción (Cambio de variable a guardar /dist/ se resetea)

contY=dist (hay pulso /dist/ valdría 1, /contY/ valdría 4)
contY=dist (hay pulso /dist/ valdría 1, /contY/ valdría 5)
contY=dist (hay pulso /dist/ valdría 1, /contY/ valdría 6)

Y así sucesivamente...

Espero me hayan entendido, creo que es con otra variable que se guardaría el valor, pero la verdad ya todo el día he intentado de las formas que se me ocurrieron y no me ha dado resultado. Espero su grata ayuda, Gracias! ...


----------



## D@rkbytes (May 16, 2015)

Sobre lo que expones, ¿Por qué mejor no incrementas la variable "dist"?

Por ejemplo:
// Servicio de interrupción:
dist ++;
contX = dist;

Así cuando ocurra el reset de la variable "dist", la variable "contX" contendrá el valor global de "dist"


----------



## Ivanch (Ene 6, 2016)

Hola. Buenas noches.
Soy nuevo ocupando este compilador, y lo que necesito hacer es una interfase entre Labview y mi PIC.
El problema que tengo, es que Labview envía información por el puerto serial en forma de caracteres.

Ejemplo: envía '0255', pero dicho carácter yo lo necesito en número float para hacer operaciones con él.
¿Cómo le puedo hacer?


----------



## D@rkbytes (Ene 7, 2016)

Un número con decimales o punto flotante, se puede convertir en un número entero si se multiplica por 100.

Ejemplo: 1234.56 * 100 = 123456

Ya en el PIC puedes convertir la cadena "123456" en un entero de 16 o 32 bits.
Después usas una variable Float para dividirlo entre 100 y obtener el número con punto flotante.


----------



## albertoxx (Ene 9, 2016)

float Flotante;

Flotante = atof("212.221");


----------

