Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

pb assembleur



  1. #1
    Dreux28

    pb assembleur

    Bonjour à tous,

    J'expose mon pb, tout d'abord je travail avec un pic12F629, je voudrai faire un programme en assembleur (et non en C) permettant plusieurs choses le tout dans des routines d'interruptions :
    -scruter l'état d'un bouton poussoir ;
    -envoyer une fréquence pendant 45 min
    -pendant l'envoi de la fréquence gérer par la même (pendant donc 45 min !) l'alim d'un autre composant (sortie du pic à 1 pendant la durée de la tempo)

    J'utilise GP4 pour le poussoir, GP5 pour l'alim commandé et GP2 pour la fréquence
    Le problème est donc que pour la programmation j'ai que certaine base !
    Ce que je sais c'est qu'au niveau de ma fréquence j'utilise l'osc interne du pic (4MHz) donc j'utilise le prédiviseur de 2 et le timer0 pour généré un signal d'environ 1000 Hz (977) donc vu que la fréquence de l'interruption sera de 2kHz je compte diviser cette fréquence par 20 (ce qui nous donne lé centième de seconde) puis par 100 (les secondes) puis par 60 (les minutes) donc après avec un compteur compté jusqu'à 45 (durée de la tempo).

    Donc ce que j'aimerai c'est avoir des idées de programmation en tant que telle
    parce que la datasheet du pic est un peu incompréhensible pour moi (pas très fort en anglais malheureusement!)

    Voila j'espère que mon roman ne vous a pas décourager à me répondre !
    Merci d'avance

    -----


  2. #2
    vincent66

    Re : pb assembleur

    Helo!
    A priori pour une telle temporisation tu aurais meilleur temps d'utitliser un PIC doté d'un oscillateur secondaire qui te permette d'utiliser un quartz d'horlogerie de 32768 Hertz, qui te simplifiera énormément la programmation...
    Je vais vérifier dans mes datasheets si ceci est possible avec le 16F629 et te tiens au courant.
    A ton service !

    Vincent

  3. #3
    vincent66

    Re : pb assembleur

    Hello !
    Désolé pour ma méprise, il s'agit bien du 12F629, et non du 16...
    Le timer1 permet en effet d'utiliser un quartz 32768 Hz.
    Sinon, le registre OSCCAL permet d'ajuster l'oscillateur interne 4MHz, qui est déjà calibré d'usine à 1%.

    Vincent

  4. #4
    Dreux28

    Re : pb assembleur

    Bonjours à tous
    Alors voila mon programme est fini (j'ai enfin réussi, enfin je crois) donc j'en fait profiter tout le monde et vu que je ne l'ai pas encore testé physiquement si vous voyaient des incohérences faite moi signe !


    Code:
    ;**********************************************************************
    ;                                                                     *
    ;    Filename:	    minuterie_RF.asm                                  *
    ;    Date:                                                            *
    ;    File Version:                                                    *
    ;                                                                     *
    ;    Author: 		                                  *
    ;    Company: 		                                         *
    ;                                                                     *
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    Files required: p12f629.inc                                      *
    ;                                                                     *
    ;                                                                     *
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    Notes: minuterie sans fils avec porteuse à 433,92 MHz et         *
    ;           information modulée à la fréquence de 977 Hz (carré)      *
    ;           =>prédiviseur par 2 et utilisation de l'interruption      *
    ;           du timer0 (tour complet).                                 *
    ;                                                                     *
    ;**********************************************************************
    
    	list      p=12f629            ; list directive to define processor
    	#include <p12f629.inc>        ; processor specific variable definitions
    
    	errorlevel  -302              ; suppress message 302 from list file 
    
    	__CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT  
    					;   Oscillateur -------- interne
                        ;   MCLR --------------- désactivé
                        ;   "WatchDogTimer" ---- désactivé
                        ;   "Power up Timer" --- désactivé
                        ;   "Brown out detect" - désactivé
    
    ; '__CONFIG' directive is used to embed configuration word within .asm file.
    ; The lables following the directive are located in the respective .inc file.
    ; See data sheet for additional information on configuration word settings.
    
    
    
    
    ;***** VARIABLE DEFINITIONS
    			cblock	0x20
    w_temp							; variable used for context saving 
    status_temp 					; variable used for context saving
    centieme						; compteur de centièmes de seconde
    seconde							; compteur de secondes
    minute							; décompteur de minutes
    cpt_init						; compteur avant les centièmes
    cpt_app							; décompteur d'appuie sur bouton poussoir
    			endc
    
    #define		bp_appui			GPIO,4
    #define		alim_emetteur		GPIO,5
    #define		frequence_emise		GPIO,2
    #define		valeur_init_timer	d'0'
    #define		flag_it0			INTCON,T0IF	; flag du débordement du timer0
    #define		flag_it1			
    #define		flag_it2			
    #define		dir_gp				b'011000'  
    								; 0-----> GP5   , GP5 en sortie (alim émetteur)
                    				; -1----> GP4   , GP4 en entrée (bouton poussoir)
                    				; --1---> GP3   , GP3 en entrée (MCLR)  
                   					; ---0--> GP2   , GP2 en sortie (PWM)
                   					; ----0-> GP1   , GP1 en sortie
                  					; -----0> GP0   , GP0 en sortie	
    
    #define 	DUREE_MINUTERIE		d'45'
    
    
    ;**********************************************************************
    		ORG     0x000             ; processor reset vector
    		goto    main              ; go to beginning of program
    charge_tempo
    		retlw	DUREE_MINUTERIE  ; sauvegarde dans W la valeur de DUREE_MINUTERIE
    
    
    		ORG     0x004             ; interrupt vector location
    		movwf   w_temp            ; save off current W register contents
    		movf	STATUS,w          ; move status register into W register
    		movwf	status_temp       ; save off contents of STATUS register
    
    
    ; isr code can go here or be located as a call subroutine elsewhere
    		btfsc	flag_it0		; routine d'interruption génération de fréquence
    		call	traite_it0
    
    		movf    status_temp,w   ; retrieve copy of STATUS register
    		movwf	STATUS          ; restore pre-isr STATUS register contents
    		swapf   w_temp,f
    		swapf   w_temp,w        ; restore pre-isr W register contents
    		retfie                  ; return from interrupt
    
    
    traite_it0
    		bcf		flag_it0		; met à 0 le flag_it0    
    
    ;///////////////////////////////////////////////////////////////////////////////////
    ; le timer est ici pas rechargé puisqu'on souhaite utiliser
    ; un tour complet du timer (256) afin de générer la bonne fréquence
    ;
    ; rechargement timer
    ;		movlw   valeur_init_timer        
    ;       movwf   TMR0          	; Charger TMR0 avec valeur de valeur_init_timer         
    ;///////////////////////////////////////////////////////////////////////////////////
    
    ; test temps écoulé
    		movf	minute, f		; si minute=0 -> Z=1
    		btfss	STATUS, Z		; saute une instruction si Z=0
    		goto	alim_emetteur_on       
    
    ;alimentation de l'émetteur
    alim_emetteur_off
    		bcf		frequence_emise
    		bcf		alim_emetteur	; mise à 0 de la sortie GP5
    		goto	surv_BP			
    
    alim_emetteur_on
    		bsf		alim_emetteur	; mise à 1 de la sortie GP5	
    
    ; génération de la fréquence
    gest_freq
    		movlw	b'0000100'		; garder la valeur de GP2
     		xorwf	GPIO,f			; inverse l'état de GP2
    
    ; gestion compteur temps
    		incf	cpt_init,f		; cpt_init passe à 1
    		movfw	cpt_init
    		sublw	d'19'			; 19 - W => si résultat négatif C=0
    		btfsc	STATUS,C		; 
    		goto	fin_routine     ; si C=1 (résultat >=0) goto fin_routine sinon instruction suivante
    		clrf	cpt_init		; raz de cpt_init
    		incf	centieme,f		; centieme passe à 1
    		movfw	centieme		; centieme est mis ds W
    		sublw	d'99'			; 99 - W
    		btfsc	STATUS,C		; 
    		goto	fin_routine		; si C=1 goto fin_routine sinon instruction suivante
    		clrf	centieme		; raz de centieme
    		incf	seconde,f		; seconde passe à 1
    		movfw	seconde			; seconde est mis dans W
    		sublw	d'59'			; 59 - W
    		btfsc	STATUS,C		; 
    		goto	fin_routine		; si C=1 goto fin_routine sinon instruction suivante 
    		clrf	seconde			; raz de seconde
    		decf	minute,f
    		movf	minute,f		; tempo écoulée ?
    		btfsc	STATUS,C
    		goto	alim_emetteur_off	; si fini -> couper l'alim de l'émetteur
    
    ; scrutation du bouton poussoir
    surv_BP
    		btfss	bp_appui 		; si bp appuyer bp_appui=0
    		goto	appui
    ;pas appui !
    		movlw	d'99'			
    		movwf	cpt_app			; décompteur initialisé à 99 pour test si bp appuyé pendant 100 IT => 50ms
    		goto	fin_routine
    appui
    		movf	cpt_app,f
    		btfss	STATUS,Z		; si cpt_app=0, Z=1 donc goto fin_routine
    		decfsz	cpt_app,f 		; décrémente cpt_app => si 0 goto charge_tempo
    		goto	fin_routine
    
    ; rechargement de la tempo si appui 
    recharge_tempo
    		call	charge_tempo
    		movwf	minute			; minute <- W
    		clrf	centieme		; raz centieme
    		clrf	seconde			; raz seconde	
    		clrf	cpt_init		; raz cpt_init	
    		
    ;fin de la routine d'interruption
    fin_routine		
    		return
    
    
    
    ; these first 4 instructions are not required if the internal oscillator is not used
    main
    		call    0x3FF           ; retrieve factory calibration value
    		bsf     STATUS,RP0      ; set file register bank to 1 
    		movwf   OSCCAL          ; update register with factory cal value 
    		bcf     STATUS,RP0      ; set file register bank to 0
    		movlw	0x20
    		movwf	FSR				; init adresse ram
    
    init_raz
    		clrf	INDF
    		incf	FSR,f
    		btfss	FSR,6			; fait un raz de la mémoire
    		goto	init_raz
    		
    		clrf    GPIO        	; RAZ de tous les sorties
    		bsf		STATUS,RP0		; banque 1
    		movlw	dir_gp
    		movwf	TRISIO			; direction des I/O
    		movlw	b'00000000'
                    ; 0-------> GPPU   , activer Pull-up interne
                    ; -x------> INTEDG , n/a
                    ; --0-----> T0CS   , TMR0 utilise le clock interne  
                    ; ---x----> T0SE   , n/a
                    ; ----0---> PSA    , Assigner prescaler a TMR0
                    ; -----000> PS<2:0>, Prescaler = 1:2	
    		movwf	OPTION_REG	
    		bcf		STATUS,RP0		; banque 0
    		movlw 	valeur_init_timer
    		movwf 	TMR0			; chargement de la valeur initiale du timer (tour complet d'où 0)
    		movlw	b'10100000'
                    ; 1-------> GIE , activer toutes les interruptions    
                    ; -0------> PEIE, désactiver les interruption péripherique
                    ; --1-----> T0IE, activer interruption Timer0
                    ; ---0----> INTE, desactiver interruption sur GP2/INT
                    ; ----0---> GPIE, désactiver interruption "GPIO port change"  
                    ; -----0--> T0IF, RAZ flag TMR0 "overflow"
                    ; ------0-> INTF, RAZ flag GP2/INT
                    ; -------0> GPIF, RAZ flag "GPIO port change"
    		movwf	INTCON	
    	
    ; tache de fond 
    tache_fond
    		clrwdt
    		nop
    		goto	tache_fond
    				
    
    		END                     ; directive 'end of program'

Sur le même thème :

Discussions similaires

  1. assembleur
    Par superdj76 dans le forum Électronique
    Réponses: 3
    Dernier message: 10/09/2007, 06h10
  2. exercice en assembleur
    Par Guence dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 26/05/2006, 15h03
  3. Assembleur VAX
    Par nanardo dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 02/05/2006, 07h48
  4. C ou assembleur ?
    Par KHEOPS1982 dans le forum Électronique
    Réponses: 3
    Dernier message: 08/03/2006, 20h08
  5. Assembleur
    Par vae- dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 18/02/2006, 12h21