Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

20/08/2016 #1


Define pin con variable array en C de CCS
Hasta ahora ni siquiera e utilizado esto:

#bit activa1=porta.1

Siempre utilice output_high(PIN_A1); y output_low(PIN_A1);//No recomendable cuando //tienes un programa muy largo y necesitas cambiar el pin de salida A0 por otro (ponte a //buscar todas)

Y ahora me conviene mucho lo siguiente:

//#bit azti[0]=porta.1
//#bit azti[1]=porta.2
//#bit azti[2]=porta.3
//Compilacion erronea
//*** Error 86 "Ascen_3X8.c" Line 93(11,12): Expecting =
//*** Error 43 "Ascen_3X8.c" Line 93(13,14): Expecting a declaration



Pretendo que portA1 sea el valor de int1 azti[1] portA2=azti[2] ... sucesivo
¿Se puede hacer esto de alguna otra manera?

---------- Actualizado después de 3 minutos ----------

Luego me pasa que aunque me compile #bit activa1=porta.1
Me falta algo el valor de activa1 no esta afeztando al portA1
20/08/2016 #2
Moderador

Avatar de D@rkbytes

Asignar un byte de un arreglo a un registro SFR, no creo que pueda ser posible.
Pero asignar un nombre para un bit de un registro si es posible y debe ser de ésta forma:

#byte PORTA = getenv ("SFR:PORTA")

#bit ra1 = PORTA.1

Y para que funcione, debes establecer tus entradas y salidas con: set_tris_a (valor);
20/08/2016 #3


No creo que sea el set_tris E seguido la siguiente redundancia

#byte PORTA = getenv ("SFR:PORTA")
#BYTE PORTA=0x04
#BYTE TRISA=0X00
......
//delaracines datos fuciones
....
#byte PORTA = getenv ("SFR:PORTA")
#bit sal=PORTA.0
//int1 sal;

void main(){
....
set_tris_A(0b00000000);
.....
While(1){
......
sal=!sal;//no le afecta a A0
//if(sal){ output_high(PIN_A0); }//esto si responde declarando bajo int1 sal (sin redundancia)
// else{ output_low(PIN_A0); }
....
} }
20/08/2016 #4

Avatar de TRILO-BYTE

mira un ejemplo que ami me funciona
cuando yo quiero renombrar un pin para no usar output_high o low

Código:
#if defined(__PCH__) // PIC18F
   
   #bit CLOCK     =GETENV("SFR:LATD").5
   #bit DATA      =GETENV("SFR:LATD").6
   #bit LATCH     =GETENV("SFR:LATD").7

#else            // PIC16F
   
   #bit CLOCK     =GETENV("SFR:PORTD").5
   #bit DATA      =GETENV("SFR:PORTD").6
   #bit LATCH     =GETENV("SFR:PORTD").7
  
#endif


#bit TRIS_CLOCK      =GETENV("SFR:TRISD").5
#bit TRIS_DATA       =GETENV("SFR:TRISD").6
#bit TRIS_LATCH      =GETENV("SFR:TRISD").7
es un ejemplo para casos en pic16 y pic18

ahora declarando las salidas:

TRIS_CLOCK=0; //CLOCK ES SALIDA
TRIS_DATA=0; //DATA ES SALIDA
TRIS_LATCH=0; //LATCH ES SALIDA


y un ejemplo de codigo:

if(dat==0)
{
DATA=0;
}
else
{
DATA=1;
}

CLOCK=0;
CLOCK=1;
20/08/2016 #5

Avatar de juanma2468

Otra opción similar a la que ya te mensionaron es la siguiente:
Código:
// Se define etiquetas de pines //

#use fast_io(A) // Asignación rápida de los pines del puerto A

#locate Puerto_A = 0x05 // Defino el puerto A con una etiqueta
// Registro de PORTA ==> BITS: 7 6 5 4 3 2 1 0
//                             | | | | | | | |_ Giro_Motor : Pin usado para determinar el sentido de giro del motor
//                             | | | | | | |___ Salida_Motor : Pin utilizado para comandar el motor
//                             | | | | | |_____ Botonera : Pin utilizador por la botonera externa
//                             | | | | |_______ E_Fotocelula : Pin para detectar obtáculos
//                             | | | |_________ F_Carrera_C : Pin para determinar cuando está el portón cerrado
//                             | | |___________ F_Carrera_A : Pin para determinar cuando está el portón abierto
//                             | |_____________ HS : Pin usado para el cristal
//                             |_______________ HS : Pin usado para el cristal


#bit Giro_Motor    = Puerto_A.0 // A0 como salida para el manejo del sentido de giro del motor
#bit Salida_Motor  = Puerto_A.1 // A1 como salida para el manejo del motor
#bit Botonera      = Puerto_A.2 // A2 como entrada de la botonera externa para abrir o cerrar el portón.
#bit E_Fotocelula  = Puerto_A.3 // A3 como entrada de la fotocelula para deteccion de obtáculos
#bit F_Carrera_C   = Puerto_A.4 // A4 como entrada del final de carrera cerrado
#bit F_Carrera_A   = Puerto_A.5 // A5 como entrada del final de carrera abierto

void Inicializacion_dispositivo(void)  // Rutina de inicialicación del dispositivo
{
   output_a (0);                                // Borro las salidas del puerto A
   output_b (0b00100000);                       // Borro las salidas del puerto B
   set_tris_a (0b00111100);                     // Pines como entrada: A2,A3,A4,A5 - Pines como salida: A0,A1,A6,A7
   set_tris_b (0b01001001);                     // Pines como entrada: B0,B3,B6 - Pines como salida: B1,B2,B4,B5,B7
   setup_timer_2(T2_DIV_BY_16,250,10);          // Interrupción cada 10 mseg
   setup_timer_1 (T1_INTERNAL | T1_DIV_BY_4);   // Seteo el timer 1 para funcionar a 1 useg
   setup_timer_0 (T0_DIV_256);                  // Seteo el timer 0 para interrupciones cada 16,384 mseg
   enable_interrupts (GLOBAL);                  // Habilito las interrupciones globales
   Bandera_Reset = false;                       // Hago falsa la variable Bandera_Reset
}
21/08/2016 #6


Hola despues de probar todo el ejemplo de Trylo es lo que unico que e conseguido hacer funcionar Gracias

En mi caso esta prueba a valido para A1-A3 En un <18f64j90.h>

#bit sal =GETENV("SFR:LATA").1
#bit sal2 =GETENV("SFR:LATA").2
#bit sal3 =GETENV("SFR:LATA").3

#bit TRIS_sal =GETENV("SFR:TRISA").1
#bit TRIS_sal2 =GETENV("SFR:TRISA").2
#bit TRIS_sal3 =GETENV("SFR:TRISA").3

Me gusta Trylo responde bien
21/08/2016 #7

Avatar de TRILO-BYTE

es que tube el mismo problema.

digamos que tenia un programa perfectamente funcional escrito en C18 y queria reciclar el programa pero en CCS para cargarlo en un pic16

y me di cuenta de algo terrible las directivas output_low, high y toggle no eran compatibles con mi codigo.

afortunadamente destripe unas librerias de LCD y otras para poder conseguir mi codigo y hacerlo compatible con el ya escrito.

y sobre las directivas

#if defined(__PCH__) // PIC18F

// codigo

#else // PIC16F


es para que el preprocesador sepa para que micro estamos compilando y llame partes del compilador que se requiera.

no es el mismo compilador para pic10, pic12, pic16 y pic18 son diferentes compiladores usando el mismo IDE
¿se puede preguntar un compilador diferente al CCS?
SI
por ejemplo puedes preguntar hasta por un compilador por ejemplo xc8 o c18



#if defined(__XC8)
24/08/2016 #8


Hola en mi caso CCS bajo PCHW 5.0? Compilo y funciono tanto con el #IF como sin el, luego solo vi que no lo necesitava, pero te aseguro que se puede guardar esta chuleta tuya como solucion. Puede que tambien funcionen los otros 2 metodos. Recuerdo que tuve que quitar //Funciones mias, porque interferian y falseavan el resultado, cosa que no hize antes pero ya ahora estoy con otro tema, del mismo programa.

3 Saludos
20/09/2016 #9

Avatar de TRILO-BYTE

pero yo puse los #if no como adorno de navidad.

la idea es bueno no se que pic usas yo en este caso lo escribi para un pic18fXXX y cuando compilo el preprocesador se encarga de compilar solo la parte del pic18

pero si el mismo codigo fuente lo quiero para un pic16f el preprocesador solo compilara la parte pic16 y no la de pic18

¿funciona si dejo ambos?

NO por que si no le digo al preprocesador que compilar marcara error dependiendo que pic trabaje
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.