Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Bout de code posé là !

Modérateur : Jérémy

ASM: Hello World par Timer0 sur PIC 16F877A
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2846
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#1 Message par F6FCO » mar. 14 mai 2024 16:45

Led clignotante sur A0.

Code : Tout sélectionner



;**********************************************************************
;
                                                                    
;             Led clignotante avec TIMER0
;                                                                     
;                                                                     
;**********************************************************************


    list        p=16f877A    ; list directive to define processor
    
#include    <p16f877A.inc>    ; processor specific variable definitions
    radix dec            ; on travaille en décimal par défaut
    __CONFIG   _CP_OFF 
& _DEBUG_ON & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC 



#define LED    PORTA,0             

BANK0    macro                ; passer en banque0
    bcf    STATUS
,RP0
    bcf    STATUS
,RP1
    endm

BANK1    macro                
; passer en banque1
    bsf    STATUS
,RP0
    bcf    STATUS
,RP1
    endm

BANK2    macro                
; passer en banque2
    bcf    STATUS
,RP0
    bsf    STATUS
,RP1
    endm

BANK3    macro                
; passer en banque3
    bsf    STATUS
,RP0
    bsf    STATUS
,RP1
    endm

    cblock 0x20               
    w_temp         
: 1        ; Sauvegarde du registre W
    status_temp     
: 1        ; Sauvegarde du registre STATUS
    cmpt         
: 1            
    endc                                      

    org     0x000             
; Adresse de départ après reset
      goto    init            
; Adresse 0: initialiser

; ------------------------  Routines Interruptions                            
    
;sauvegarder registres    
    org     0x004            
; adresse d'interruption
    movwf   w_temp          ; sauver registre W
    swapf    STATUS,w        ; swap status avec résultat dans w
    movwf    status_temp        ; sauver status swappé

    ; Interrupt TIMER0
    btfsc    INTCON,TMR0IE        ; tester si interrupt timer autorisée
    btfss    INTCON,TMR0IF        ; oui, tester si interrupt timer en cours
    goto     restorereg
    call    inttimer        ; oui, traiter interrupt timer
    bcf    INTCON,TMR0IF        ; effacer flag interrupt timer
    
    ;restaurer registres
restorereg
    swapf    status_temp,w        ; swap ancien status, résultat dans w
    movwf   STATUS            ; restaurer status
    swapf   w_temp,f        ; Inversion L et H de l'
ancien W, sans modifier Z
    swapf   w_temp
,w          ; Réinversion de L et H dans W, W restauré sans modifier status
    retfie              
; return from interrupt

    
;  Routine d'interruption TIMER0                            
inttimer
    decfsz    cmpt,f            ; décrémenter compteur de passages
    return                ; pas 0, on ne fait rien
    BANK0                
    movlw    b'
00000001'        ; sélectionner bit à inverser
    xorwf    PORTA , f        ; inverser LED
    movlw    d'
7'            ; on recommence à décompter
    movwf    cmpt            
    return                ; fin d'
interruption timer
    
; ------------------------ Init

init    clrf    PORTA            
    clrf    PORTB            
    clrf    EEADR            
; diminue la consommation
    BANK1                
    movlw    H
'0087'            ; Valeur registre option, Prescaler à 256        
    movwf    OPTION_REG        
    movlw    d
'6'            ; PORTA en mode digital/analogique
    movwf    ADCON1            
; écriture dans contrôle A/D
    movlw    b
'00000000'
    movwf    TRISA
    movwf    TRISB
    BANK0                
    movlw    h
'00A0'         ; réglage interruptions Timer0
    movwf    INTCON            
; charger interrupt control
    movlw    d
'7'            
    movwf    cmpt            

; -----------------------------------
main
    goto main            

    END                

Une porte nand prend 2 bits en entrée... :eek:

Retourner vers « Recueil de mini programmes »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité