Connect with us

Correct way to program ports on 16F628A - Help

Discussion in 'Electronic Design' started by Syd, Sep 8, 2007.

Scroll to continue with content
  1. Syd

    Syd Guest

    I am trying to learn PIC assember.
    Can someone please give me the correct assembler code to program a
    16F628A with all pins on PORTA and PORTB as outputs and then toggle
    them Hi and Lo.
    My efforts to date using MPLAB has always resulted in an error.
    Thanks
    Syd
     
  2. Peter S. May

    Peter S. May Guest

    If it were the 16F88, I'd be able to help, because that's what I have.
    Either way, it seems as if the following might be a lead to what you
    want (one of the programs does exactly what you asked for):

    http://www.winpicprog.co.uk/pic_tutorial1.htm

    Don't fear the Google.
    PSM
     
  3. Here is some code that will toggle the output pins at quite a clip. IT IS
    UNTESTED, but was cut from working code, so it should work fine. ;-) I
    assume a 4MHz external crystal is connected. Watch out for line wraps from
    the comments when you copy and paste this code.


    ;---------------------------------------------------------------------------------------------
    ; HEADER:
    ;---------------------------------------------------------------------------------------------
    LIST P=16f628
    RADIX DEC
    INCLUDE "p16f628.inc"
    __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON &
    _BODEN_OFF & _LVP_OFF


    ;---------------------------------------------------------------------------------------------
    ; EQUATES:
    ;---------------------------------------------------------------------------------------------

    STARTOFRAM equ 0x20 ;First Usable RAM Location for
    16f628
    ENDOFRAM equ 0x6F ;Last Usable RAM Location for
    16f628
    FIXEDAREA equ 0x70 ;Start of shared memory
    between banks
    BANK2RAM equ 0xA0 ;Start of Bank 2 RAM

    ;---------------------------------------------------------------------------------------------
    ; General Purpose Temp Storage
    ;---------------------------------------------------------------------------------------------

    cblock STARTOFRAM
    LoopCounter
    endc

    ;---------------------------------------------------------------------------------------------
    ; Common Area Temp Storage (visible from any bank)
    ;---------------------------------------------------------------------------------------------

    cblock FIXEDAREA

    ;
    ; ISR Register Context Save Areas
    ;
    INT_FLAGS
    W_TEMP
    STATUS_TEMP
    FSR_TEMP
    PCLATH_TEMP

    endc
    ;---------------------------------------------------------------------------------------------
    ; START:
    ;---------------------------------------------------------------------------------------------
    org 0x000
    goto Start

    ; Interrupt handler
    org 0x004
    movwf W_TEMP ;Save everything
    swapf STATUS, W
    movwf STATUS_TEMP
    movfw FSR
    movwf FSR_TEMP
    movfw PCLATH
    movwf PCLATH_TEMP

    goto IntExit
    ;
    ; Restore everything and return
    ;
    IntExit
    movfw PCLATH_TEMP
    movwf PCLATH
    movfw FSR_TEMP
    movwf FSR
    swapf STATUS_TEMP, W
    movwf STATUS
    swapf W_TEMP, F
    swapf W_TEMP, W
    retfie


    ;---------------------------------------------------------------------------------------------
    ;
    ; Main level code begins here
    ;
    ;---------------------------------------------------------------------------------------------

    Start
    bsf STATUS, RP0 ; Switch to Bank 1
    movlw b'00000000' ; Define I/O on Port B (all
    output)
    movwf TRISB & 0x07F
    movlw b'00000000' ; Define I/O on Port A (all
    output)
    movwf TRISA & 0x07F
    bcf STATUS, RP0 ; Back to Bank 0

    movlw 0x07 ; Turn off the comparators
    (common newbie mistake to miss this)
    movwf CMCON

    clrf PORTA ; Drive all pins low
    initially
    clrf PORTB

    Main

    ; Drive the pins high
    movlw 0xFF
    movwf PORTA
    movwf PORTB

    ; A couple of no-ops to square up the output waveform
    nop
    nop

    ; Drive the pins low
    movlw 0x00
    movwf PORTA
    movwf PORTB

    ; Loop back forever
    goto Main

    end ; Don't forget to include
    one of these
     
  4. Anthony Fremont wrote:

    I posted the program to alt.binaries.schematics.electronic as an attachment
    since OE wrapped a bunch of the lines.
     
Ask a Question
Want to reply to this thread or ask your own question?
You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.
Electronics Point Logo
Continue to site
Quote of the day

-