Bonjour,
j'ai maintenant un peu d'expérience avec les PICs, que jusqu'ici j'ai toujours codé en C, et maintenant je me suis mis à l'assembleur. J'ai donc suivi les cours de Bigonoff ainsi que ses petits exerces. Afin de mettre ca en pratique j'ai décider de faire mon premier projet en assembleur à base d'un PIC16F876. Ce programme est à priori simple pour l'instant: il ne contient que les initialisations, une boucle principale quasiment vide, et une boucle infinie dans l'interruption.
Si je supprime la ligne " bsf OPTION_REG , GIE ; Autorise interruptions générales" ( presque tout à la fin ), les PINs du port B en entrée sont à +5V, mais si je remets cette ligne, les entrées en question sont dans le vide, et si je mets dans la boucle auto "bsf LDAUTOMANU", la LED en question ne s'allume pas.Code:;***************************************************************************** ; * ; Système d'ambiance à LEDs * ; * ;***************************************************************************** ; Codeur: NonoxX * ; Création du projet le: 16/03/2010 * ; Date de dernière modification: 16/03/2010 * ; Numéro de version: 0.1 alpha * ;***************************************************************************** ; TODO List : * ; - Tout * ;***************************************************************************** ; Notes: * ; * ; * ;***************************************************************************** LIST p=16F876 ; Choix du composant (PIC16F876) #include <p16F876.inc> ; Inclusion du fichier correspondant __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_ON & _HS_OSC ;***************************************************************************** ; ASSIGNATIONS SYSTEME * ;***************************************************************************** ; REGISTRE OPTION_REG (configuration) ; ----------------------------------- OPTIONVAL EQU B'01000111' ; RBPU b7 : 1= Résistance rappel +5V hors service ; INTEDG b6 : 1= Interrupt sur flanc montant de RB0 ; 0= Interrupt sur flanc descend. de RB0 ; TOCS b5 : 1= source clock = transition sur RA4 ; 0= horloge interne ; TOSE b4 : 1= Sélection flanc montant RA4(si B5=1) ; 0= Sélection flanc descendant RA4 ; PSA b3 : 1= Assignation prédiviseur sur Watchdog ; 0= Assignation prédiviseur sur Tmr0 ; PS2/PS0 b2/b0 valeur du prédiviseur ; 000 = 1/1 (watchdog) ou 1/2 (tmr0) ; 001 = 1/2 1/4 ; 010 = 1/4 1/8 ; 011 = 1/8 1/16 ; 100 = 1/16 1/32 ; 101 = 1/32 1/64 ; 110 = 1/64 1/128 ; 111 = 1/128 1/256 ; REGISTRE INTCON (contrôle interruptions standard) ; ------------------------------------------------- INTCONVAL EQU B'00010000' ; GIE b7 : masque autorisation générale interrupt ; ne pas mettre ce bit à 1 ici ; sera mis en temps utile ; PEIE b6 : masque autorisation générale périphériques ; T0IE b5 : masque interruption tmr0 ; INTE b4 : masque interuption RB0/Int ; RBIE b3 : masque interruption RB4/RB7 ; T0IF b2 : flag tmr0 ; INTF b1 : flag RB0/Int ; RBIF b0 : flag interruption RB4/RB7 ; REGISTRE PIE1 (contrôle interruptions périphériques) ; ---------------------------------------------------- PIE1VAL EQU B'00000000' ; PSPIE b7 : Toujours 0 sur PIC 16F786 ; ADIE b6 : masque interrupt convertisseur A/D ; RCIE b5 : masque interrupt réception USART ; TXIE b4 : masque interrupt transmission USART ; SSPIE b3 : masque interrupt port série synchrone ; CCP1IE b2 : masque interrupt CCP1 ; TMR2IE b1 : masque interrupt TMR2 = PR2 ; TMR1IE b0 : masque interrupt débordement tmr1 ; REGISTRE PIE2 (contrôle interruptions particulières) ; ---------------------------------------------------- PIE2VAL EQU B'00000000' ; UNUSED b7 : inutilisé, laisser à 0 ; RESERVED b6 : réservé, laisser à 0 ; UNUSED b5 : inutilisé, laisser à 0 ; EEIE b4 : masque interrupt écriture EEPROM ; BCLIE b3 : masque interrupt collision bus ; UNUSED b2 : inutilisé, laisser à 0 ; UNUSED b1 : inutilisé, laisser à 0 ; CCP2IE b0 : masque interrupt CCP2 ; REGISTRE ADCON1 (ANALOGIQUE/DIGITAL) ; ------------------------------------ ADCON1VAL EQU B'00000010' ; PORTA en mode analog ; ADFM b7 : Justifier à droite (1) ou gauche (0) ; UNUSED b6 ; UNUSED b5 ; UNUSED b4 ; PCFGx b3..b0 : Configuration des ports (Analog / Digital) (ici AN0..AN4 en analog) ; DIRECTION DES PORTS I/O ; ----------------------- DIRPORTA EQU B'00111111' ; Direction PORTA (1=entrée) DIRPORTB EQU B'11111011' ; Direction PORTB DIRPORTC EQU B'11111111' ; Direction PORTC ;***************************************************************************** ; ASSIGNATIONS PROGRAMME * ;***************************************************************************** ; Pour le moment aucune ;---------------------- ;***************************************************************************** ; DEFINES * ;***************************************************************************** ; Boutons ;-------- #define BOUTONAM PORTB, 0 ; Bouton Auto/Manu #define BOUTONPROG PORTB, 1 ; Bouton Programmation/fonctionnement ; Voyants ;-------- #define LEDAUTOMANU PORTB, 2 ; Voyant mode ;***************************************************************************** ; MACROS * ;***************************************************************************** ; Changement de banque ;--------------------- BANK0 macro ; Passage en banque 0 bcf STATUS, RP0 bcf STATUS, RP1 endm BANK1 macro ; Passage en banque 1 bsf STATUS, RP0 bcf STATUS, RP1 endm BANK2 macro ; Passage en banque 2 bcf STATUS, RP0 bsf STATUS, RP1 endm BANK3 macro ; Passage en banque 3 bsf STATUS, RP0 bsf STATUS, RP1 endm ;******************************************************************************* ; VARIABLES BANQUE 0 * ;******************************************************************************* CBLOCK 0x20 tempo_rebond : 1 ; Tempo rebond endc ;******************************************************************************* ; VARIABLES COMMUNES * ;******************************************************************************* CBLOCK 0x70 STATUS_temp : 1 W_temp : 1 FSR_temp : 1 PCLATH_temp : 1 flags1 : 1 ; Flags: ; b0: Mode: manu(1) auto (0) ; b1: Tempo rebond: rebond en cours (1) pas de rebond (0) endc ;******************************************************************************* ; DEMARRAGE SUR RESET * ;******************************************************************************* ORG 0x000 goto init ;/////////////////////////////////////////////////////////////////////////////// ; INTERRUPTIONS ;/////////////////////////////////////////////////////////////////////////////// ORG 0x004 bcf OPTION_REG, GIE ; Sauvegarder l'etat du PIC ;-------------------------- movwf W_temp ; Sauvegarde de W swapf STATUS, w ; Swap STATUS résultat dans W movwf STATUS_temp ; Sauvegarde du status "Swappé" movf FSR , w ; Chargement de FSR movwf FSR_temp ; Sauvegarde de FSR movf PCLATH , w ; Chargement de PCLATH movwf PCLATH_temp ; Sauvegarde de PCLATH clrf PCLATH ; Les interruptions sont en page 0 BANK0 ; On se met en banque 0 test bsf LEDAUTOMANU bcf INTCON, INTF goto test ; Restaurer l'etat du PIC ;------------------------ restoreint movf FSR_temp, w ; Chargement de FSR_temp movwf FSR ; On redonne à FSR sa valeur movf PCLATH_temp, w ; Chargement de PCLATH_temp movwf PCLATH ; On redonne à PCLATH sa valeur swapf STATUS_temp, w ; Chargement de STATUS_temp et remise dans l'ordre movwf STATUS ; On redonne sa valeur à STATUS swapf W_temp, f ; Swap de w_temp, valeur dans lui-même swapf W_temp, w ; Re-swap de w_temp, valeur dans w sans affecter status retfie ; Retour d'interruption ;/////////////////////////////////////////////////////////////////////////////// ; PROGRAMME ;/////////////////////////////////////////////////////////////////////////////// ;******************************************************************************* ; INITIALISATIONS * ;******************************************************************************* init ; Initialisation des ports ;------------------------- BANK0 ; Passage en banque 0 clrf PORTA ; Remise à zéro du port A clrf PORTB ; Remise à zéro du port B clrf PORTC ; Remise à zéro du port C BANK1 ; Passage en banque 1 movlw ADCON1VAL ; Chargement du masque d'ADCON1 movwf ADCON1 ; Chargement de ADCON1 movlw DIRPORTA ; Direction port A movwf TRISA ; Chargement dans TRISA movlw DIRPORTB ; Direction port B movwf TRISB ; Chargement dans TRISB movlw DIRPORTC ; Direction port C movwf TRISC ; Chargement dans TRISC ; Initialisation du registre d'options ;------------------------------------- movlw OPTIONVAL ; Chargement du masque d'OPTION_REG movwf OPTION_REG ; Chargement de OPTION_REG ; Initialisation des registres d'interruption ;-------------------------------------------- movlw INTCONVAL ; Chargement du masque de INTCON movwf INTCON ; Chargement de INTCON movlw PIE1VAL ; Chargement du masque de PIE1 movwf PIE1 ; Chargement de PIE1 movlw PIE2VAL ; Chargement du masque de PIE2 movwf PIE2 ; Chargement de PIE2 ; Effacement de la RAM banque 0 ;------------------------------ BANK0 ; Passage banque 0 movlw 0x20 ; initialisation pointeur movwf FSR ; d'adressage indirect init1 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant btfss FSR,7 ; tester si fin zone atteinte (>7F) goto init1 ; non, boucler ; Initialisation des interruptions ;---------------------------------- BANK1 ; Passage banque 1 bsf OPTION_REG , GIE ; Autorise interruptions générales bcf LEDAUTOMANU ; Eteindre la LED auto clrwdt goto auto END
J'imagine que mon problème est basique, mais je n'arrive pas a voir ce qui cloche.
Si quelqu'un voit ce qu'il y a, merci d'avance!
-----