Autor Tema: Interrupciones en CCS  (Leído 7551 veces)

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

Desconectado juno303

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 103
Interrupciones en CCS
« 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.


Desconectado neocommandos

  • PIC10
  • *
  • Mensajes: 25
RE: Interrupciones en CCS
« Respuesta #1 en: 01 de Octubre de 2004, 20:08:00 »
   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

Desconectado YF-21

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 185
RE: Interrupciones en CCS
« Respuesta #2 en: 01 de Octubre de 2004, 23:25:00 »
Buen ejemplo neocomandos

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Interrupciones en CCS
« Respuesta #3 en: 01 de Octubre de 2004, 23:54:00 »
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

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
RE: Interrupciones en CCS
« Respuesta #4 en: 02 de Octubre de 2004, 08:42:00 »
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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Interrupciones en CCS
« Respuesta #5 en: 02 de Octubre de 2004, 09:30:00 »
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

Desconectado juno303

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 103
RE: Interrupciones en CCS
« Respuesta #6 en: 02 de Octubre de 2004, 11:39:00 »
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

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
RE: Interrupciones en CCS
« Respuesta #7 en: 02 de Octubre de 2004, 13:10:00 »

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.

Desconectado juno303

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 103
RE: Interrupciones en CCS
« Respuesta #8 en: 02 de Octubre de 2004, 16:59:00 »
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.


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Interrupciones en CCS
« Respuesta #9 en: 03 de Octubre de 2004, 00:25:00 »
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.

Desconectado juno303

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 103
RE: Interrupciones en CCS
« Respuesta #10 en: 03 de Octubre de 2004, 02:41:00 »
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.

Desconectado juno303

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 103
RE: Interrupciones en CCS
« Respuesta #11 en: 03 de Octubre de 2004, 22:50:00 »
aun no obtengo resultados...

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Interrupciones en CCS
« Respuesta #12 en: 03 de Octubre de 2004, 23:57:00 »
Pués en el simulador funciona perfectamente.

Desconectado juno303

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 103
RE: Interrupciones en CCS
« Respuesta #13 en: 04 de Octubre de 2004, 10:36:00 »
disculpa, tenes razon, funciona bien. Pasa lo copie mal...

gracias.

Desconectado neocommandos

  • PIC10
  • *
  • Mensajes: 25
RE: Interrupciones en CCS
« Respuesta #14 en: 04 de Octubre de 2004, 17:11:00 »
Gracias YF-21  
Entre todos nos echamos un cablecito


 

anything