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 avec le Timer 0 sur PIC 16F88
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:03

Sur l'utilisation du Timer0.
Une led qui clignote sur A0, à partir de cette base on peut faire plein de trucs. Cette fois elle clignotte avec le Timer0.

Code : Tout sélectionner

;**********************************************************************
;
                                                                    
;             Led clignotante avecr TIMER0
;                                                                     
;                                                                     
;**********************************************************************


    List p=16F88                     
    
#include <p16F88.inc>

    __CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF  & _XT_OSC 
    __CONFIG    _CONFIG2
, _IESO_OFF & _FCMEN_OFF 


OPTIONVAL    EQU    H
'0087'        ; Valeur registre option, Prescaler à 256
MasqueIntcon    EQU    H
'00A0'     ; réglage interruptions Timer0


#DEFINE LED    PORTA,0             

BANK0    macro
    bcf    STATUS 
, RP0        
    endm

BANK1    macro
    bsf    STATUS 
, RP0        
    endm

    CBLOCK 0x00C               
    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 TIMER 0                            
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                
; passer banque1
    movlw    OPTIONVAL        
    movwf    OPTION_REG        
    clrf    ANSEL            
; broches toutes en I/O
    movlw    b
'00000000'
    movwf    TRISA
    movwf    TRISB
    BANK0                

    movlw    MasqueIntcon        
; masque interruption
    movwf    INTCON            
; charger interrupt control

    movlw    d
'7'            
    movwf    cmpt            

; -----------------------------------
main

    nop
    nop
    nop
    goto main            
; boucler

    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 2 invités