Autor Tema: Empezando en C  (Leído 5577 veces)

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

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Empezando en C
« en: 28 de Abril de 2005, 07:51:00 »
Buenas al foro, estoi empezando con C pero me cuesta batante viniendo de ASM por que pienso a nivel hardware del PIC y no logro aislarme de el en C desquiciado

Perdonen si me hago pesado estos días pero el comienzo siempre es duro, y antes de desmoralizarme espero vuestra colaboracion Giño El programa es bien sencillo pero no me anda Avergonzado Las luces del coche fantastico con led´s en el puerto D. Ave donde meti la pata:

//***********************************************
//* Primer programa por Daniel G - RaDoN                             *
//* en CCS. Knigh Rider´s leds                                               *
//***********************************************

  #include "16F877.h"
  #use delay (clock=4000000)
  #use fast_io(D)
 
  #byte port_d = 8
   
  #ORG 0x1F00,0x1FFF {} //for the 8k 16F876/7
 
   main()
  {
   int   i;
   set_tris_d(0x00);
   port_d = 0x01;
      while(true)
      {
         for(i=0;i==8;++i)
         {
         delay_ms(500);
         port_d = port_d * 2;
         }
         for(i=0;i==8;++i)
         {
         delay_ms(500);
         port_d = port_d / 2;
         }
      }
  }
Si juegas contra el mejor, pierdes como los demás.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Empezando en C
« Respuesta #1 en: 28 de Abril de 2005, 09:20:00 »
No he podido probarlo, pero a priori veo un par de cosas en tu  programa que me chirrían un poco:

1- declaras PORT_D=0x01, pero esa no es la dirección de memoria que ocupa PORTD en el 16F877, es la 0x08

2- creo que los bucles tal y como los has definido se ejecutarán 9 veces, ya que se cuenta desde el 0 hasta el 8. Yo en tu lugar pondría  for (i=0; i<8;i++)

Ya me contarás, paisano

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Empezando en C
« Respuesta #2 en: 28 de Abril de 2005, 09:53:00 »
Prueba así:

 for(i=0;i<=6;++i)
{
delay_ms(500);
port_d = port_d * 2;
}
for(i=0;i<=6;++i)
{
delay_ms(500);
port_d = port_d / 2;

Un saludo

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Empezando en C
« Respuesta #3 en: 28 de Abril de 2005, 10:17:00 »
Escrito originalmente por nocturno66


1- declaras PORT_D=0x01, pero esa no es la dirección de memoria que ocupa PORTD en el 16F877, es la 0x08




No, arriba hago un #byte port_d = 8, que declara el puerto D con el registro 0x08 (PORTD del 877). El port_d = 0x01 enciende el led de rd0. Es como aprendio ha hacerlo (lo que visto por los ejemplos), si hay otra manera de hacerlo, agradeceria que me lo comentaras.

Y tb me gustaria saber la diferencia de cuando se usan parentesis y la asignación "=" :

set_tris_d(0x00)
port_d = 0x01 ---> si aquí pongo port_d(0x01) no funciona.

Gracias por las resupuestas y tb a pocher
Si juegas contra el mejor, pierdes como los demás.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Empezando en C
« Respuesta #4 en: 28 de Abril de 2005, 10:20:00 »
Ejem, ejem ¿has probado lo que te he dicho?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Empezando en C
« Respuesta #5 en: 28 de Abril de 2005, 10:37:00 »
Es verdad, se me fue la olla con lo del PORT_D.

Hazle caso al gran Pocher y prueba eso.  Además, sus bucles sólo dan 7 vueltas, que son los desplazamientos que necesitas para llevar la luz de un extremo al otro.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Empezando en C
« Respuesta #6 en: 28 de Abril de 2005, 11:40:00 »
Escrito originalmente por pocher
Ejem, ejem ¿has probado lo que te he dicho?


Si gracias pocher, tb lo he probado con un while hasta que port_D = 128 rotando a la izquierda y while(port_d= 0) rotando a la derecha y tb va.

Al final me va gustar C xD
Si juegas contra el mejor, pierdes como los demás.

Desconectado Amarice_BA

  • PIC10
  • *
  • Mensajes: 25
RE: Empezando en C
« Respuesta #7 en: 02 de Mayo de 2005, 07:23:00 »
Yo tengo una duda a la hora de configurar los puertos y es cuándo usar:

#use fast_io(...)
#byte port_a = ...

No sé cómo se usan porque he visto programas que las llevan otros que no; si es para configurar el puerto como entrada, como salida; si se ponen antes o después...

¿Me podeis indicar que tendría que poner para configurar en condiciones el puerto A con todo entradas y los puertos B y C como salida para un 16F870?

Gracias.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Empezando en C
« Respuesta #8 en: 02 de Mayo de 2005, 08:08:00 »
Ninguna de las dos directivas te hace falta para definir un puerto como entrada o salida.

Los puertos se suelen configurar en el main así: set_tris_A (0xFF) ---> todo entradas

set_tris_A (0x00) ---> todo salidas ... idem para otros puertos.

Un saludo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Empezando en C
« Respuesta #9 en: 02 de Mayo de 2005, 11:20:00 »
El compilador de CCS habilita los TRIS correctos antes de cada entrada o salida de información por el puerto, si es necesario y siempre en función de tu programa. Con el uso de fast_io prohibes al compilador que haga esa función para acelerar la gestión de los puertos, aunque recaerá en el programador la tarea de configurar correctamente los TRIS.

Definir un puerto con un nombre, como haces con #byte port_a=5; te permitirá utilizar el puerto tanto a nivel de entrada como de salida como si de una variable se tratase. Por ejemplo, PORT_A=0xFF, te pondría todas las salidas a nivel alto.

Si no defines los puertos así, en CCS hay instrucciones para manejarlos como output_a o input_a. Supongo que es cuestión de gustos, aunque a mí particularmente me gusta más definir los puertos y usarlos como variables, porque los comandos OUTPUT_x e INPUT_x son particulares de CCS y cuando cambias de compilador te vuelves loco...

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Empezando en C
« Respuesta #10 en: 02 de Mayo de 2005, 13:05:00 »
Ajá ... gracias pocher y nocturno. Estoi contigo de eso para habituarse para poder compilar con cualquiera, pero le veo en contra que tienes que ponerte a definir todas las variables y es un poco coñazo. Anque tb te puedes hacer un ".h" con todo ya.
Si juegas contra el mejor, pierdes como los demás.

Desconectado Amarice_BA

  • PIC10
  • *
  • Mensajes: 25
RE: Empezando en C
« Respuesta #11 en: 02 de Mayo de 2005, 13:28:00 »
Muchas gracias, aprendido queda.
Estoy haciendo un programilla que no me acaba de funcionar y ya le doy vueltas a todo.
Lo que hace no tener ni idea. Avergonzado

Una cosilla, lo de los fuses como que no valen para mucho ¿no? ¿Hay algunos imprescindibles o se puede programar sin tenerlo en cuenta?

Desconectado Amarice_BA

  • PIC10
  • *
  • Mensajes: 25
RE: Empezando en C
« Respuesta #12 en: 02 de Mayo de 2005, 17:28:00 »
Mirad, para configurar el puerto A como entrada copio el texto en ensamblador que viene en el manual. pero al compilar em dice que no están declaradas las variables STATUS, RP0, etc.
No lo entiendo, si lo estoy haciendo en ensamblador.
¿Qué tengo que declarar?

        #asm

            BCF    STATUS, RP0
            BCF    STATUS, RP1
            CLRF   PORTA
            BSF    STATUS, RP0
            MOVLW  0x06
            MOVWF  ADCON1
            MOVLW  0XFF
            MOVWF  TRISA

        #endasm

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Empezando en C
« Respuesta #13 en: 02 de Mayo de 2005, 17:41:00 »
¿Y no te gusta así?: set_tris_a(0xFF) ... ¿que le pasa? ¿porque recurrir a asm para eso?
Si juegas contra el mejor, pierdes como los demás.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Empezando en C
« Respuesta #14 en: 02 de Mayo de 2005, 23:43:00 »
En C para usar los nombres de los registros los tienes que definir previamente con #byte PORTA = 0x05 etc, de lo contrario no los reconoce.

Es dificil al principio dejar el ensamblador y coger el C, pero te aconsejo que intentes dejar de pensar en ensamblador y lo hagas con instrucciones C, para lo cual lo primero que debes de agenciarte es el manual del compilador. La prueba y gran ventaja del C,  la tienes en el ejemplo que has puesto, compara el número de instrucciones de ensamblador con la única instrucción que te recomienda Radon.

Un saludo


 

anything