Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

25/06/2011 #1


Problema sobrenatural en un 16f84a
Hola gente, necesito de su ayuda, realice un circuito con este dichoso pic y no lo pude hacer andar, esta muerto no da señales de vida.......pero....... cuando lo toco hecha a andar .

Y eso no es nada, apenas acerco el dedo sin tocarlo y voila funciona, es como si fuera un touch sin touch. Me pueden dar una mano? ya que se me acabaron las ideas.

Adjunto circuito y programa:

Código:
; File STEP.ASM ---> version 2
; ... for PIC16F84 microcontroller
; Program to use F84 as a step and direction controller for a unipolar
; step motor.  Step and direction pins are RA0, RA1; RA2, RA3; RB0-3 and RB4-7 are the windings
; in order (driven by NPN small sig transistors or MOSFETS)
; Steps on negative going edge of step pulse.

; CPU configuration
;     (It's a 16F84, RC oscillator,
;     watchdog timer off, power-up timer on)

    processor 16f84
    include      <p16f84.inc>
    __config  _RC_OSC & _WDT_OFF & _PWRTE_ON

; Declare variables

pattA    equ    H'0D'    ;Current step pattern number (0-7) for axis A
lastA    equ    H'0E'   ;Last state of step pin on axis A (1 is high, 0 is low)
pattB    equ    H'0F'    ;Current step pattern number (0-7) for axis B
lastB    equ    H'10'   ;Last state of step pin on axis B (1 is high, 0 is low)
inport    equ    H'11'    ;Value of port A when read (stored for later access)
temp    equ    H'12'

; Program

    org    0      ; start at address 0

;***************************************************
;
;    START OF PIC 16F84 CODE FOR STEP;
;
;***************************************************
;

;------------------------------------------
;****Power on reset startpoint
;------------------------------------------

;***Initialization of program    

; Set port B as output and port A as input (except bit 4)

    movlw    B'00001111'
    tris    PORTA        
    movlw    B'00000000'
    tris    PORTB        

;Clear ports and zero motors

    clrf    PORTA
    movlw    B'00010001'
    movwf    PORTB
    clrf    lastA
    clrf    lastB
    clrf    pattA
    clrf    pattB

;Loop around for a while to let everything stabilize

    movlw    d'255'
    movwf    inport
loop:    decfsz    inport, f
;    goto loop

;***Basic program loop

;Main routine - check pin states and step on negative edge
;Get port data and store, then check axis A
;A10 checks if old is 0, new is 1 (update register)
;A01 checks if old is 1, new is 0 (step and update register)
;Similarly for axis B

main:    movf    PORTA, w
    movwf    inport
A10:    btfsc    lastA, 0
    goto A01
    btfss    inport, 2
    goto A01
    bsf    lastA, 0
A01:    btfss    lastA, 0
    goto B10
    btfsc    inport, 2
    goto B10
    bcf    lastA, 0
    call stepA

B10:    btfsc    lastB, 0
    goto B01
    btfss    inport, 0
    goto B01
    bsf    lastB, 0
B01:    btfss    lastB, 0
    goto main
    btfsc    inport, 0
    goto main
    bcf    lastB, 0
    call stepB
    goto main

;------------------------------------------
;***stepA - sub to cycle axis A one half step
;  improve this later to read RA4 and choose full/halfsteps as appropriate
;  Dir of 1 is increase, else decrease

stepA:    btfss    inport, 3
    decf    pattA, f
    btfsc    inport, 3
    incf    pattA, f

;Peter Homann's optimization for add/subtract mod 7

        movlw D'07'
        andwf pattA, f

;Get step pattern and send to port B on bits 0-3

    movf    PORTB, w
    andlw    B'11110000'
    movwf    temp
    movf    pattA, w
    call dcode
    iorwf    temp, w
    movwf    PORTB

    return

;------------------------------------------
;***stepB - sub to cycle axis B one half step
;  improve this later to read RA4 and choose full/halfsteps as appropriate
;  Dir of 1 is increase, else decrease

stepB:    btfss    inport, 1
    decf    pattB, f
    btfsc    inport, 1
    incf    pattB, f

;Check for pattern overflow and fix

;Peter Homann's optimization for add/subtract mod 7

        movlw D'07'
        andwf pattB, f

;Get step pattern and send to port B on bits 4-7

    movf    PORTB, w
    andlw    B'00001111'
    movwf    temp
    swapf    temp, f
    movf    pattB, w
    call dcode
    iorwf    temp, f
    swapf    temp, w
    movwf    PORTB

    return

;------------------------------------------
;***stepcode - sub to generate bit pattern for number in w (!!MUST BE 0-7!!)
;  pattern is stored in w register (lower four bits) for half step pattern

dcode:    addwf    PCL, f
    retlw    B'00000001'    ;0
    retlw    B'00000011'    ;1
    retlw    B'00000010'    ;2
    retlw    B'00000110'    ;3
    retlw    B'00000100'    ;4
    retlw    B'00001100'    ;5
    retlw    B'00001000'    ;6
    retlw    B'00001001'    ;7

;Mandatory end of program command

    end
25/06/2011 #2

Avatar de soerok

Pon un capacitor de 10uF en la alimentación del PIC, lo mas cerca que puedas, por lo que se ve es un driver para PaP, estas alimentándolo de la misma fuente que el PIC?, de ser así puede que los picos de tensión que genera el motor resetea el PIC y lo inutiliza.
25/06/2011 #3

Avatar de capitanp

No tendras que poner la patilla 4 a Vcc con una R de 10k..
25/06/2011 #4


haré lo que ustedes me dicen, y otra consulta:

El tema del clock, el circuito es RC y yo lo puse en cualquier lado,¿será problema?

¿Tendria que cambiar por cristal? ¿tambien deberia cambiar el programa?

Ojo casi cero de conocimiento en esto de los pic, recien comienzo y me pasan estas cosas raras.

P.D. gracias por la buena onda
25/06/2011 #5

Avatar de soerok

Es mucho mas confiable un cristal, generalmente se usa de 4 MHz, y si cambiarías los fuses y retardos de tu programa ya que la frecuencia no es la misma.
Saludos.
25/06/2011 #6


¿fuses? en que frecuencia está ahora? y en cuanto quedaria?
25/06/2011 #7

Avatar de soerok

Los fuses son lo que defines al inicio de tu programa: __config _RC_OSC & _WDT_OFF & _PWRTE_ON, tu cambiarías _RC_OSC por: _XT_OSC, ese es el cambio de un oscilador RC a uno de cristal, el oscilador RC es bastante inestable, asi son los osciladores RC, en cambio uno de cristal te dara un a frecuencia mas estable, ese oscilador ronda los 4.54 MHz pero con muchas variaciones, un cristal lo puedes calcular de 4 MHz sin mucho margen de error, y los retardos, los puedes calcular con un programa llamado PICLoops, solo pones la frecuencia del oscilador que tengas y el tiempo que quieras del retardo y te da el bloque de código completo.

PD: México campeón de la copa oro!
Saludos.
26/06/2011 #8

Avatar de fdesergio

Su usas un oscilador RC asegurate de colocarlo en el pin Oscilador IN, chauuuuuuuu
27/06/2011 #9


si cambias en la configuracion el oscilador por XT, tambien deves cambiar en el circuito, colocando un cristal de 4Mhz y dos cap. de 22nF
Si esto lo hice, pero nada.

Lo que si puede ser que mi grabador no sea bueno, ya que estamos empezando con este, arme el jdm serial y no me andubo, despues arme el GTPLITE paralelo y este reconocio el pic, lo graba, lo verifica pero no me ha andado nada de lo que grabé.

Cual seria un buen programador para principiante y que sea con elemento basicos.
01/07/2011 #10


Solucionado
Muchachos!!!! Andubo

Me hicieron dudar del programador, (Construccion casera) por lo que realice unos ajuste que figuran en el foro, volvi a programar el pic y nada, le conecte el MCRL con 10k a VCC y listo funciono perfecto!!!

Gracias por su ayuda.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.