TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: CONFORMOTICA en 25 de Abril de 2009, 18:07:03

Título: Existen librerias CCS de registros internos del PIC
Publicado por: CONFORMOTICA en 25 de Abril de 2009, 18:07:03
Que tal? Soy nuevo en el foro. Estuve buscando desesperadamente por toda la web pero no encontre nada que me sirva. Estoy buscando una libreria similar a las .inc que provee micrchip para el asm donde estan todos los registros internos de cada PIC (option_reg, porta, portb, intcon, etc). Porque estuve viendo que en todos los programas, incluyen los registros que se usan a mano, con el #byte PORTA=5 por ejemplo. Queria saber si alguien encontro o fabrico una libreria para CCS que contenga los registros internos de cada PIC.

Gracias!!
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: Cryn en 25 de Abril de 2009, 18:18:33
no escuche sobre esto, quizá fuera necesario cuando empiezas el cambio de asm a ccs, para hallarle el hilo al compilador.

Si usas la versión 4 ahí puedes ver los registros del micro seleccionado y sus respectivos nombres, hasta nombres de los bits si mal no recuerdo.

Tienes la versión 4?
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: migsantiago en 25 de Abril de 2009, 18:26:45
Si usas las funciones de configuración más comunes de periféricos, la directiva #byte no es necesaria; una ventaja de CCS. Por ejemplo,

set_tris_b(0x00); //pone puerto b como entradas
output_b(0xaa); //escribe 10101010 en pto b

no hace falta conocer las direcciones ram de los registros que se van a trabajar.

Si aún así quieres manipularlas deberás buscar en la carpeta

C:\Archivos de programa\PICC\Devices

el archivo .h que corresponda al pic que quieres trabajar. Ahí están todos los defines, funciones y configuraciones disponibles para el pic en específico.
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: CONFORMOTICA en 25 de Abril de 2009, 18:30:57
Si. Tengo la version pcwh 4.023 de ccs, o sea picc. Vi en las librerias, por ejemplo la del 16f628, que seria la que se incluye con el: #include <P16F628.H> que seria esta:

#define PIN_A0  40
#define PIN_A1  41
#define PIN_A2  42
#define PIN_A3  43
#define PIN_A4  44
#define PIN_A5  45
#define PIN_A6  46
#define PIN_A7  47

#define PIN_B0  48
#define PIN_B1  49
#define PIN_B2  50
#define PIN_B3  51
#define PIN_B4  52
#define PIN_B5  53
#define PIN_B6  54
#define PIN_B7  55

////////////////////////////////////////////////////////////////// Useful defines
#define FALSE 0
#define TRUE 1

#define BYTE int
#define BOOLEAN short int

#define getc getch
#define fgetc getch
#define getchar getch
#define putc putchar
#define fputc putchar
#define fgets gets
#define fputs puts

////////////////////////////////////////////////////////////////// Control
// Control Functions:  RESET_CPU(), SLEEP(), RESTART_CAUSE()
// Constants returned from RESTART_CAUSE() are:
#define WDT_FROM_SLEEP  3    
#define WDT_TIMEOUT     11    
#define MCLR_FROM_SLEEP 19    
#define MCLR_FROM_RUN   27    
#define NORMAL_POWER_UP 24    
#define BROWNOUT_RESTART 26  


////////////////////////////////////////////////////////////////// Timer 0
// Timer 0 (AKA RTCC)Functions: SETUP_COUNTERS() or SETUP_TIMER_0(),
//                              SET_TIMER0() or SET_RTCC(),
//                              GET_TIMER0() or GET_RTCC()
// Constants used for SETUP_TIMER_0() are:
#define RTCC_INTERNAL   0
#define RTCC_EXT_L_TO_H 32
#define RTCC_EXT_H_TO_L 48

#define RTCC_DIV_1      8
#define RTCC_DIV_2      0
#define RTCC_DIV_4      1
#define RTCC_DIV_8      2
#define RTCC_DIV_16     3
#define RTCC_DIV_32     4
#define RTCC_DIV_64     5
#define RTCC_DIV_128    6
#define RTCC_DIV_256    7


#define RTCC_8_BIT      0    

// Constants used for SETUP_COUNTERS() are the above
// constants for the 1st param and the following for
// the 2nd param:

////////////////////////////////////////////////////////////////// WDT
// Watch Dog Timer Functions: SETUP_WDT() or SETUP_COUNTERS() (see above)
//                            RESTART_WDT()
//
#define WDT_18MS        0  
#define WDT_36MS        9  
#define WDT_72MS       10  
#define WDT_144MS      11  
#define WDT_288MS      12  
#define WDT_576MS      13  
#define WDT_1152MS     14  
#define WDT_2304MS     15  

////////////////////////////////////////////////////////////////// Timer 1
// Timer 1 Functions: SETUP_TIMER_1, GET_TIMER1, SET_TIMER1
// Constants used for SETUP_TIMER_1() are:
//      (or (via |) together constants from each group)
#define T1_DISABLED         0
#define T1_INTERNAL         0x85
#define T1_EXTERNAL         0x87
#define T1_EXTERNAL_SYNC    0x83

#define T1_CLK_OUT          8

#define T1_DIV_BY_1         0
#define T1_DIV_BY_2         0x10
#define T1_DIV_BY_4         0x20
#define T1_DIV_BY_8         0x30

////////////////////////////////////////////////////////////////// Timer 2
// Timer 2 Functions: SETUP_TIMER_2, GET_TIMER2, SET_TIMER2
// Constants used for SETUP_TIMER_2() are:
#define T2_DISABLED         0
#define T2_DIV_BY_1         4
#define T2_DIV_BY_4         5
#define T2_DIV_BY_16        6

////////////////////////////////////////////////////////////////// CCP
// CCP Functions: SETUP_CCPx, SET_PWMx_DUTY
// CCP Variables: CCP_x, CCP_x_LOW, CCP_x_HIGH
// Constants used for SETUP_CCPx() are:
#define CCP_OFF                         0
#define CCP_CAPTURE_FE                  4
#define CCP_CAPTURE_RE                  5
#define CCP_CAPTURE_DIV_4               6
#define CCP_CAPTURE_DIV_16              7
#define CCP_COMPARE_SET_ON_MATCH        8
#define CCP_COMPARE_CLR_ON_MATCH        9
#define CCP_COMPARE_INT                 0xA
#define CCP_COMPARE_RESET_TIMER         0xB
#define CCP_PWM                         0xC
#define CCP_PWM_PLUS_1                  0x1c
#define CCP_PWM_PLUS_2                  0x2c
#define CCP_PWM_PLUS_3                  0x3c
long CCP_1;
#byte   CCP_1    =                      0x15          
#byte   CCP_1_LOW=                      0x15          
#byte   CCP_1_HIGH=                     0x16          
////////////////////////////////////////////////////////////////// UART
// Constants used in setup_uart() are:
// FALSE - Turn UART off
// TRUE  - Turn UART on
#define UART_ADDRESS           2
#define UART_DATA              4
////////////////////////////////////////////////////////////////// COMP
// Comparator Variables: C1OUT, C2OUT
// Constants used in setup_comparator() are:
#define A0_A3_A1_A2  0xfff04
#define A0_A2_A1_A2  0x7ff03
#define NC_NC_A1_A2  0x6ff05
#define NC_NC_NC_NC  0x0ff07
#define A0_VR_A1_VR  0x3ff02
#define A3_VR_A2_VR  0xcff0A
#define A0_A2_A1_A2_OUT_ON_A3_A4 0x7e706
#define A3_A2_A1_A2  0xeff09
#define CP1_INVERT   0x00010
#define CP2_INVERT   0x00020

#bit C1OUT = 0x1f.6
#bit C2OUT = 0x1f.7

////////////////////////////////////////////////////////////////// VREF
// Constants used in setup_vref() are:
//
#define VREF_LOW  0xa0
#define VREF_HIGH 0x80
// Or (with |) the above with a number 0-15
#define VREF_A2   0x40

////////////////////////////////////////////////////////////////// INTERNAL RC
// Constants used in setup_oscillator() are:
#define OSC_48KHZ   0
#define OSC_4MHZ    8

////////////////////////////////////////////////////////////////// INT
// Interrupt Functions: ENABLE_INTERRUPTS(), DISABLE_INTERRUPTS(),
//                      EXT_INT_EDGE()
//
// Constants used in EXT_INT_EDGE() are:
#define L_TO_H              0x40
#define H_TO_L                 0
// Constants used in ENABLE/DISABLE_INTERRUPTS() are:
#define GLOBAL                    0x0BC0
#define INT_RTCC                  0x0B20
#define INT_RB                    0xFF0B08
#define INT_EXT                   0x0B10
#define INT_TBE                   0x8C10
#define INT_RDA                   0x8C20
#define INT_TIMER1                0x8C01
#define INT_TIMER2                0x8C02
#define INT_CCP1                  0x8C04
#define INT_COMP                  0x8C40
#define INT_TIMER0                0x0B20
#define INT_EEPROM                0x8C80

#list


pero no se declaran los registros como el PORTB, PORTA, INTCON, OPTION_REG, STATUS, FSR, etc, que serian los registros internos del pic. El ccs tiene ese tipo de funciones que comenta migsantiago pero no son suficientes, porque solo manipulan los registros mas utilizados como los de puertos y tris.

Yo justamente estoy necesitando alguna libreria donde esten declarados todos los registros internos del pic, para no tener que hacerlo con el #byte id=const de ccs.
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: migsantiago en 25 de Abril de 2009, 18:36:34
Hay funciones para manipular todos los registros especiales. El manejo de interrupciones (INTCON), direccionamiento indirecto (FSR), entrada-salida de puertos (TRISX), todo se hace con funciones; de ahí que no exista un archivo como el que necesitas.

Imagino que estás migrando de asm a c y quieres configurar todo tal como está en asm, pero en CCS es automático al usar las funciones predefinidas.
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: Cryn en 25 de Abril de 2009, 18:48:11
si, la idea del CCS es usar funciones, y ya saber las direcciones solamente en casos específicos o cuando una función lo requiere como por ejemplo:

set_bit(dir,bit);  //dir es la dirección de un registro y bit la posición del bit a setear, lo mismo para un clear_bit

Los registros los puedes ver desde el compilador en el menu VIEW -> SPECIAL REGISTERS para saber dirección, nombre y nombres de cada bit, esto puede ayudar para que coloques los #byte o #bit que necesites
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: CONFORMOTICA en 25 de Abril de 2009, 18:51:22
Gracias por responder tan rapido.

Es verdad que estoy migrando de asm a ccs.. pasando antes por el niple, pero bueno.

Puede ser que aun tenga la mentalidad de trabajar como en asm y no me adapte bien a ccs, voy a tratar de seguir con mi programa tomando esto en cuenta.

Me interesaria saber de alguna funcion que sea similar al manejo con fsr e indf que se realiza en asm, porque estoy medio trabado con eso tambien.

Gracias
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: Cryn en 25 de Abril de 2009, 19:09:00
cuando trabajé con ASM no use fsr e indf, pero vi las cosas que hace, son tremendas, y pues lo asemejo con los punteros que tiene el lenguaje C y que se aplican acá en el CCS.

si buscas en el foro encontraras la forma de manejarlos y teniendo una función similar a fsr e indf
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: migsantiago en 25 de Abril de 2009, 19:12:01
No hay función similar pero se puede hacer un algoritmo similar usando apuntadores como dice Cryn.

Por ejemplo, para poner una sección de ram en ceros (0x0C a 0x7F del banco actual):

Código: [Seleccionar]
int8 *apuntador;

...

apuntador=0x0C;
while(apuntador<0x80)
   {
   *apuntador=0x00;
   apuntador++;
   }

Si quieres aprender más sobre apuntadores en CCS puedes leer el tutorial de Palitroquez al respecto.

http://www.todopic.com.ar/foros/index.php?topic=16680.0

si, la idea del CCS es usar funciones, y ya saber las direcciones solamente en casos específicos o cuando una función lo requiere como por ejemplo:

set_bit(dir,bit);  //dir es la dirección de un registro y bit la posición del bit a setear, lo mismo para un clear_bit

Los registros los puedes ver desde el compilador en el menu VIEW -> SPECIAL REGISTERS para saber dirección, nombre y nombres de cada bit, esto puede ayudar para que coloques los #byte o #bit que necesites

Hey Cryn, en el caso de set_bit tampoco hace falta conocer la dirección RAM del registro. C la ubica y C la conoce pero set_bit no la pide a nivel de programación.  :mrgreen:

Funciones como sprintf sí requieren que uno le diga la dirección RAM del primer char del string a trabajar, pero se resuelve con apuntadores.
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: Cryn en 25 de Abril de 2009, 19:19:37
Citar
Hey Cryn, en el caso de set_bit tampoco hace falta conocer la dirección RAM del registro. C la ubica y C la conoce pero set_bit no la pide a nivel de programación.  Mr. Green

como ejecutarías esa función?

yo hago:

#byte portb 6

bit_set(portb,0);

eso hace que se ponga a alto el pin B0 del micro
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: migsantiago en 25 de Abril de 2009, 19:31:54
Usando las ya existentes  :mrgreen:

Código: [Seleccionar]
output_high(pin_b0);
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: PalitroqueZ en 25 de Abril de 2009, 20:41:14
Que tal? Soy nuevo en el foro. Estuve buscando desesperadamente por toda la web pero no encontre nada que me sirva. Estoy buscando una libreria similar a las .inc que provee micrchip para el asm donde estan todos los registros internos de cada PIC (option_reg, porta, portb, intcon, etc). Porque estuve viendo que en todos los programas, incluyen los registros que se usan a mano, con el #byte PORTA=5 por ejemplo. Queria saber si alguien encontro o fabrico una libreria para CCS que contenga los registros internos de cada PIC.

Gracias!!

si es posible, pero hay que crearlas para cada microcontrolador,

mira el post:

http://www.todopic.com.ar/foros/index.php?topic=21521.msg172911#msg172911


Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: Cryn en 26 de Abril de 2009, 09:49:42
Usando las ya existentes  :mrgreen:

Código: [Seleccionar]
output_high(pin_b0);

ok :lol:

 :P
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: migsantiago en 26 de Abril de 2009, 12:40:22
si es posible, pero hay que crearlas para cada microcontrolador,

mira el post:

http://www.todopic.com.ar/foros/index.php?topic=21521.msg172911#msg172911

uff no tenía idea de esas opciones, perdón por la metida de pata.
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: CONFORMOTICA en 27 de Abril de 2009, 16:21:30
Que tal? Soy nuevo en el foro. Estuve buscando desesperadamente por toda la web pero no encontre nada que me sirva. Estoy buscando una libreria similar a las .inc que provee micrchip para el asm donde estan todos los registros internos de cada PIC (option_reg, porta, portb, intcon, etc). Porque estuve viendo que en todos los programas, incluyen los registros que se usan a mano, con el #byte PORTA=5 por ejemplo. Queria saber si alguien encontro o fabrico una libreria para CCS que contenga los registros internos de cada PIC.

Gracias!!

si es posible, pero hay que crearlas para cada microcontrolador,

mira el post:

http://www.todopic.com.ar/foros/index.php?topic=21521.msg172911#msg172911




Estuve viendo el post pero ocurre que el CCS duplica las etiquetas de los registros y a la hora de compilar tira muchos errores, esto es porque asigna las direcciones de memoria a los registros, y muchos registros se encuentran en varias posiciones de memoria, lo cual provoca el conflicto de que una misma etiqueta esté identificada con más de un numero.
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: ElVale en 27 de Abril de 2009, 22:23:37
Con la directiva #byte puedes manipuar cualquier posición de memoria del pic, simplemente tienes que apuntar a la dirección de memoria del registro que quieras y ya. Puede servir para por ejemplo hacer polling a las flags interrupciones en vez de usar la función isr_interrupcion().
Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: PalitroqueZ en 28 de Abril de 2009, 17:01:51
...
Estuve viendo el post pero ocurre que el CCS duplica las etiquetas de los registros y a la hora de compilar tira muchos errores, esto es porque asigna las direcciones de memoria a los registros, y muchos registros se encuentran en varias posiciones de memoria, lo cual provoca el conflicto de que una misma etiqueta esté identificada con más de un numero.

si es cierto, pero ya tienes mas del camino hecho!, es mejor borrar unas cuantas lineas a que hacer todo desde cero.

Título: Re: Existen librerias CCS de registros internos del PIC
Publicado por: CONFORMOTICA en 28 de Abril de 2009, 18:15:50
...
Estuve viendo el post pero ocurre que el CCS duplica las etiquetas de los registros y a la hora de compilar tira muchos errores, esto es porque asigna las direcciones de memoria a los registros, y muchos registros se encuentran en varias posiciones de memoria, lo cual provoca el conflicto de que una misma etiqueta esté identificada con más de un numero.

si es cierto, pero ya tienes mas del camino hecho!, es mejor borrar unas cuantas lineas a que hacer todo desde cero.



Buenas Tardes gente del foro!!

Por suerte pude adquirir una version mas reciente del ccs. La 4.088, aunque no sea la ultima version, ya tiene practicamente solucionado el tema de las etiquetas duplicadas. Soluciona el problema en la asignacion de los registros, pero tiene problemas en la declaracion de los bits, ya que hay bits en el micro que no tienen un nombre especifico. El CCS lo considera como "-", entonces hay varios "-" con distintos valores de identificacion (dependiendo de que registro formen parte), la solucion fue comentar esas lineas donde estaban declarados esos bits.

Gracias por su ayuda y dedicacion!