TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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!!
-
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?
-
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.
-
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.
-
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.
-
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
-
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
-
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
-
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):
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.
-
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
-
Usando las ya existentes :mrgreen:
output_high(pin_b0);
-
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
-
Usando las ya existentes :mrgreen:
output_high(pin_b0);
ok :lol:
:P
-
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.
-
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.
-
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().
-
...
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.
-
...
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!