LED testprogram for 16F873

Funktion
Programmet får en lysdiode til at blinke med 2 Hz.

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



Denne side er skrevet 18-11-2001 af Lars Petersen, oz1bxm@pobox.com
Revideret 28-9-2002.

Tilbage til PIC eksperimenter