Aller au contenu


Photo
- - - - -

STM8S - placer un I/O en interuption sur front montant


  • Veuillez vous connecter pour répondre
1 réponse à ce sujet

#1 joel14

joel14

    Nouveau membre

  • Membres
  • 4 messages

Posté 05 janvier 2015 - 11:32

Bonjour,

 

je suis depuis 15 jours sur un projet de Multi barrière infrarouge codée pour piscine ou mare. c'est pas pour du taf mais pour être prévenu lorsque des enfants s'approchent de ma mare à poisson.

 

pour cela j'utilise un STM8S pour coder les faisceaux infrarouge  et le même pour lire les code reçus. j'ai besoin de mettre mon i/o d'entrée en interruption sur front montant car si je la laisse en front descendant j'ai un intérup au moment de l'envoi des codes infrarouges et c'est pas  bon du tout.

 

je suis un ancien de l'électroinque et je programme en assembleur.

 

j'ai bien suivi tout ce qui est donné dans les docs ST mais je n'arrive pas à faire passer cette i/o en intérupt rising edge .

 

ci dessous le bout de code à mettre dans un STM8-discovery

 

 

;---------------------------------------------------------------------------
;initialisation entrée intéruptible pour lecture IR
 
;.EXTI_CR1                    DS.B 1 ; External interrupt control register 1
;.EXTI_CR2                    DS.B 1 ; External interrupt control register 2
 
;.ITC_SPR1 DS.B 1 ; Interrupt Software priority register 1
;.ITC_SPR2 DS.B 1 ; Interrupt Software priority register 2
;.ITC_SPR3 DS.B 1 ; Interrupt Software priority register 3
;.ITC_SPR4 DS.B 1 ; Interrupt Software priority register 4
;.ITC_SPR5 DS.B 1 ; Interrupt Software priority register 5
;.ITC_SPR6 DS.B 1 ; Interrupt Software priority register 6
;.ITC_SPR7 DS.B 1 ; Interrupt Software priority register 7
 
; PD2_IR_IN                   EQU 2     ;  bit 2 du port D en réception des datas des récepteurs IR
 
 
; ld A , #%11111111
; ld ITC_SPR2 , A 
; ld A , ITC_SPR2              ; ITC_SPR2 gère les priorités interruption du port D
; nop                                       -->   en mode simulation j'ai " #%11111111" dans A  donc ok            
; ld A , #%00100000
; ld EXTI_CR1 , A 
; ld A , EXTI_CR1
; nop                                      -->  en mode simulation j'ai "0" dans A alors que je devrais avoir #%00100000  pas ok du tout 
 
; bset EXTI_CR1 ,#6 ; mettre 01: Rising edge only pour le port  D       --> marche pas mieux
; bset EXTI_CR2 ,#2 ; TLIS: Top level interrupt sensitivity Rising edge  --> marche pas mieux
 
bres PD_ODR, #PD2_IR_IN
bres PD_IDR, #PD2_IR_IN
bres PD_DDR, #PD2_IR_IN ;
bset PD_CR1, #PD2_IR_IN                   ; 0 : floating 1; with pullup
;    bres PD_CR2, #PD2_IR_IN           ; 0: External interrupt disabled
bset PD_CR2, #PD2_IR_IN                ; 1: External interrupt enabled
 
;--------------------------------------------------------------------------------------
 
voilà si quelqu'un peut m'aider car la doc me signale que si I1 et I0  ne sont pas à 1 dans le registre CCR je ne pourais pas enregister le code #%00100000 dans EXTI_CR1
mais même en essayant de forcer ces 2 bits à 1 dans CCR, cela ne marche pas non plus.
 
j'espère avoir fourni assez d'information
 
merci pour votre aide.
 
Joël14
 


#2 darkzz

darkzz

    Membre occasionnel

  • Membres
  • Pip
  • 83 messages

Posté 05 mai 2015 - 11:46

Euh, est-ce tu a pensé à utiliser autre chose que de l'assembleur ? Le langage C est plus facile à débugger et à écrire, surtout que l'assembleur ne se justifie pas vu que ton système est simple.

 

Darkz






0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users