Programació en pic-as del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Exemple NS - Fem sonar notes musicals

En aquest exemple farem sonar unes notes musicals en un brunzidor piezoelèctric o un altaveu.

El següent programa toca la seqüència do - re - mi, fa una pausa de 0,2 s i la torna a tocar.

PROCESSOR 16F690
#include <xc.inc>
config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
numbuc EQU 0x20  ; Nombre de bucles per fer 0,2 s
bucles EQU 0x21  ; Comptador de bucles
numcicL EQU 0x22  ; Nombre de cicles de 771 us
numcicC EQU 0x23  ; Nombre de cicles de 3 us
port EQU 0x24  ; Variable per gestionar el port C
Retard1 EQU 0x25  ; Variables de retard	
Retard2 EQU 0x26
PSECT code, class=CODE, delta=2, abs
main:
  bsf  RP0  ; Tria el banc 1
  clrf  TRISC  ; Tot el port C és de sortida
  bcf  RP0  ; Tria el banc 0
  clrf  port  ; Desactiva les sortides del port C
  clrf  PORTC  ; Desactiva les sortides del port C
Bucle:
  movlw  105  ; Valors que correspon aproximadament a do3
  movwf  numbuc  ; Nombre de bucles per fer 0,2 s
  movlw  2
  movwf  numcicL  ; Nombre de cicles de 771 us
  movlw  120
  movwf  numcicC  ; Nombre de cicles de 3 us
  call  TocaNota  ; Toca la nota configurada
  movlw  117  ; Valors que correspon aproximadament a re3
  movwf  numbuc  ; Nombre de bucles per fer 0,2 s
  movlw  2
  movwf  numcicL  ; Nombre de cicles de 771 us
  movlw  50
  movwf  numcicC  ; Nombre de cicles de 3 us
  call  TocaNota  ; Toca la nota configurada
  movlw  132  ; Valors que correspon aproximadament a mi3
  movwf  numbuc  ; Nombre de bucles per fer 0,2 s
  movlw  1
  movwf  numcicL  ; Nombre de cicles de 771 us
  movlw  245
  movwf  numcicC  ; Nombre de cicles de 3 us
  call TocaNota  ; Toca la nota configurada
  call RetM  ; Espera 0,2 s
  goto Bucle
;
; Funció per tocar una nota
;   numbuc	Nombre de bucles per fer 0,2 s
;	numcicL	Nombre de cicles de 771 us
;	numcicC	Nombre de cicles de 3 us
; Aquestes tres variables no es modifiquen
TocaNota:
  movf numbuc,w  ; Nombre de cops que ho hem de repetir
  movwf bucles  ; Variable per comptar-los
TN0:
  movlw 00100000B  ; RC5 correspon al brunzidor
  xorwf port,f  ; Inverteix el bit
  movf port,w  ; Agafa port
  movwf PORTC  ; i ho copia al port C
  ; Retard de numcicL x 771 us
  movf numcicL,w  ; Nombre de cicles que cal fer
  movwf Retard2
  btfsc ZERO  ; Mira si és zero
  goto TN2  ; No fem aquest retard
TN1:
  decfsz Retard1,f
  goto TN1
  decfsz Retard2,f
  goto TN1
TN2:
  ; Retard de numcicC x 3 us
  movf numcicC,w  ; Nombre de cicles que cal fer
  movwf Retard1
  btfsc ZERO  ; Mira si és zero
  goto TN2  ; No fem aquest retard
TN3:
  decfsz Retard1,f
  goto TN3
TN4:
  decfsz bucles,f
  goto TN0
  ; Fi del bucle
  bcf port,5  ; En acabar, deixem la sortida desactivada
  movf port,w  ; Agafa port
  movwf PORTC  ; i ho copia al port C
  return
RetM:  ; Funció de retard de 0,2 s
  decfsz Retard1,f		
  goto RetM		
  decfsz Retard2,f	
  goto RetM
  return
END main

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.