Autor Tema: Programar en XC8  (Leído 2712 veces)

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

Desconectado jamiroquai

  • PIC10
  • *
  • Mensajes: 6
Programar en XC8
« en: 30 de Enero de 2017, 20:49:59 »
Buenas tardes a todos. Estoy aprendiendo a programar pics usando el XC8 pero me he topado con el siguiente inconveniente: como leer los datos introducidos con un dip switch conectado en las tres primeras lineas de un puerto por ejemplo el puerto A. Usando assembler seria algo asi:

MOVF PORTA,W
ANDLW B'00000111'

Usando esa mascara me quedo con los tres primeros bits del puerto A. Ahora como podria hacer lo mismo usando XC8? Muchisimas gracias de antemano por la ayuda que me puedan ofrecer. ...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Programar en XC8
« Respuesta #1 en: 30 de Enero de 2017, 21:12:14 »
Código: C
  1. // Variable en la cual voy a guardar el estado de las entradas
  2. char ValorPuerto;
  3.  
  4. ValorPuerto = PORTA & 0b00000111;
  5. // O lo podes poner en hexadecimal
  6. ValorPuerto = PORTA & 0x07;

SI observas es lo mismo que haces en ASM, es decir hacer una AND entre PORTA y 0b00000111 , pero en ves de ponerlo en W, lo terminas guardando en una variable de 8 bits.

Desconectado jamiroquai

  • PIC10
  • *
  • Mensajes: 6
Re:Programar en XC8
« Respuesta #2 en: 31 de Enero de 2017, 23:34:59 »
Gracias por responder KILLERJC. Una consulta, el tipo de la variable donde voy a almacenar la operacion AND tiene que ser char o tambien puede ser un int? Lo que pasa es que pienso utilizar el valor de lo datos leidos en el dip switch con una estructura SWITCH-CASE y lo que va dentro de los parentesis del SWITCH creo que admite solo variables tipo int. De no ser asi te rogaria me corrigieras. Gracias compañero.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Programar en XC8
« Respuesta #3 en: 01 de Febrero de 2017, 00:26:37 »
Lo que va dentro del switch son unicamente ENTEROS, eso no quiere decir que sean solamente int, puede ser char, short long int, long int.
Lo que si no puede ser son strings "por ejemplo". Pero si una letra como 'a' ya que el codigo ASCII de 'a' es un numero de 8bits.

en XC8, un char ocupa 8 bits, un int 16 bits, por ahi es medio confuso o dificil de recordar esto, ni hablar de short long int, y ademas vas a otro sistema o compilador esta notacion cambia. Ejemplo el compilador CCS para PIC utiliza int como 8 bits. Una PC int es de 32 bits.

Por eso yo me acostumbre a incluir la cabecera <stdint.h> , la cual permite manejar otros nombres de los tipos de variables. y son:

Citar
int8_t
int16_t
int32_t
uint8_t
uint16_t
uint32_t

los que tienen la u adelante son para aquellas variables sin signo (unsigned), y luego tenes el numero que te dice cuanto ocupa. Entonces... si quisiera una variable de 8 bits sin signo, entonces uso:

Código: C
  1. #include <stdint.h>
  2.  
  3. uint8_t nombre_de_varaible;

en ves de unsigned char, Cada compilador tiene su propio stdint.h lo que permite que por mas que pases el codigo a otro compilador siempre tengas el mismo tamaño.
Aca te dejo parte de stdint de XC8:

Código: C
  1. // Con signo
  2. typedef signed char int8_t;                             // Con signo y 8 bits ( antes signed char )
  3. typedef signed int int16_t;                             // Con signo y 16 bits ( antes signed int )
  4. typedef signed short long int int24_t;                  // Con signo y 24 bits ( antes signed short long int )
  5. typedef signed long int int32_t;                        // Con signo y 32 bits ( antes signed long int )
  6.  
  7. // Sin signo
  8. typedef unsigned char uint8_t;                          // Sin signo y 8 bits ( antes unsigned char )
  9. typedef unsigned int uint16_t;                          // Sin signo y 16 bits ( antes unsigned int )
  10. typedef unsigned short long int uint24_t;               // Sin signo y 24 bits ( antes unsigned short long int )
  11. typedef unsigned long int uint32_t;                     // Sin signo y 32 bits ( antes unsigned long int )

Observaras que se vuelve mas practico para recordar los nombres y cuanto ocupa cada una.

PD: Hay mas definiciones como aquellas que le agregan el fast y least pero por ahora dejarlas de lado :P
PD2: Tambien estan definidos en ese archivo los maximos y minimo que pueden almacenar cada tipo, no se por que se repiten alli cuando se tienen estos en limit.h
« Última modificación: 01 de Febrero de 2017, 00:39:35 por KILLERJC »

Desconectado jamiroquai

  • PIC10
  • *
  • Mensajes: 6
Re:Programar en XC8
« Respuesta #4 en: 01 de Febrero de 2017, 21:50:19 »
Gracias de nuevo KILLERJC por tu respuesta me sacaste de esa duda que tenia se ve que ya tienes experiencia programando en lenguaje C. Con toda esta información que me estas brindando pues ya no voy a tener recelo en poner dentro de la expresión del SWITCH una variable declarada tipo char o cualquier otra ademas del int. Gracias de nuevo. Manito arriba para ti.


 

anything