Hardware
Testprint K3 monteres med resetknap,
4 MHz krystaloscillator og en lysdiode.
Note: RA4 (pin 6) har såkaldt 'open drain output'. Det betyder, at udgangen ikke selv kan levere spænding - den må tilføres udefra. Hvis RA4 skal bruges til at tænde for lysdioden, skal denne og 470 ohms modstanden forbindes mellem pin 6 og +5V. Lysdioden vil så tænde, når RA4=low.
Testprint K3 monteret til 873flash.asm
Software i assembler
;**********************************************************
; Processor: PIC16F873
at 4 MHz
; Function: Flash a
LED connected to RA0
; Hardware: Testboard
K3a
; Filename: 873flash.asm
;
Author: Lars Petersen, oz1bxm@pobox.com
; Credit: Tony Nixon's
LED flasher
;**********************************************************
LIST P=16F873, R=DEC ; Use the PIC16F873 and decimal system
#include "P16F873.INC" ; Include header file
__config _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_ON
CBLOCK 0x20
; Declare variable addresses
Loop1,Loop2
ENDC
;
; -----------
; INITIALIZE
; -----------
;
ORG 0x000
; Program starts at 0x000
;
CLRF PORTA
; Initialize port A
CLRF PORTB
; Initialize port B
CLRF PORTC
; Initialize port C
;
BSF STATUS,RP0 ; RAM bank
1
;
CLRF TRISA
; All pins port A output
CLRF TRISB
; All pins port B output
CLRF TRISC
; All pins port C output
;
; ------------------------
; FUNCTION OF PORT A
PINS
; ------------------------
;
MOVLW 6
MOVWF ADCON1
; All pins digital I/O
;
BCF STATUS,RP0 ; RAM bank
0
;
; ----------
; MAIN LOOP
; ----------
;
Main
BSF PORTA,0
; Turn on LED connected to RA0
CALL delay
BCF PORTA,0
; Turn off LED connected to RA0
CALL delay
GOTO Main
;
; ---------------
; DELAY 250 MSEC
; ---------------
;
delay MOVLW
250
MOVWF Loop1
Outer MOVLW
200
MOVWF Loop2
Inner NOP
NOP
DECFSZ Loop2,F
GOTO Inner
; Inner loop = 5 usec.
DECFSZ Loop1,F
GOTO Outer
RETURN
END
Kommentarer
I begyndelsen havde jeg faktisk
problemer med at få opstillingen til at fungere stabilt. Den første
version af programmet virkede tilsyneladende fint, men lysdioden holdt
op med at blinke, når jeg satte en finger på 16F873's hus!
Problemet skyldtes, at konfigurationsbit LVP var sat forkert - dette bit
har nemlig default værdien 1, men skal sættes til 0. Det gøres
i __config
(som vist ovenfor) eller i brænderen.
Hvis alle ben på portA skal fungere som digitale indgange eller udgange, skal man skrive værdien 6 eller 7 til registeret ADCON1. Så frakobles komperatorerne. Det sker under FUNCTION OF PORT A PINS.
Alle porte kan testes ved at udskifte
hovedløkken (MAIN
LOOP) med følgende
linier:
;
; ----------
; MAIN LOOP
; ----------
; Apply 2 Hz to all
ports
Main
MOVLW b'01010101'
MOVWF portA
MOVWF portB
MOVWF portC
CALL delay
MOVLW b'10101010'
MOVWF portA
MOVWF portB
MOVWF portC
CALL delay
GOTO Main
Download
Du kan downloade 873flash.zip
her. Filen indholder kildekoden i assembler samt hexfilen.
Tak
Jeg er blevet inspireret af Tony
Nixon's LED flasher: http://www.piclist.com/techref/microchip/16F877/flashled.htm