TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: juno303 en 01 de Octubre de 2004, 18:06:00
-
hola, estoy empezando a usar el CCS, vengo de usar el C-18 pero me voy econtrando con cosas que debo hacer y no se como en el CCS.
Primero que nada, como defino la funcion de servicio de interrupcion ??
Como puedo configurar el timer0 o timer1 para que haga la interrupcion, y tambien otros como el USART y el ADC. ?
Saludos.
P.D.: Como puedo acceder a los registros de la USART del 18f452 ? necesito usar el puerto serial pero por hardware no por software.
-
Hola juno303,
soy nobato en esto tambien, pero a ver si al menos consigo responderte parte de tus preguntas...
Bueno, en el manual de CCS en español te explica como se ha de definir una funcion para interrupciones, las funciones asociadas y sus directivas, buscalo en:
http://www.conket.com/downloads/CCS_C_sp.pdf
En el programa CCS, en la carpeta Examples vienen varios ejemplos, (si lo instalas en Archivos de programa, la ruta es: C:Archivos de programaPICCExamples), consulta la ayuda del programa.
En cualquier caso, para definir una funcion que atienda a una interrupcion has de anteponer la palabra #int_xxx a tu funcion, donde xxx es la directiva asociada al tipo de interrupcion,
#int_rtcc para el timer0
#int_timer1 para el timer1
#int_timer2 para el timer2
#int_ad para el convertidor A/D
etc... consulta en el manual.
Un ejemplo de utilizacion del timer0 casero:
/*
Intermitente de 1 segundo, utilizando para ello el TIMER0.
Cada vez que pasa un segundo activa o desactiva todos los
bits del puerto b.
*/
#include <16F84A.H> /* tipo de PIC */
#use delay( clock = 4000000 ) /* reloj de 4 MHz */
#fuses XT,NOWDT,NOPROTECT,NOPUT // Configuracion
#byte puerto_b =06 // Definicion variable PORTB
char contador;
#int_rtcc // Rutina que atiende interrupcion
void interrupt(void)
{
contador++; // Incrementa la variable que cuenta las
set_rtcc(0x06); // interrupciones y recarga el timer
}
void main( void )
{
set_tris_b(0x00); /* puerto B como salida */
puerto_b=0; // Pone a cero el puerto b
setup_counters (RTCC_INTERNAL, RTCC_DIV_16); // Programacion timer0
set_timer0(0x06); // Carga el valor del timer0
enable_interrupts(INT_RTCC); // Habilita interrupcion timer0.
enable_interrupts(GLOBAL); // Habilita todas las interrupciones.
while(1)
{
if(contador==250)
{
contador=00;
puerto_b=~puerto_b; // Cada vez que pasa un segundo, activa o desactiva, segun caso, todos los bits del puerto B
}
}
}
Espero haberte ayudado en algo.
Ahhh, en la revista RESISTOR ha empezado una coleccion de articulos sobre los PICs 18F
-
Buen ejemplo neocomandos
-
Puedes acceder a los registros y a sus bits definiendolos previamente:
#byte INTCON = 0x0B
#bit T0IF = 0x0B.2
Puedes también meter código en ensamblador dentro del programa en C, metiéndolo dentro de las directivas #asm y #endasm
-
hola Pocher
el ejemplo q diste me viene de maravillas para mi pregunta...
no hay una forma mejor q el hecho de estaar definiendo sieeeempre las constantes de cada micro y luego acceder????
no se puede incluir el .INC q ya viene con el micro? no hay un .H para cada micro ya hecho???
o sea, uso los siguientes micros f84, el f628, el f872, el f877, el f873, f452 y siempre se me presenta el problema,
no me digas q me haga uno o varios .h para cada micro... pq en eso estoy, .... pero me suena raro q con tanta potencia no haya ya algo pensado para esto
aaaa, una cosa mas, francamente di vueltas por ahi y preguntes por el CCS y esas cosas, hoy ya tengo CCs, C18 y probe de todo,
y sabes q peso a la hora de decidir q usar como compilador.... que EL CCS PERMITE COMPILAR TODOS LOS MICROS EN CCCCCCC... Y EL C18 NOOOOOO
para mi eso hizo la gran diferencia
Suerte
-
Hola wqtrp.
Que yo sepa no hay ningún archivo predefinido con los nombres de registros y bits.
Me harías un favor si me enviaras los archivos del 877 y 452.
Un saludo
-
muchas gracias, voy a probar el tema de las interrupciones hoy.
"wqtrp" se refiere a los archivos include que trae el mplab, que trae las etiquetas asm de cada registro: por ejemplo esto es una fraccion del 18f452.inc
;----- Register Files -----------------------------------------------------
TOSU EQU H"0FFF"
TOSH EQU H"0FFE"
TOSL EQU H"0FFD"
STKPTR EQU H"0FFC"
PCLATU EQU H"0FFB"
PCLATH EQU H"0FFA"
PCL EQU H"0FF9"
TBLPTRU EQU H"0FF8"
TBLPTRH EQU H"0FF7"
TBLPTRL EQU H"0FF6"
TABLAT EQU H"0FF5"
PRODH EQU H"0FF4"
PRODL EQU H"0FF3"
INTCON EQU H"0FF2"
INTCON1 EQU H"0FF2"
INTCON2 EQU H"0FF1"
INTCON3 EQU H"0FF0"
INDF0 EQU H"0FEF"
POSTINC0 EQU H"0FEE"
POSTDEC0 EQU H"0FED"
PREINC0 EQU H"0FEC"
PLUSW0 EQU H"0FEB"
FSR0H EQU H"0FEA"
FSR0L EQU H"0FE9"
WREG EQU H"0FE8"
INDF1 EQU H"0FE7"
POSTINC1 EQU H"0FE6"
POSTDEC1 EQU H"0FE5"
PREINC1 EQU H"0FE4"
PLUSW1 EQU H"0FE3"
FSR1H EQU H"0FE2"
FSR1L EQU H"0FE1"
BSR EQU H"0FE0"
INDF2 EQU H"0FDF"
POSTINC2 EQU H"0FDE"
POSTDEC2 EQU H"0FDD"
PREINC2 EQU H"0FDC"
PLUSW2 EQU H"0FDB"
FSR2H EQU H"0FDA"
FSR2L EQU H"0FD9"
STATUS EQU H"0FD8"
TMR0H EQU H"0FD7"
TMR0L EQU H"0FD6"
T0CON EQU H"0FD5"
;RESERVED_0FD4 EQU H"0FD4"
OSCCON EQU H"0FD3"
LVDCON EQU H"0FD2"
WDTCON EQU H"0FD1"
RCON EQU H"0FD0"
TMR1H EQU H"0FCF"
TMR1L EQU H"0FCE"
T1CON EQU H"0FCD"
TMR2 EQU H"0FCC"
PR2 EQU H"0FCB"
T2CON EQU H"0FCA"
SSPBUF EQU H"0FC9"
SSPADD EQU H"0FC8"
SSPSTAT EQU H"0FC7"
SSPCON1 EQU H"0FC6"
SSPCON2 EQU H"0FC5"
ADRESH EQU H"0FC4"
ADRESL EQU H"0FC3"
ADCON0 EQU H"0FC2"
ADCON1 EQU H"0FC1"
...
el seguro se refiere a esto, en realidad, seria muy interesante poder usar estos archivos en el CCS
-
abri un nuevo tema con esto para ver si a alguien le interesa y se engancha, yo ire haciendo lo que pueda a medida q el tiempo me lo permita .....
http://miarroba.com/foros/ver.php?foroid=46840&temaid=2634091
creo q esto nos permitiria desarrollar un poco mas rapido una vez solucionados algunos temitas q expongo....
Gracias a todos...
Suerte.
-
como refresco la interrupcion ???
resulta que en tu ejemplo va a la interrupcion pero no la refresca, y llama y llama hasta que da un overflow en el stack.
-
Sí juno303, a esos archivos me refería yo también.
wqtrp ¿ Y no sería más fácil hacer: include<registros.h>?
registros.h
#byte INTCON = 0x0B
.
.
.
#bit T0IF = 0x0B.2
.
.
.
juno, supongo que te refieres al ejemplo de neocomandos. No entiendo lo que quieres decir con refrescar la interrupción, aparentemente el ejemplo está bien.
-
el ejemplo no funciiona, o sea, se produce la interrupcion, pero al parecer no se refresca nunca mas la interrupcion, por que ni bien termina la funcion de la interrupcion vuelve a llamarse y asi, y luego un overflow en el stack. O sea, no se refresco de que ya fue atendida la interrupcion, me refiero a eso.
-
aun no obtengo resultados...
-
Pués en el simulador funciona perfectamente.
-
disculpa, tenes razon, funciona bien. Pasa lo copie mal...
gracias.
-
Gracias YF-21
Entre todos nos echamos un cablecito