Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > Autres architectures
Autres architectures Toutes les autres architectures (PIC, MIPS, ARM, 68K, Z80...) et leurs outils
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/09/2011, 02h44   #1
spedy
Invité de passage
 
Inscription : août 2007
Messages : 7
Détails du profil
Informations personnelles :
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : août 2007
Messages : 7
Points : 2
Points : 2
Par défaut [16f84] Aide pour une interruption sur port B

salut

il y'a quelqun ici qui comprends vraiment l'assembleur ?
"la croix et la bannière" pour essayé de comprendre ou est le problème !

j'ais réaliser un petit programme avec interruption sur le portb (4...7)
l'interruption est bien détecté , mais pourquoi lors de la deuxième détection il ne se passe rien ? j'ais bien mis en lieu et place retfie et rbif..
pourtant l'interruption ne se fait qu'une fois lors d'un autre essaie ,j'avais créer une temporisation ou lors de l'interruption la led s'allume et s'éteint peux apres (cela fonctionne) , peux apres, si on veut exécuter une autre interruption ,rien ne se passera , si quelqun voit quelque chose ?...
merci pour votre aide

Citation:
;************ Directive d' assemblage pour MPLAB ***********

list p=16f84A
#include p16f84A.inc
__Config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
;.............................................................




;******************** Variables utilisées ****************

var1 equ C



;********** Numero de version / données EEPROM ***********

ORG h'2100'
de "Version 1.0"


;***************** Programme principal *******************

ORG 0
GOTO init

;*********** Sous Programme d 'interruption **********

ORG 4

;*********** IT sur RB4-RB7***********************************

bsf PORTA,0 ; on allume la led connectée sur ra0

bcf INTCON,RBIF ; on raz le flag RBIF

retfie ; retour d 'interruption


; *********** Programme d' INIT ***********************

init


bsf INTCON,GIE ; autorise les Interruptions
bsf INTCON,RBIE ; autorise l ' IT sur RB4-RB7
bsf STATUS,5 ; on met à 1 le 5eme bit du registre status pour accéder
; à la 2eme page mémoire ( pour trisa et trisb )
MOVLW B'11110000' ; programmation de rb0-rb7
MOVWF TRISB ; on met 11110000 dans le registre de direction du port B
MOVLW B'00000' ; programmation de ra0-ra4
MOVWF TRISA ; on met 00000 dans le registre de direction du port A
bcf STATUS,5 ; on remet à 0 le 5eme bit du registre status pour accéder
; à la 1eme page mémoire
clrf PORTA ; raz du port A
clrf PORTB ; raz du port B
spedy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 04h53   #2
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
il manque un paquet de code.
la partie eteindre le led manque aussi
et la plus importante, la boucle inifinie manque. si le programme ne reboucle pas sur un point de passage obligatoire, alors il va planter car le CPU va continuer à lire les instructions suivantes, qui seront indeterminées, et donc, risques de plantage, voire cramagede circuits si le plantage fait un truc louche.

il faut donc veiller à decouper le code en modules, appelés par une boucle principale.

pour ce qui est des ports trisa et trisb, il existe une instruction non documentée:
TRIS reg
qui permet d'acceder aux registres de la seconde banque, quel que soit l'etat des selecteurs de banque.
les valeurs 1, 5, 6 et 7 sont acceptées.
5 et 6 correspondent à porta et portb, donc c'est parfait.
cependant, microchip deconseille d'utiliser l'instruction tris. mais comme le CPU et le compilo la supportent, alors on s'en prive pas.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 17h48   #3
spedy
Invité de passage
 
Inscription : août 2007
Messages : 7
Détails du profil
Informations personnelles :
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : août 2007
Messages : 7
Points : 2
Points : 2
merci pour l'aide , alors , pour ce qui est de l'extinction de la led c'est fait
mais je n'arrive pas a comprendre "boucle infinie" comment ecrire cela ?
(détecter une deuxième fois l'interruption est toujours impossible)

voici le programme modifié

Citation:

;************ Directive d' assemblage pour MPLAB ***********

list p=16f84A
#include p16f84A.inc
__Config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
;.............................................................




;******************** Variables utilisées ****************

var1 equ C
#define bphaut
#define bpbas
#define fchaut
#define fcbas


;********** Numero de version / données EEPROM ***********

ORG h'2100'
de "Version 1.0"

;************* definition des registres temporaires **********

retard1 EQU 0X0C ;le registre temporaire retard1 se trouve a l'adresse 0C
retard2 EQU 0X0F ;""""""""""""""""""""""""""""""""""""""""""""""""""""" 0F
retard3 EQU 0x10 ;""""""""""""""""""""""""""""""""""""""""""""""""""""" 0X10

;***************** Programme principal *******************

ORG 0
GOTO init

;*********** Sous Programme d 'interruption **********

ORG 4

;*********** IT sur RB4-RB7***********************************

bsf PORTA,0 ; on allume la led connectée sur ra0
call tempo
bcf PORTA,0
bcf INTCON,RBIF ; on raz le flag RBIF
bcf INTCON,RBIE
retfie ; retour d 'interruption


; *********** Programme d' INIT ***********************

init


bsf INTCON,GIE ; autorise les Interruptions
bsf INTCON,RBIE ; autorise l ' IT sur RB4-RB7
bsf STATUS,5 ; on met à 1 le 5eme bit du registre status pour accéder
; à la 2eme page mémoire ( pour trisa et trisb )
MOVLW B'11111100' ; programmation de rb0-rb7
MOVWF TRISB ; on met 11110000 dans le registre de direction du port B
MOVLW B'00110' ; programmation de ra0-ra4
MOVWF TRISA ; on met 00000 dans le registre de direction du port A
bcf STATUS,5 ; on remet à 0 le 5eme bit du registre status pour accéder
; à la 1eme page mémoire
clrf PORTA ; raz du port A
clrf PORTB ; raz du port B


; ***************** Début de votre Programme ***********************






;****************** Programme de temporisation ***********************


; modifier les valeurs dans retard1 retard2 et retard3 pour changer la temporisation

tempo
MOVLW 0xFF ; on met ff dans le registre W (selon la tempo souhaitée)
MOVWF retard1 ; on met W dans le registre retard1
MOVWF retard2 ; on met W dans le registre retard2
MOVLW 0x12 ; on met 12 dans le registre W (selon la tempo souhaitée)
MOVWF retard3 ; on met W dans le registre retard3
attente
DECFSZ retard1,F ; on décrémente retard1 et on saute la prochaine instruction si
GOTO attente ; le registre retard1 = 0 sinon retour à attente
movlw 0xFF ; on recharge retard1 (selon la tempo souhaitée)
movwf retard1
DECFSZ retard2,F ; on décrémente retard2 et on saute la prochaine instruction si
GOTO attente ; le registre retard2 = 0 sinon retour à attente
movlw 0xFF ; on recharge retard2 (selon la tempo souhaitée)
movwf retard2
DECFSZ retard3,F ; on décrémente retard3 et on saute la prochaine instruction si
GOTO attente ; le registre retard3 = 0 sinon retour à attente
RETURN ; retour au programme principal après l 'instruction CALL

end ; fin du programme
spedy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 18h08   #4
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
difficile d'attaquer la programmation assembleur sans notion de boucle infinie.

il faut toujours un programme principal (souvent appelé kernel sur les PC) qui puisse tourner en permanence.

pour ça, rien de compliqué:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
org 0
reset:
call init
goto main
align 4
;;;;;;;;;;;;
irq:
;code pour l'interruption
retfie
;;;;;;;;;;;;
init:
;code d'initialisation
return
;;;;;;;;;;;;
main:
;code principal
call routine1
call routine2
call routine3
goto main
;;;;;;;;;;;;
routine1:
code de la routine1
return
;;;;;;;;;;;;
routine2:
etc, etc....
avec une structure de programme de ce genre, la lecture est simplifiée, et surtout, il ne faut pas hesiter à indenter les commentaires, parce que là, c'est illisible, à moins que tu n'utilise pas la bonne balise pour afficher ton code.

ps: la syntaxe ici est celle de fasm, avec les macros pour compiler du pic.
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h25.


 
 
 
 
Partenaires

Hébergement Web