Duda con variables en ccs

Hola basicamente esa es mi duda con respercto a una variable int8 y una variable de tipo entero se supone que si ago
Código:
if (variable de tipo int8  = = 0)
      variable numero = variable numero - 1;
se supone que se puede cumplir la condicion o estoy haciendo algo mal??
 
El igual igual (==) no lleva un espacio en blanco de separación
Código:
if (variable de tipo int8  [B]==[/B] 0)
 
no ! lo escribí asi porque aparecia como dos muy largos! ahora veo que se separan pero tu comentario me agrada porque veo que tenes interes en ayudarme ! gracias amigo !
 
... a una variable int8 y una variable de tipo entero ...

Hola Mindfield, puedes aclarar un poco tu pregunta? Una variable tipo int (integer) y una variable tipo entero son lo mismo. Quedaría por preguntar si la que llamas variable numero, es la misma que llamas variable tipo entero, si es con o sin signo y de cuantos bits es?.

Saludos!
 
Última edición:
En ese caso, es correcto el código que intentas realizar, siempre y cuando variable de tipo int8 NO sea la misma que variable numero porque sino simplemente nunca entraría al if cuando variable de tipo int8 sea distinta de cero.
 
Hola entonces una variable de tipo int8 se puede comparar perfectamente con un numero dentro de -127 y 127 ? y el == es una condicion de tipo no o igual a ?? PD: nesecito un manual de ccs para pic basico.
 
Hola Mindfield, en CCS, una variable int8 o simplemente int va de 0 a 255. Para hacer la comparación que quieres, debes usar una variable signed int que va de -128 a 127. El manual de CCS lo encuentras por aquí: http://www.ccsinfo.com/downloads/ccs_c_manual.pdf. Sin embargo si deseas aprender las nociones básicas de programación con CCS, te recomiendo que busques un libro llamado: "PICmicro MCU C An Introduction to Programming the Microchip PIC in CCS" de Nigel Gardner.

Saludos!
 
He encontrado un programa en internet realizado en CCS para el PIC 12F629... el cual basicamente lee pulsos que entran por la pata GP5 del PIC y tengo una duda con el siguiente fragmento de codigo...

B7=(P7_p & (!P7_n));

donde B7, P7_p y P7_n son variables. Por lo que puedo interpretar, lo que estan haciendo en este fragmento de codigo es hacer una AND entre P7_p y la negada de P7_n...?????

saludos... ...
 
Mmmm, es confuso, mezcla operadores lógicos con operadores binarios.

El operador & es un operador binario que devuelve la and (bit a bit) de dos operandos. Ahí todo claro.

El operador ! es un operador lógico que devuelve verdadero o falso. Pero al aplicarlo a una variable se puede tomar como que "falso" es 0 y "verdadero" es cualquier cosa distinta de 0 (qué valor ya hay que ver el manual del compilador, si es 1, 0xFF, 0xFFFF, etc). Para el caso del compilador CCS veo que "verdadero" = 1

Entonces si P7_n = 0, entonces !P7_n es verdadero, y acá no sé si el compilador lo toma como 1 o 0xFF.
Si lo toma como = 1, B7 será el bit0 de P7_p
Si lo toma como 0xFF, B7 será = P7_p

Lo que sí es seguro es que si P7_n es distinto de 0; entonces !P7_n será = 0, y B7 terminará siendo 0.

El código que sigue a esa instrucción puede dar alguna pista/contexto. Pero como dije antes, mejor no mezclar operadores lógicos con binarios.
Creo que el espíritu de esa instrucción es hacer una asignación condicional:

if (P7_n == 0)
B7 = P7_p; // o podría sera B7 = P7_p & 0x01 si la intención es quedarse con el bit0
else
B7 = 0;

A lo mejor se traduce al mismo assembly y todo. Está bien, es más largo de escribir pero no hay que andar adivinando qué hace el compilador, como interpreta verdadero o falso, o qué pasa al mudar ese código a otro compilador.
 
Hola tengo un codigo masomenos asi

Código:
#int_ext

void interrup_RA2() 
{
      switch (flag1){
      case 0: flag1=1; ext_int_edge(L_TO_H);break;      
      case 1: flag1=0; ext_int_edge(H_TO_L);break;   
      }
       
      salida2_off;            
      delay_us(/*intensidad*/DELAYCOM);                          
      salida2_on;            
}

void main()
{
setup_comparator(NC_NC_NC_NC);
enable_interrupts(global);
enable_interrupts(int_rda);
set_tris_D(0x00);          
  
   enable_interrupts(int_ext);   
   ext_int_edge(H_TO_L);         
   setup_adc_ports (NO_ANALOGS);

while (TRUE)
{
        valor_B=getc();
       
        DELAYCOM = valor_B;
}

el problema es que me gustaria poder cambiar el valor de DELAYCOM que está en la linea (delay_us(/*intensidad*/DELAYCOM); vareandola segun (DELAYCOM = valor_B;) pero no puedo! como se hace para poder cambiarlo?
 
Lo que debes hacer es declarar la variable fuera de las funciones
Es decir abajo de las librerias ejemplo

#include<algo.h>
Int variable;

Void suma()
{
Variable++;
}

Void main()
{
Printf(variable);
}
 
Lo que debes hacer es declarar la variable fuera de las funciones
Es decir abajo de las librerias ejemplo

#include<algo.h>
Int variable;

Void suma()
{
Variable++;
}

Void main()
{
Printf(variable);
}

Hola, te refieres a una variable global? asi esta mi variable, pero segun tú codigo yo quiero hacer lo mismo pero al reves,
Código:
Void suma()
{
Printf(variable); //esta linea
}

Void main()
{
Variable++; // por esta linea
}
 
Hola! DELAYCOM tiene como fin ser un valor de tipo entero, vareando de valor y asi
Código:
         salida2_off;            
delay_us(/*intensidad*/DELAYCOM);                          
 salida2_on;
salida2_on estara en estado alto despues de esperar el retardo de DELAYCOM, este codigo es para un dimmer y quiero tener 8 dimmer en un solo pic pero con este retardo no estoy seguro de poder tener varios dimmer...
 
Última edición:
Tengo que pasar informes de un micro a otro, cada informe consta de un int8 + un int16 en caso de 5 informes en total son 6 int8 + 5 int16 (un int8 mas para que el otro sepa el nº de informes a tratar). Para ganar veloccidad e puesto una int1 DT=0 detalle 0. Esto hace que las int16 en Master las divida/10 las manda en int8 y cuando llega la multiplica X 10

Se pierde detalle si valia 555 el otro la recoge como 550, pero merece cuando se trata de muchos informes.

Lo que pasa es que me gustaria aprovechar lo siguiente.
Si la int16 es menor a 240. No la dividas/10. Mandala entera cabe en int8 Y el Slave a su vec no debe multiplicarla X10

Lo que quiero aprobechar es lo que falla y no consigo ver lo que es.
Utilizo SPI, todas son unsigned, el codigo es este:

MICRO MASTER
Código:
MF=0; 
output_high(PIN_C2); // RW TRUE
spi_write(nu); PM();//numero total-de-informes int8
if(DT){//comunicaion detallada + Lenta (int8 + int16)
for(co=0;nu>co;co++){//for(co)//MANDAR--->
p0=psz[co];
spi_write(p0);  PM();///posicion int8  
d0=dis[p0];
v8=make8(d0,0);///distancia INT16
spi_write(v8);  PM();  
v8=make8(d0,1);
spi_write(v8); PM(); 
}//for(co) RW detallada
//output_low(PIN_C2);//RW FALSE  
}
else {//DT=0//comunicaion Simple + rapida (int8 + int8)
for(co=0;nu>co;co++){//for(co)//MANDAR--->
p0=psz[co];
spi_write(p0); PM();///posicion int8  
d0=dis[p0];//distancia es improbable que pueda llegar a + de 1000/10-->int8 100
//int16/10  555/10=55 recivira 55*10=550
   if(d0>240){ d0=d0/10;  }//NO COORDINA Si int16 es inferior a 240 Quiero que se la pase entera a int8
     v8=make8(d0,0);
    spi_write(v8);  PM();
}//for(co) RW Simple
}//end if(DTalle)

void PM() {/// protocolo de envio vajo SPI MAESTRO
for(t=0;450>t;t++){
if(Input(PIN_C0)){ delay_ms(5); 
lcd_gotoxy(37,2); printf(lcd_putc,"%lu",t); break;///////
}//recivido
}//for(t)

if(t>447){  delay_ms(5); 
MF++; lcd_gotoxy(36,1);   printf(lcd_putc,"MF %d ",MF); }///Este printf No debe aparecer MF supone numero de fallos en //comunicacion 
}

MICRO SLAVE
Código:
nu=spi_read(); PS();   
if(DT){//int8 + int16 (detalle alto)
for(co=0;nu>co;co++){//for(co)
k8=spi_read(); PS();///posicion int8
psz[co]=k8;//iden
v8=spi_read(); PS();//distancia INT16
v16=spi_read(); PS();
dis[k8]=v16*256+v8;//distancia int16
}//for(co) rs completa
} else {//int8 + int8 (detalle vajo)
for(co=0;nu>co;co++){//for(co)
k8=spi_read(); PS();///posicion int8
psz[co]=k8;//iden
v8=spi_read(); //PS();//distancia INT16/10  1555/10 serian INT8 155            ....259 serian 25
k16=v8;//155 ---> 1550 (se pierde detalle deberia ser 1555 pero micro-master sabe siempre el verdadero valor a la hora de //operarlo)
//k16*10;
if(k16>24){  dis[k8]=k16*10; }//micro-master if(distancia>240) { RW int16/10 } else { RW int16 entera cabe en int8 }
else { dis[k8]=k16; }//la int16 pasada era inferior a 240 (+ rapido y no se pierde detalle)
PS();
}//for(co) RS Simple
}//end if(DTalle)

void PS(){///protocolo de recivo vajo SPI pic2SLAVE
output_high(PIN_a0);//S.recivido=true -----> pin_c0_MASTER/E.recivido
delay_us(4950);//delay_ms(4);   
output_low(PIN_a0);
delay_us(50);
}

Y Otra cosa porque no puedo hacer directamente int16 = int8 y tengo que armar este cacao

k16=v8;
k16=k16*10;
dis[k8]=k16;

unsigned int16 k16,dis[200]
unsigned int8 v8,k8;
k16=v8*10;//mal
dis[k8] =v8;//lo curioso es que esto tambien me da un valor erroneo, las 2 son int16 K16 y dis[x]

¿Necesito algo mas? que la libreria #include <stdio.h>
 
No entiendo algo básico, una int16 tiene un valor máximo de 256 veces más que int8, es imposible que dividiendo sólo por 10 puedas convertir int16 en int8
 
Estas int16 nunca llegan a 65535 0xFFFF. de hecho nunca llegan a 1100 0x044C. 1100/10=110 la int8 lo soporta de sobra. De hecho si quito la parte baja que quiero aprobechar para mostrar toda la informacion no pasa nada.
La unica manera de que no funcionara seria que valiese + de 2559 2560/10=256 (el cero es unidad)
Esto no podra llegar ocurrir en mi programa nunca
 
OK si es que ahora entiendo el problema que tenés, a veces se resuelve con type-casting.

unsigned int16 k16
unsigned in8 v8

k16 = (unsigned int16)v8 * 10;
 
Como dato adicional:
En PIC C Compiler de CCS, todas las variables excepto "Float y char" por defecto son "Unsigned"
Es decir, int8 v8; por defecto será declarada como una variable de 8 bits sin signo.
signed int8 v8; ya será con signo.

O sea que en PIC C de CCS no es necesario declarar "Unsigned" (Esto es por defecto)
La ayuda de PIC C Compiler dijo:
Note: All types, except float char , by default are un-signed; however, may be preceded by unsigned or signed (Except int64 may only be signed) . Short and long may have the keyword INT following them with no effect. Also see #TYPE to change the default size.

SHORT INT1 is a special type used to generate very efficient code for bit operations and I/O. Arrays of bits (INT1 or SHORT ) in RAM are now supported. Pointers to bits are not permitted. The device header files contain defines for BYTE as an int8 and BOOLEAN as an int1.

Integers are stored in little endian format. The LSB is in the lowest address. Float formats are described in common questions.
 
Última edición:
Atrás
Arriba