; Auteur : Arlotto Date : 11/01/2000 ; Fichier : ex001.asm Rev : 1.1 ; Max Heise, 14.02.2002, 2100 - Namensaenderung und Verstehen ; Max Heise, 19.02.2002, 1430 - Eingang RA2, Ausgang RB0 ;----------------------------------------------------------- ; Ce petit fichier peut servir de base de départ ; pour écrire des programmes en assembleur 16F84 ; sous MPLAB pour windows ; Pour l'assembler vous devez créer un fichier projet ; contenant ce fichier ;----------------------------------------------------------- ; Fonction du programme : ; Avec un quartz de 4 Mhz, il produit des impulsions de 0.5ms au niveau 0. ; et 1ms au niveau 1 sur la sortie RB0 lorsque l'entrée RA2 est à 0. ; La sortie RB0 repasse au niveau 1 lorsque l'entrée est 1. ;----------------------------------------------------------- ; Définition du processeur utilisé ; ; one of the following list options can be supplied ; to control the assembly process or format the listing file. ; List Directive Options ; r= hex Set default radix: hex, dec, oct. ; p= None Set processor type; for example, PIC16C54. ; ; ? radix ? LIST P=16F84, R=DEC ; Positionnement des bits de configurations ; Très importants à modifier selon votre hard ici watch dog OFF ; et mode XT. Il ne vaut mieux pas utiliser le watch dog au début ; ni la protection du code. __CONFIG H'3FF1' ; XT,WDOG OFF ; 111 1111 1111 0001 p. 38 ; Woher kommt die Adresse ohne org ? ; B4: CODE PROTECTION, 1=OFF ; B3: POWER UP, 0=Enabled ; B2: WDOG, 1=Enabled ; B1-0: OSC SELECT, 01=XT, 11=RC __IDLOCS H'F055' ; __IDLOCS ? ;----------------------------------------------------------- ; Equivalences générales include "p16f84.inc" ;----------------------------------------------------------- ; Equivalences spécifiques (pour exemple) CT1 EQU .254 ; valeur décimale CT2 EQU h'BF' ; valeur en hexa CT2bis EQU 0xF1 ; valeur en hexa CT3 EQU b'00010110' ; valeur binaire ECHUE EQU 0 ; bit 0 de état START EQU 1 ; bit 1 de état ;----------------------------------------------------------- ; Réservations RAM ; les adresses de 0x00 à 0x0B sont reservées à des registres ; spécifiques au 16F84 (cf p16f84.inc + doc) ; l'adresse 0x07 n'existe pas ; les adresses 0x0C à 0x3F sont disponibles ; ? GPR register space is from 0x0c to 0x4f, see p. 13 ? org 0x0C CMPT1 RES 1 ; un octet pour compteur VAR2 RES 1 ; un autre octet TAB RES 5 ; 5 octets à partir de l'adresse TAB ; ? ;----------------------------------------------------------- ; Point d'entrée du reset org 0x00 goto Start ;----------------------------------------------------------- ; Point d'entrée des interruptions org 0x04 Isr retfie ;les it ne sont pas utilisées ;mais on met retfie par sécurité ;----------------------------------------------------------- ; Début de la tache de fond Start bsf PORTB,0 ; Mise à 1 de RB0 ; (pour que la led soit éteinte ; lors de la programmation en sortie) bsf STATUS,RP0 ; accès à bank 1 bcf TRISB,0 ; positionne la broche RB4 en sortie bcf STATUS,RP0 ; retour à bank 0 Test_en btfss PORTA,2 ; Saut de la prochaine instruction si RA2==1 ; Bit Test File Skip Set => btfss ; Skippet wenn zu testendes Bit 1 ist call Pulse ; appel du sous programme pulse (si RA2==0) goto Test_en ; retour au test de RA2 ;----------------------------------------------------------- ; Point d'entrée : Pulse ; Fonction : Produit un niveau 0 de 0.5ms sur RB0 ; suivi d'un niveau 1 pendant 1ms. ; Registres utilisés : aucun ; Taille : 6 ; Routines appelés : Tmp_05ms ;----------------------------------------------------------- Pulse bcf PORTB,0 ; RB0 <- 0 call Tmp_05ms ; attente 0.5 ms bsf PORTB,0 ; RB0 <- 1 call Tmp_05ms ; attente 1ms call Tmp_05ms retlw 0 ; ? retlw ;----------------------------------------------------------- ; Point d'entrée : Tmp_05ms ; Fonction : Cette routine réalise une attente de 0.5 ms ; Calcul des temps : (Pour un quartz de 4Mhz) ; T(µs)=1+1+(3(N-1)+2)+2= 3N+3 ; --boucle- ; donc pour 0.5ms il faut prendre N=(500-3)/3 ; Registres utilisés : CMPT1 ; Taille : 5 ; Routines appelées : aucune ;----------------------------------------------------------- N EQU (.500-3)/3 Tmp_05ms movlw N ;1µs movwf CMPT1 ;1µs Tmp_loop decfsz CMPT1,1 ;1µs si N!=0 2µs si N==0 goto Tmp_loop ;2µs retlw 0 ;2µs ;----------------------------------------------------------- ; ; --------------------------------------------------------- ; Exemple de programmation de constante dans l'EEPROM ORG H'2100' DE " Exemple.asm Arlotto 1999 " ; -------------------------------------------------------- ;----------------------------------------------------------- ; !!! ne pas oublier la directive end en fin de fichier end