DSPRelated.com
Forums

Timer interrupts (TMS320C5402)

Started by french_student June 8, 2004
Hi everybody,

I'm trying to realise an interrupt generated by the timer but
unfortunately the code lines included in the interrupt program (i hope
this is clear enough)are never done.
I read the documentation about the timer and also about interrupts,
but i don't succeed in understanding how i must tell the DSP to go to
my interrupt program whenever the interrupt generated by the timer
happens.
Can someone give me a code example (in C if it's possible) so that i
understand (with explanations too). Thank you very much.

Here is a sample of my code. I f you see something wrong please tell
me about it.

"
 void main(void)
{
	brd_init(100);
	
	*(volatile unsigned int *)0x0007 |=0x0800; 
	*(volatile unsigned int *)0x0007 &=0xFEFF; 
	*(volatile unsigned int *)0x001D =0x00F8; 
	*(volatile unsigned int *)0x0000=0x0000; 
	*(volatile unsigned int *)0x0001=0xFFFF; 	
	
	*(volatile unsigned int *)0x0026 |=0x0010; 
	*(volatile unsigned int *)0x0025=0xC34F; 
	*(volatile unsigned int *)0x0026 |=0x0001; 
	*(volatile unsigned int *)0x0026 |=0x0020; 
	*(volatile unsigned int *)0x0000 |=0x0010; 
	*(volatile unsigned int *)0x0007 &=0xF7FF; 	
	*(volatile unsigned int *)0x0026 &=0xFFEF; 
	for(;;);

}

interrupt void toz (void) /* Here i don't know how to declare this */
{
		
		*(volatile unsigned int *)0x0007 &=0xDFFF; /* bit XF=0 */
		*(volatile unsigned int *)0x0007 |=0x2000; /* bit XF=1 */
		
}  
"

I removed the comments because they were in French.

Hope someone can help me once again.

Thanks.

Jerome
Salut,
Pour que ton interruption fonctionne, il faut que tu v�rifies que ton prog :
Autorise l'interruption du timer (dans les registres d'interruption) et les
interruptions en g�n�ral
Que le vecteur d'interruption soit bien configur� (que le dsp connaisse
l'adresse de ton prog d'interruption)
Enfin que le registre de controle de ton timer g�n�re une interruption.
@+
Max


"french_student" <jerome_lapeyre_mirande@hotmail.com> a &#4294967295;crit dans le
message de news:b261816f.0406080111.70781cf9@posting.google.com...
> Hi everybody, > > I'm trying to realise an interrupt generated by the timer but > unfortunately the code lines included in the interrupt program (i hope > this is clear enough)are never done. > I read the documentation about the timer and also about interrupts, > but i don't succeed in understanding how i must tell the DSP to go to > my interrupt program whenever the interrupt generated by the timer > happens. > Can someone give me a code example (in C if it's possible) so that i > understand (with explanations too). Thank you very much. > > Here is a sample of my code. I f you see something wrong please tell > me about it. > > " > void main(void) > { > brd_init(100); > > *(volatile unsigned int *)0x0007 |=0x0800; > *(volatile unsigned int *)0x0007 &=0xFEFF; > *(volatile unsigned int *)0x001D =0x00F8; > *(volatile unsigned int *)0x0000=0x0000; > *(volatile unsigned int *)0x0001=0xFFFF; > > *(volatile unsigned int *)0x0026 |=0x0010; > *(volatile unsigned int *)0x0025=0xC34F; > *(volatile unsigned int *)0x0026 |=0x0001; > *(volatile unsigned int *)0x0026 |=0x0020; > *(volatile unsigned int *)0x0000 |=0x0010; > *(volatile unsigned int *)0x0007 &=0xF7FF; > *(volatile unsigned int *)0x0026 &=0xFFEF; > for(;;); > > } > > interrupt void toz (void) /* Here i don't know how to declare this */ > { > > *(volatile unsigned int *)0x0007 &=0xDFFF; /* bit XF=0 */ > *(volatile unsigned int *)0x0007 |=0x2000; /* bit XF=1 */ > > } > " > > I removed the comments because they were in French. > > Hope someone can help me once again. > > Thanks. > > Jerome
Cool un fran&#4294967295;ais!

Merci pour ta r&#4294967295;ponse.

> Salut, > Pour que ton interruption fonctionne, il faut que tu v&#4294967295;rifies que ton prog : > Autorise l'interruption du timer (dans les registres d'interruption) et les > interruptions en g&#4294967295;n&#4294967295;ral > Que le vecteur d'interruption soit bien configur&#4294967295; (que le dsp connaisse > l'adresse de ton prog d'interruption) > Enfin que le registre de controle de ton timer g&#4294967295;n&#4294967295;re une interruption.
Normalement, j'autorise bien l'interruption du timer : *(volatile unsigned int *)0x0000 |=0x0008; /* bit TINT0=1 (registre IMR) => autorisation de l'IT due au Timer 0 */ j'autorise bien les ITs globales : *(volatile unsigned int *)0x0007 &=0xF7FF; /* autorisation des ITs globales */ le timer g&#4294967295;n&#4294967295;re bien une IT puisque si j'ai bien compris chaque fois qu'il atteint la valeur 0 il y a une IT, or je n'ai pas oubli&#4294967295; de configur&#4294967295; le d&#4294967295;compte et de lancer le timer, par-contre, je ne sais pas comment configurer le vecteur d'interruption. Pourrais-tu me dire exactement comment il faut faire stp? Je pense que l'erreur vient de l&#4294967295; car nulle part je ne dis au DSP quelle est l'adresse de mon prog d'IT. J'ai beau lire les docs de Texas et de chercher sur le net je vois pas. Merci pour ton aide. Sorry for the "no-french people"! Jerome
> > > "french_student" <jerome_lapeyre_mirande@hotmail.com> a &#4294967295;crit dans le > message de news:b261816f.0406080111.70781cf9@posting.google.com... > > Hi everybody, > > > > I'm trying to realise an interrupt generated by the timer but > > unfortunately the code lines included in the interrupt program (i hope > > this is clear enough)are never done. > > I read the documentation about the timer and also about interrupts, > > but i don't succeed in understanding how i must tell the DSP to go to > > my interrupt program whenever the interrupt generated by the timer > > happens. > > Can someone give me a code example (in C if it's possible) so that i > > understand (with explanations too). Thank you very much. > > > > Here is a sample of my code. I f you see something wrong please tell > > me about it. > > > > " > > void main(void) > > { > > brd_init(100); > > > > *(volatile unsigned int *)0x0007 |=0x0800; > > *(volatile unsigned int *)0x0007 &=0xFEFF; > > *(volatile unsigned int *)0x001D =0x00F8; > > *(volatile unsigned int *)0x0000=0x0000; > > *(volatile unsigned int *)0x0001=0xFFFF; > > > > *(volatile unsigned int *)0x0026 |=0x0010; > > *(volatile unsigned int *)0x0025=0xC34F; > > *(volatile unsigned int *)0x0026 |=0x0001; > > *(volatile unsigned int *)0x0026 |=0x0020; > > *(volatile unsigned int *)0x0000 |=0x0010; > > *(volatile unsigned int *)0x0007 &=0xF7FF; > > *(volatile unsigned int *)0x0026 &=0xFFEF; > > for(;;); > > > > } > > > > interrupt void toz (void) /* Here i don't know how to declare this */ > > { > > > > *(volatile unsigned int *)0x0007 &=0xDFFF; /* bit XF=0 */ > > *(volatile unsigned int *)0x0007 |=0x2000; /* bit XF=1 */ > > > > } > > " > > > > I removed the comments because they were in French. > > > > Hope someone can help me once again. > > > > Thanks. > > > > Jerome
Le vecteur d'interruption est une zone m&#4294967295;moire dans laquelle tu dois mettre
l'adresse de ton ISR, bien &#4294967295;videmment &#4294967295; l'adresse de la m&#4294967295;moire
correspondante au timer que tu utilises.
Tu devrais trouver une table te donnant les adresses des IT dans les docs.
G&#4294967295;n&#4294967295;ralement cette zone m&#4294967295;moire peut &#4294967295;tre configur&#4294967295;e au d&#4294967295;but ou &#4294967295; la fin de
la m&#4294967295;moire gr&#4294967295;ce &#4294967295; un registre.

Si tu programmes en C tu dois d&#4294967295;finir la section m&#4294967295;moire des IT dans le
fichier de linkage (elle y est normalement par d&#4294967295;faut), puis dans ton code
tu d&#4294967295;finis ton vecteur &#4294967295; l'aide de la directive pr&#4294967295;processeur: #pragma
DATA_SECTION

Lorsque tu publies ton code, donne le nom des registres plut&#4294967295;t que leur
adresse en hexa, pce que l&#4294967295;...

Max


Salut, merci pour ta r&#4294967295;ponse.

Malgr&#4294967295; tout ca reste assez flou poour moi, d&#4294967295;sol&#4294967295;.



> Le vecteur d'interruption est une zone m&#4294967295;moire dans laquelle tu dois mettre > l'adresse de ton ISR, bien &#4294967295;videmment &#4294967295; l'adresse de la m&#4294967295;moire > correspondante au timer que tu utilises.
Veux-tu dire que l'adresse de mon isr est l'adresse de l'IT correspondant au Timer? Et que je dois mettre cette adresse dans le vecteur d'interruption? Ou que je dois mettre l'adresse de mon isr dans l'adresse correspondante au timer que j'utilise? Dans ce cas comment conna&#4294967295;t-on l'adresse de l'isr? Je suis d&#4294967295;sol&#4294967295; mais je comprends quedal!
> Tu devrais trouver une table te donnant les adresses des IT dans les docs. > G&#4294967295;n&#4294967295;ralement cette zone m&#4294967295;moire peut &#4294967295;tre configur&#4294967295;e au d&#4294967295;but ou &#4294967295; la fin de > la m&#4294967295;moire gr&#4294967295;ce &#4294967295; un registre. > > Si tu programmes en C tu dois d&#4294967295;finir la section m&#4294967295;moire des IT dans le > fichier de linkage (elle y est normalement par d&#4294967295;faut),
Est-ce &#4294967295;a : PAGE 0: VECS: origin = 0080h, length = 0080h puis &#4294967295;a : .vectors > VECS PAGE 0
> puis dans ton code > tu d&#4294967295;finis ton vecteur &#4294967295; l'aide de la directive pr&#4294967295;processeur: #pragma > DATA_SECTION
?? T'aurais pas un exemple concret ou un lien vers un exemple concret? En tous cas merci pour ton aide.
> Lorsque tu publies ton code, donne le nom des registres plut&#4294967295;t que leur > adresse en hexa, pce que l&#4294967295;...
Oui c'est vrai que c'est n'importe quoi. Je ferai mieux la prochaine fois! Jerome
Slt,
Voici un exemple de vecteur d'interruption. Il n'est pas valable pour ton
dsp car la c'est pour un 2000 mais le principe est le m&#4294967295;me.
Le #pragma va positionner ton vecteur dans la bonne section m&#4294967295;moire
(.vectors)

#pragma DATA_SECTION(vec, ".vectors");
typedef void (*VECTORS)();

const VECTORS vec[] =
{
    UnusedIsr,             /* INT1   - Maskable int 1            */
    UnusedIsr,             /* INT2   - Maskable int 2            */
    UnusedIsr,             /* INT3   - Maskable int 3            */
    UnusedIsr,             /* INT4   - Maskable int 4            */
    UnusedIsr,             /* INT5   - Maskable int 5            */
    UnusedIsr,             /* INT6   - Maskable int 6            */
    UnusedIsr,             /* INT7   - Maskable int 7            */
    UnusedIsr,             /* INT8   - Maskable int 8            */
    UnusedIsr,             /* INT9   - Maskable int 9            */
    UnusedIsr,             /* INT10  - Maskable int 10           */
    UnusedIsr,             /* INT11  - Maskable int 11           */
    UnusedIsr,             /* INT12  - Maskable int 12           */
    Int13Isr,              /* INT13  - Maskable int 13, timer 1  */
    Int14Isr,              /* INT14  - Maskable int 14, timer 2  */
    UnusedIsr,             /* DLOGINT- Maskable data-logging int */
    UnusedIsr,             /* RTOSINT- Maskable real-time OS int */
    UnusedIsr,             /* Reserved                           */
    UnusedIsr,             /* NMI    - Nonmaskable interrupt     */
    UnusedIsr,             /* ILLEGAL- Illegal instruction trap  */
    UnusedIsr,             /* USER1  - User-defined sw int/trap  */
    UnusedIsr,             /* USER2  - User-defined sw int/trap  */
    UnusedIsr,             /* USER3  - User-defined sw int/trap  */
    UnusedIsr,             /* USER4  - User-defined sw int/trap  */
    UnusedIsr,             /* USER5  - User-defined sw int/trap  */
    UnusedIsr,             /* USER6  - User-defined sw int/trap  */
    UnusedIsr,             /* USER7  - User-defined sw int/trap  */
    UnusedIsr,             /* USER8  - User-defined sw int/trap  */
    UnusedIsr,             /* USER9  - User-defined sw int/trap  */
    UnusedIsr,             /* USER10 - User-defined sw int/trap  */
    UnusedIsr,             /* USER11 - User-defined sw int/trap  */
    UnusedIsr,             /* USER12 - User-defined sw int/trap  */

    UnusedIsr,             /* PIE int 1.1  */
    UnusedIsr,             /* PIE int 1.2  */
    UnusedIsr,             /* PIE int 1.3  */
    UnusedIsr,             /* PIE int 1.4  */
    UnusedIsr,             /* PIE int 1.5  */
    UnusedIsr,             /* PIE int 1.6  */
    Int1Isr,               /* PIE int 1.7, TINT0 (Timer 0) */
    UnusedIsr,             /* PIE int 1.8  */
};

Max


Me revoil&#4294967295; sur ce sujet.

J'ai essay&#4294967295; ce que tu m'as conseill&#4294967295; et j'ai essay&#4294967295; plein d'autres
choses aussi mais ca ne marche toujours pas.
Je continue &#4294967295; tester et chercher la raison. Si jamais t'as une autre
id&#4294967295;e.
J'ai v&#4294967295;rifi&#4294967295; que mon timer passait bien &#4294967295; '0', que le flag
correspondant se mettait bien &#4294967295; '1' puis qu'il &#4294967295;tait remis &#4294967295; '0' mais
le programme d'interruption ne se r&#4294967295;alise jamais! Je pense que je m'y
prends mal pour lui dire que lorsque l'it se produit il doit aller
effectuer les lignes de code stock&#4294967295;es &#4294967295; l'adresse correspondant au
timer.

Dans mon fichier "vectors.asm" j'ai mis &#4294967295;a :

	.title "vectors.asm"
		.ref _toz
		.sect "vectors"
        .ref _c_int00           
RESET:                          ; reset vector
        BD _c_int00                             ; branch to C entry
point
        STM #200,SP                             ; stack size of 200
nmi:    RETE                    ; enable interrupts and return from
one
                NOP
                NOP
                NOP                                     ;NMI~
(...)
tint0:   B _toz
                NOP
                NOP
(...)

Dans mon fichier .c j'ai mis &#4294967295;a :

(...)
interrupt void toz(void)
{
	t=1;	
	*(volatile unsigned int *)0x0007 &=0xDFFF; /* bit XF=0 */
	*(volatile unsigned int *)0x0007 |=0x2000; /* bit XF=1 */
	*(volatile unsigned int *)0x0026 |=0x0020; /* TRB=1 */
}

(...)

et j'autorise bien les its globales et l'it correspondant au timer 0.

Enfin dans le fichier .cmd j'ai mis:

MEMORY
{
   PAGE 0: VECS:     origin = 0080h, length = 0080h  /* Internal
Program RAM */
  (...)

SECTIONS
{
   .vectors  > VECS  PAGE 0		 
(...)

Y a t-il qqchose d'incoh&#4294967295;rent ou de totalement faux?

Je continue &#4294967295; chercher...

Merci.
Hi,

Nobody here can help me with interrupts??
french_student wrote:

> Hi, > > Nobody here can help me with interrupts??
Pas en francais. Jerry -- Engineering is the art of making what you want from things you can get. &#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;
Hi everyone,

I found the issue and now it works fine!

In fact, i don't know why but CCS wasn't including my vectors.asm but
another file. And as a consequence there was no branch to my isr. I
found the solution by looking at the progam memory and seeing that the
code lines weren't mine. I changed the name of my vectors.asm and now
it does work.

Thanks everyone for his help.
 
> > Hi, > > > > Nobody here can help me with interrupts?? > > Pas en francais. > > Jerry
Hi Jerry. May i ask you a question : do you say that because you don't talk french or because the only language authorized here is the english one? I don't want to polemize but just keep in mind that many people here make some efforts to talk english since it's not their usual language. So if sometimes some people talk with their language i think it's a good thing. Why should we talk english? Many people here surely talk spanish, german or french too. I agree that english is the language the most spread (surely this sentence isn't good!) but i hope nobody here refuses to answer to a question only because it wasn't said in english. It's my point of view. Once again i don't want to polemize. I hope you don't take it badly. That's not my aim.