Autor Tema: Microcursillo en C  (Leído 178980 veces)

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

Desconectado tornar

  • PIC18
  • ****
  • Mensajes: 342
RE: Microcursillo en C
« Respuesta #225 en: 04 de Febrero de 2005, 05:14:00 »
Hola andresito86, no se que compilador de C, estaras usando, pero practicamente todos los compiladores de C, traen una libreria para control de perifericos basicos como LCD, teclado, etc. Simplemente busca en la carpeta donde tienes instalado el compilador algun archivo fuente que empiece por LCD, y ves buscando, hasta que encuentres la libreria adecuada. Pq seguramente la libreria que usamos nosotros en CCS no te valga en un compilador distinto.


Saludos.

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: Microcursillo en C
« Respuesta #226 en: 09 de Febrero de 2005, 04:10:00 »
Quiero hacer un programa q encienda el led o leds correspondientes en numero binario (hasta 16) según las veces q le des al pulsador... se me ocurre esto, pero no hace lo q quiero, alguna idea??

#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)

#byte PORTB=6

void main()
{
SET_TRIS_A(0b00001000);   //RA4 como entrada
SET_TRIS_B(0b00000000);   //Puerto B como salida

for(;Giño         //Bucle infinito
 {
 PORTB=0;
 while (PORTB <= 16)  //mientras sea menor que 16
  {
  if(input(PIN_A4))   //Si no has pulsado no haces nada
   {
   }
  else         //Si pulsas
   {
   delay_us(50);   //tiempo para los rebotes
   PORTB= ++PORTB;   //incrementas valor de portb=led
   }
  }
 }
}

Gracias de antemano

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Microcursillo en C
« Respuesta #227 en: 09 de Febrero de 2005, 05:14:00 »
Me temo que eso de PORTB=0; o PORTB++; no funciona en CCS.
Por el contrario, para leer el valor del puerto B tienes que ejecutar:
valor = input_b();

y para escribir esto otro:
output_b(valor);

Si quieres hacerlo a nivel de bit, tendrás que usar:
a=input (PIN_Bx);
o
output_high (PIN_Bx);
o
output_low (PIN_Bx);

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #228 en: 09 de Febrero de 2005, 10:32:00 »
Que onda panas deberian chekar su conexionado panas(pusieron la pullup ?? ), ya que tanto el portb=0 o 1 sirve y portb++ o portb-- tambien, (este se tiene que manejar con la sintaxis correcta)
Ejemplo:

#include <18F452.h>
#fuses H4,NOOSCSEN,NOBROWNOUT,NOPROTECT,NOWDT,NOPUT,NOLVP,NODEBUG,NOSTVREN,NOEBTRB,NOEBTR,NOCPB,NOCPD,NOWRTC,NOWRTB,NOWRTD,NOWRT    /*PLL*/
#use delay(clock=32000000)
#USE FAST_IO(B)
#BYTE PORTB= 0xF81

MAIN(){SETUP_ADC_PORTS(NO_ANALOGS);/*SIN ANALOGOS.....POR AHORA >Sonrisa*/
PORTB=0;
SET_TRIS_B(0);
portb++;
PORTB=PORTB;  //EN SU DEFECTO USAR PORTB=PORTB+1 Y PORTB=PORTB-1
DELAY_MS(1000);
portb--;
PORTB=PORTB;
DELAY_MS(1000);
portb++;
PORTB=PORTB;
DELAY_MS(1000);
portb--;
PORTB=PORTB;
DELAY_MS(1000);
PORTB=1;
DELAY_MS(1000);
PORTB=0;
DELAY_MS(1000);
PORTB=1;
DELAY_MS(1000);
PORTB=0;
DELAY_MS(1000);
}
Probado en simulacion y montaje Real.

Aun mas facil:

#include <18F452.h>
#fuses H4,NOOSCSEN,NOBROWNOUT,NOPROTECT,NOWDT,NOPUT,NOLVP,NODEBUG,NOSTVREN,NOEBTRB,NOEBTR,NOCPB,NOCPD,NOWRTC,NOWRTB,NOWRTD,NOWRT    /*PLL*/
#use delay(clock=32000000)
#USE FAST_IO(B)
#BYTE PORTB= 0xF81

MAIN(){SETUP_ADC_PORTS(NO_ANALOGS);/*SIN ANALOGOS.....POR AHORA >Sonrisa*/
PORTB=0;
SET_TRIS_B(0);
PORTB== PORTB++;
DELAY_MS(1000);
PORTB== PORTB--;
DELAY_MS(1000);
PORTB==PORTB++;
DELAY_MS(1000);
PORTB==PORTB--;
DELAY_MS(1000);
PORTB=1;
DELAY_MS(1000);
PORTB=0;
DELAY_MS(1000);
PORTB=1;
DELAY_MS(1000);
PORTB=0;
DELAY_MS(1000);
}

Salu2 panas

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Microcursillo en C
« Respuesta #229 en: 09 de Febrero de 2005, 13:18:00 »
Pues entonces retiro lo dicho; tenía entendido que eso no funcionaba en CCS.
Y digo yo, ¿para qué sirven entonces las sentencias INPUT y OUTPUT?. Dejan de tener sentido...

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #230 en: 09 de Febrero de 2005, 15:02:00 »
Hola pana Nocturno66,
De hecho la forma OPTIMA de hacerlo es usando los comandos que mensionas, pero eso no es limitante para el compilador para que lo puedas hacer de muchas formas mas.
EN si la diferencia es notable:
.................... PORTB== PORTB++;
0048:  MOVF   F81,W                         /*11 ciclos*/
004A:  INCF   F81,F
004C:  SUBWF  F81,W
004E:  BZ    0054
0050:  MOVLW  00
0052:  BRA    0054

.................... output_b(0);                /*cuando mucho 3 ciclos*/
0062:  CLRF   F8A

.................... output_b(3);
0064:  MOVLW  03
0066:  MOVWF  F8A

Como puedes ver la forma mas OPTIMA es usando output_X, ya que directamente mueve el valor(diferente de 1 o cero) directamente al puerto, y en caso de solo ser 1 o cero lo limpia(bcf) o lo setea (bsf)....... PERO ambas sirven.

SAlu2 pana Sonrisa

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #231 en: 09 de Febrero de 2005, 17:02:00 »
Xelene en el caso de tu codigo, quedaria mas o menos asi:

#include <18F452.h>
#fuses H4,NOOSCSEN,NOBROWNOUT,NOPROTECT,NOWDT,NOPUT,NOLVP,NODEBUG,NOSTVREN,NOEBTRB,NOEBTR,NOCPB,NOCPD,NOWRTC,NOWRTB,NOWRTD,NOWRT    /*PLL*/
#use delay(clock=32000000)
#use fast_io(A)
#use fast_io(B)
#BYTE PORTA= 0xF80
#BYTE PORTB= 0xF81

void main()
{PORTA=0;
SET_TRIS_A(8);
PORTB=0;
SET_TRIS_B(0);
while (PORTB<=15){PORTB==PORTB++;delay_ms(500);}
}

Recalcando en el mismo que el bucle while se va a detener cuando llegue a 16, ya que la variable que estas chekando(portb) es incrmentada dentro del mismo y sensada DESPUES..... esto es,.. cuando portb vale 15,, el bucle while todavia lo acepta vajo la condicionante <=15, por tanto dentro del bucle este es incrementadoportb=(15+1) dando como resultado el binario final que requieres, (16) y solo DESPUEs de haberlo incrementado (dentro del bucle) se detendra.
Caso contrario si pones 16, se detendra en 17 y asi sucesivamente....(0,1,2..15 =16 numeros)

Salu2Sonrisa

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Microcursillo en C
« Respuesta #232 en: 09 de Febrero de 2005, 23:04:00 »
Pues discrepo, querido pana.

He compilado este minicódigo y mira lo que sale:
Codigo:
....................    output_b(150);
001F:  MOVLW  96
0020:  MOVWF  06
....................
....................    PORTB=120;
0021:  MOVLW  78
0022:  MOVWF  06


La razón por la que en tu ejemplo el asm sale más grande con la instrucción PORTB==PORTB++ es doble: en primer lugar porque estás comparando en vez de asignando (==) y en segundo lugar porque además haces una operación matemática al incrementar el valor de PORTB en 1.

Lo que sí me queda claro entonces, es que los dos métodos son igualmente válidos, aunque uno de ellos simplifica mucho más la legibilidad de los programas.

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #233 en: 09 de Febrero de 2005, 23:27:00 »
Pana es correcto lo que mencionas en cuanto a esa comparacion, pero no fue eso lo que dije ni lo que compare ,te lo pongo una ves mas:
.................... PORTB== PORTB++;
0048: MOVF F81,W /*11 ciclos*/
004A: INCF F81,F
004C: SUBWF F81,W
004E: BZ 0054
0050: MOVLW 00
0052: BRA 0054

.................... output_b(0); /*cuando mucho 3 ciclos*/
0062: CLRF F8A

.................... output_b(3);
0064: MOVLW 03
0066: MOVWF F8A

Con respecto al incremento y asignacion, AÑADI anteriormente a esta informacion:
portb++; PORTB=PORTB; //EN SU DEFECTO USAR PORTB=PORTB+1 .........!!!!
Mas facil:
PORTB==PORTB++
"La comparacion es entre  PORTB==PORTB++ y output_b(X)"
Por cierto pana, en que discrepas? en que la opcion con  PORTB==PORTB++ es menos optima que la opcion Output_b(0) o en que ambos funcionan...?? por que esa es la informacion que puse en ambos posts .no entendi  a que te refieres  loco

Un salu2 pana

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Microcursillo en C
« Respuesta #234 en: 10 de Febrero de 2005, 00:47:00 »
Creo que no estamos hablando de lo mismo, entonces.
Lo que decía en mi último post es que ocupan el mismo número de ciclos tanto si haces PORTB=120 como si haces output_b(120).
Y te decía que discrepo porque entendí en tu post que estabas argumentando alguna diferencia entre ambos comandos, cuando en el fondo son exactamente iguales.

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #235 en: 10 de Febrero de 2005, 10:33:00 »
Pues si pana, creo que entendiste mal, por que nunca compare esos comandos, ....... y por lo mismo, por que actuan igual no fueron incluidos en el desensamblado del codigo.

Un abrazo pana

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: Microcursillo en C
« Respuesta #236 en: 12 de Febrero de 2005, 03:31:00 »
Hola xicos, ya siento no haber contestado antes... el problema era de codigo... conexion y toda configuración estaba bien, pero eso... no hacía lo q yo quería por motivos de temporizacion, eso era too. Asias!!!!

Rebotado

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
RE: Microcursillo en C
« Respuesta #237 en: 12 de Febrero de 2005, 05:04:00 »
Hola k tal lager, no he utilizado el compilador CCS nunca. Suponiendo que es un compilador de C estandar....comento:

Giño
Porque haceis??:

portb++;           // incrementas registro
PORTB=PORTB; // no se que utilidad tiene esta instruccion???

No bastaria con poner?....

PORTB++; // Incrementa el registo

No se si es algo particular de los puertos del PIC o del uso de ese compilador..por eso no se porque haceis eso.

Giño
PORTB==PORTB++,

no es lo mismo que

PORTB++;

lo que haces en el primer caso es incrementar el registro, y despues se realiza una comparacion que no sirve para nada. La comparacion siempre sera falsa, aunque eso es lo de menos, ya que no tiene utilidad.
Si observas el codigo generado en ensamblaor que poneis, observaras que con la instruccion:

004A: INCF F81,F

ya incrementamos el registro PORTB. El resto es para hacer una comparacion con el anterior valor de PORTB que no tiene ninguna utilidad.

Uff k no kiero kedar de listillo eh amigo lager...loco solo queria participar. Es que me expreso de una manera que releida da la sensacion Muchas risas
Si es algo particular del PIC o compilador comentame okis?

Un saludo.

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Microcursillo en C
« Respuesta #238 en: 12 de Febrero de 2005, 15:25:00 »
Tienes razon pana, de hecho de la forma que tu expones trabaja PERFECTO!! Rebotado .
ASi que la usare asi de ahora en adelante Sonrisa .
Gracias por la informacion pana

Un gran abrazo

Desconectado Amarice_BA

  • PIC10
  • *
  • Mensajes: 25
RE: Microcursillo en C
« Respuesta #239 en: 21 de Febrero de 2005, 09:57:00 »
Este minicursillo me está viniendo fenomenal.

Voy a hacer una cosilla con un convertidos digital analógico. ¿Teneis apuntes o algún ejemplo sobre esto?

Quiero utilizar un pic barato como el 16F87 y un DAC sencillo como el MCP4921. El tema está en como configurar el pic y como hacer la comunicación entre ambos.

Gracias. Cuando lo tenga más avanzado os preguntaré a ver. Sonrisa