Autor Tema: Programa que encienda un led, pero con...  (Leído 1391 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Lazarov

  • PIC10
  • *
  • Mensajes: 4
Programa que encienda un led, pero con...
« en: 18 de Octubre de 2004, 19:25:00 »
Hola a todos, queria ver si pueden ayudar a corregir un programa de un ADC0831 con el 16f84, el problema es que no me detecta el ADC. O si tienen uno que controle los pulsos de un led con un potenciometro. Este es el codigo:

;=======ADC831.ASM============================Rex N. Fisher===4/15/98=====

;Adaptation of a program originally published as an application note by
;Parallax, Inc.  

;This program demonstrates the use of an external serial ADC (National
;ADC0831) with the PIC16C84 microcontroller.  A variable voltage (0-5V) at
;pin 2 of the ADC controls the blinking rate of an LED connected to pin 2
;of the PIC.

;Hardware connections:
;
;    *Pin 1 (RA2) to pin 1 of ADC
;    *Pin 2 (RA3) to 470 ohm (470 to diode anode, diode cathode to GND)
;    *Pin 3 (RTCC) to +5V
;    *Pin 4 (_MCLR) to +5V
;    *Pin 5 (Vss) to GND
;    *Pin 6 (RB0) n/c
;    *Pin 7 (RB1) n/c
;    *Pin 8 (RB2) n/c
;    *Pin 9 (RB3) n/c
;    *Pin 10 (RB4) n/c
;    *Pin 11 (RB5) n/c
;    *Pin 12 (RB6) n/c
;    *Pin 13 (RB7) n/c
;    *Pin 14 (Vdd) to +5V
;    *Pin 15 (OSC2) to pin 3 of ceramic resonator
;    *Pin 16 (OSC1) to pin 1 of resonator (pin 2 of resonator to GND)
;    *Pin 17 (RA0) to pin 7 of ADC
;    *Pin 18 (RA1) to pin 6 of ADC
;
;    Notes:         Pin 2 of ADC is 0 - 5V input.
;                   Pin 3 & pin 4 of ADC to GND.
;                   Pin 5 & pin 8 of ADC to +5V.

;Theory of operation
;
;    One or more external analog-to-digital converters (ADC) can be
;    connected to the PIC16C84.  A single ADC0831 is used here.
;
;    Interafacing the ADC831 requires only three I/O lines, and of these,
;    two can be multiplexed with other functions (or additional ADC831s).
;    Only the chip-select (CS) pin requires a dedicated line.  The
;    ADC"s range of input voltages is controlled by Vref and Vin(-) pins.
;    Vref sets the voltage at whivh the ADC will return a full-scale
;    output of 255 (Ffh), while Vin(-) sets the voltage that will
;    return 0.
;
;    In this example, Vin(-) is at ground and Vref is at +5V; however
;    these values can be as close together as 1 volt without harming
;    accuracy or linearity.  Diode voltage references or trim pots may
;    be used to set these values.
;
;    This program reads the voltage at the ADC831"s input pin and uses
;    the 8-bit result to control a timing routine that flashes an LED.
;    The LED flashes slowly when the input is +5V, and very rapidly as
;    it approaches ground.
;
;    The subroutine "Convert" handles the details of getting data out of the
;    ADC.  It enables the ADC by pulling the CS line low, then pulses the
;    clock line (CLK) to signal the beginning of a conversion.  The program
;    then enters a loop in which it pulses CLK, gets the bit on pin DAT,
;    and shifts it into the received byte using the rotate left (rlf)
;    instruction.  Remember that rlf shifts the carry bit into the LSB of
;    the specified register (and the MSB back into the carry bit).
;
;    When all bits have been shifted into the byte, the program turns off
;    the ADC by returning CS high.  The subroutine returns with the
;    conversion result in the variable AD_RSLT.  The value of AD_RSLT is
;    moved to COUNT1 and determines the length of the delay loop (blink
;    rate).

;Possible modifications:
;
;    More ADC831"s can be added to the circuit.  Connect each additional
;    ADC to the same clock and data lines, but assign separate CS pins.
;    Modify the "Convert" subroutine to take the appropriate CS pin low
;    when it needs to acquire data from a particular ADC.


;=======Programming Instructions===========================================

;Select the following settings at time of programming:

;    Device = 84
;    Oscillator = XT
;    Watchdog = OFF
;    Timer = ON
;    Code Protect = OFF


;=======Program Hierarchy================================================

;    Main
;         Initialize
;         Blink
;         Wait
;              Convert


;=======Header Section===================================================

;Select PIC16C84 processor and default radix.

     LIST   p=16F8A4   ;Assemble for specific features of PIC16F84.
     radix      HEX     ;Default number system is hexadecimal.

;P16C84.INC defines configurations, registers, and other useful bits of
;information for the PIC16F84 microcontroller.  The names assigned to registers
;and pins match the Microchip data sheets as closely as possible.

     include <P16F84A.INC>


;=======Equate Section===================================================

;Register equates:

SRAM      equ  0C                  ;RAM locations (GP registers) start at 0Ch.
RA        equ  05                  ;RA is another name for PORTA.
RB        equ  06                  ;RB is another name for PORTB.

;Bit equates:

CLK       equ  0                   ;Bit 0 of RA (ADC clock).
DAT       equ  1                   ;Bit 1 of RA (ADC data).
CS        equ  2                   ;Bit 2 of RA (ADC chip select).
LED       equ  3                   ;Bit 3 of RA (LED).


;=======Variable Section==================================================

     cblock    SRAM           ;Assign variable names to data memory locations.
                              ;starting at the address defined by SRAM.

               COUNT0         ;Counter for delay loop.
               COUNT1         ;Counter for delay loop.
               COUNT2         ;Counter used to read 8 data bits from ADC.
               AD_RSLT        ;Result of A/D conversion.
     Endc                     ;End of data memory assignments.


;=======Vector Section===================================================

     org  00                       ;Program memory locations start at 00h.
                                   ;Reset vector is 00h.  Start here after reset.
     goto Main                     ;Branch to program (starting at Main).

     org  05                       ;Interrupt vector is 04h.
Int                                ;Start here after interrupt.
     goto Int                      ;Endless loop (stops program on interrupt).


;=======Table Section====================================================

;No tables for this program.


;=======Program Section==================================================

Main                               ;Start program here.
     call Initialize               ;Initialize variables and registers.

Blink                              ;Toggle the LED on and off.
     movlw     B"00001000"         ;Create bit mask for bit 3 (RA.3 = LED).
     xorwf     RA,F                ;Invert output bit to LED.
     call      Wait                ;Variable delay depending on ADC data.
     goto      Blink               ;Go toggle the LED again.


;-----------Initialize Subroutine-------------------------------------------------------------------------------
;
;Zero variables and configure I/O pins.

Initialize

     ;Clear variables.

     clrf COUNT0
     clrf COUNT1
     clrf COUNT2
     clrf AD_RSLT

     ;Clear RA and RB before setting direction.

     clrf RA
     clrf RB

     ;Set direction register for RA and RB.

     bsf      STATUS,RP0         ;Access bank 1 of register files.
     movlw      B"00000010"         ;Make bit 1 an input, others are outputs.
     movwf      TRISA               ;Program I/O bits of RA.
     movlw      B"00000000"         ;Make all bits outputs.
     movwf      TRISB               ;Program I/O bits of RB.
     bcf        STATUS,RP0          ;Return to bank 0 of register file.


     return


;-----------Wait Subroutine-----------------------------------------------------------------------------------
;
;Determine the blinking speed of the LED, which depends on the data received
;from the ADC.  If the input voltage to the ADC is high (close to +5V), the
;8-bit data value is large and the blink rate is slow.  The blink rate becomes
;faster as the input voltage to the ADC is reduced, and the 8-bit data value
;becomes smaller.

Wait
     call      Convert      ;Get result of A/D conversion & put in AD_RSLT.
     
     ;Put data from ADC (AD_RSLT) into COUNT1.

     movf      AD_RSLT,W      
     movwf     COUNT1

     ;Add 1 to COUNT1 to prevent underflow when AD_RSLT = 0.

     movlw     01
     addwf     COUNT1,F


Delay                           ;Produce a time dleay that depends on the data
                                ;from the ADC, which was previously put into
                                ;COUNT1

     ;The delay determined by COUNT0 is fixed at 0FFh (256d) loops.
     
     decfsz    COUNT0,F         ;Decrement COUNT0.  Decrement COUNT0 again if
     goto      Delay            ;COUNT0 is not equal to 0.  Fall through if
                                ;COUNT0 is equal to 0.

     ;The delay determined by COUNT1 is dependent upon the A/D conversion
     ;result, which was put into COUNT1.
     
     decfsz    COUNT1, F        ;Decrement COUNT1.  Go back and decrement
     goto      Delay            ;COUNT0again if COUNT1 is not equal to 0.
                                ;Fall through if COUNT is equal to 0.

     return


;-----------Convert Subroutine-------------------------------------------------------------------------------
;
;Enable the ADC, signal the ADC to begin a data conversion, read the ADC data
;one bit at a time, put the 8-bit data value into AD_RSLT, disable the ADC.

Convert
     bcf     RA,CS        ;Clear pin 2 of RA (CS) to enable ADC.

     ;Set up COUNT2 for eight data bits from ADC to be moved into AD_RSLT.

     movlw        08
     movwf        COUNT2

     ;Pulse CLK pin of ADC to signal the beginning of a conversion.

     bsf     RA,CLK       ;Set CLK to 1.
     nop                  ;Hold 1 on CLK (necessary if PIC clock >4MHz).
     bcf     RA,CLK       ;Reset CLK to 0.

     clrf    AD_RSLT      ;Clear register before reading new ADC data.

Read_Bit                  ;Pulse CLK to read data bit from ADC,
                          ;read the data bit, and shift it into AD_RSLT
                          ;Repeat 8 times to read the entire data byte.

     bsf     RA,CLK     ;Set CLK to 1.
     nop                  ;Hold 1 on CLK (necessary if PIC clock >4MHz).
     bcf     RA,CLK       ;Reset CLK to 0.

     ;Read data bit from ADC and set carry bit equal to the data bit.

     btfss        RA,DAT       ;Is data bit equal to 1?
     bcf     STATUS,C     ;Clear carry bit equal to 0?
     btfsc        RA,DAT       ;Is data bit equal to 0?
     bsf     STATUS,C     ;Set carry bit if data bit is not equal to 0.

     ;Put data bit into AD_RSLT and go get next data bit.

     rlf     AD_RSLT,F    ;Shift carry bit (equal to ADC data bit)
                          ;into AD_RSLT.
     decfsz       COUNT2,F     ;Decrement COUNT2.
     goto    Read_Bit     ;Read 8 bits (until COUNT2 = 0).
                          ;Fall through loop after all 8 bits are read.

     bsf     RA,CS             ;Set pin 2 of RA (CS) to disable ADC.

     return
     
     end            ;End of program.


;=====================================================================

Gracias por su ayuda.