Autor Tema: Ayuda con cristal oscilador del PIC 16F877A  (Leído 9543 veces)

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

Desconectado Hansot

  • PIC10
  • *
  • Mensajes: 10
Ayuda con cristal oscilador del PIC 16F877A
« en: 10 de Octubre de 2014, 23:49:49 »
Estoy usando un PIC16F877A con un cristal de 8MHz y 2 capacitares de 22 uF, pero al simularlo en proteus el "OSC2/CLKOUT" me sale como deshabilitado, esto no me pasaba con otros pics...
Simule el programa y todo esta bien pero no entiendo por que sale como deshabilitado

Circuito:




Programacion:
Código: [Seleccionar]
LIST P=16F877A
#INCLUDE <P16F877A.INC>
__CONFIG 0X3F3A
;---------------------------------------------------------------------------------------------------------
PORTA EQU 0X05
PORTB EQU 0X06
PORTC EQU 0X07
TRISA EQU 0X85
TRISB EQU 0X86
TRISC EQU 0X87
STATUS EQU 0X03
ADCON1 EQU 0X9F
TIM1 EQU 0X20
TIM2 EQU 0X21
TIM3 EQU 0X22
CNT EQU 0X23
CNT2 EQU  0X24
;---------------------------------------------------------------------------------------------------------
ORG 0X00

BSF STATUS,5 ; BANCO 1
MOVLW 0X06
MOVWF ADCON1 ; CONFIGURA TODOS LOS PINES COMO SALIDAS DIGITALES
MOVLW B'00111111'
MOVWF TRISA ; PUERTO A ENTRADAS
MOVLW B'00000000'
MOVWF TRISB ; PUERTO B SALIDAS
MOVLW B'00000000'
MOVWF TRISC ; PUERTO C SALIDAS
BCF STATUS,5 ; BANCO 0
CLRF PORTA ; LIMPIA PUERTO A
CLRF PORTB ; LIMPIA PUERTO B
CLRF PORTC ; LIMPIA PUERTO C
GOTO INICIO
;---------------------------------------------------------------------------------------------------------
BCD7SEG ADDWF PCL,1 ; SE INCREMENTA EL CONTADOR
RETLW B'00000000' ; 0
RETLW B'00000001' ; 1
RETLW B'00000010' ; 2
RETLW B'00000011' ; 3
RETLW B'00000100' ; 4
RETLW B'00000101' ; 5
RETLW B'00000110' ; 6
RETLW B'00000111' ; 7
RETLW B'00001000' ; 8
RETLW B'00001001' ; 9
CLRF CNT ; SI LLEGA A 10 EL CONTADOR SE RESETEA
RETLW B'0000000' ; 0
;-------------------------------------------------------------------------------------------------------------
INICIO MOVLW 0X00
MOVWF CNT ; CONTADOR = 0
MOVLW 0X0A
MOVWF CNT2
TEST BTFSS PORTA,0 ; PULSAR BOTON PARA INICIAR
GOTO TEST ; TESTEAR BOTON
REBOT BTFSC PORTA,0
GOTO REBOT ; ANTIREBOTE

DERECHA MOVLW B'00110011'
MOVWF PORTB ; PASO 1
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'01100110'
MOVWF PORTB ; PASO 2
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'11001100'
MOVWF PORTB ; PASO 3
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'10011001'
MOVWF PORTB ; PASO 4
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
BTFSC PORTA,1 ; SENSOR 1 INTERRUMPIDO?
GOTO DERECHA ; REPITE CICLO

IZQUIERDA MOVLW B'00111001'
MOVWF PORTB ; PASO 1
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'01101100'
MOVWF PORTB ; PASO 2
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'11000110'
MOVWF PORTB ; PASO 3
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'10010011'
MOVWF PORTB ; PASO 4
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
BTFSC PORTA,2 ; SENSOR 2 INTERRUMPIDO?
GOTO IZQUIERDA ; REPITE CICLO

DERECHA2 MOVLW B'00110000'
MOVWF PORTB ; PASO 1
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'01100000'
MOVWF PORTB ; PASO 2
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'11000000'
MOVWF PORTB ; PASO 3
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'10010000'
MOVWF PORTB ; PASO 4
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
BTFSC PORTA,3 ; SENSOR 3 INTERRUMPIDO?
GOTO DERECHA2 ; REPITE CICLO

INCF CNT,1 ; INCREMENTAMOS CONTADOR
MOVFW CNT ;
CALL BCD7SEG ; LLAMAMOS A LA TABLA
MOVWF PORTC ; CARGAMOS TABLA EN PORTB
DECFSZ CNT2,1 ; CNT2 = 0 ?
GOTO DERECHA ; NO, SE REPITE EL CICLO
GOTO INICIO ; SI, SE RESETEA EL PROGRAMA


;---------------------------------------------------------------------------------------------------------
DEMORA MOVLW 0x3F ; RETARDO DE 0.1 SEGUNDOS
MOVWF TIM1
MOVLW 0x90
MOVWF TIM2
Delay_0 DECFSZ TIM1, f
GOTO $+2
DECFSZ TIM2, f
GOTO Delay_0
GOTO $+1
RETURN

END
;---------------------------------------------------------------------------------------------------------

Espero que puedan ayudarme :) gracias colegas!


Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Ayuda con cristal oscilador del PIC 16F877A
« Respuesta #1 en: 11 de Octubre de 2014, 00:41:50 »
Hola Hansot, los capacitores deben ser de 22pF (pico-faradios) y no de 22uF (micro-faradios): Tal ves ese sea el error, de todas maneras si no usas el cristal igualmente funciona en el ISIS. Solo debes setear la frecuencia en los datos del micro (botón derecho y click izquierdo sobre el micro, y donde dice frecuencia en el cartel que aparece).

Un saludo.

Atte. CARLOS.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado Hansot

  • PIC10
  • *
  • Mensajes: 10
Re: Ayuda con cristal oscilador del PIC 16F877A
« Respuesta #2 en: 11 de Octubre de 2014, 17:09:23 »
Hola Hansot, los capacitores deben ser de 22pF (pico-faradios) y no de 22uF (micro-faradios): Tal ves ese sea el error, de todas maneras si no usas el cristal igualmente funciona en el ISIS. Solo debes setear la frecuencia en los datos del micro (botón derecho y click izquierdo sobre el micro, y donde dice frecuencia en el cartel que aparece).

Un saludo.

Atte. CARLOS.



Tenéis toda la razón, debían ser Pico faradios pero aun así en la simulación el OSC2 sale deshabilitado, yo se que se puede simular sin necesidad de poner el cristal, pero me preocupa que al momento de armar el circuito no funcione por ese OSC2 y termine dañando todos los componentes que usare.
En el datasheet del microcontrolador dice que para usar un cristal de 8MHz debo usar 2 capacitores de 15 a 33 pF.


Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Ayuda con cristal oscilador del PIC 16F877A
« Respuesta #3 en: 11 de Octubre de 2014, 23:44:19 »
Hola Hansot, si bien el programa se nota que es de principiante o sea de que recién estas empezando con esto de la programación, pues no veo nada que indique o pueda quemarte algo de la etapa del oscilador por causa de la programación.

Si a un micro le cargas ese programa, le das alimentación y no conectas nada a sus pines, pues de inmediato entrará a oscilar.
Ahora, que le conectas a los pines y como funciona el programa, pues esto no lo e controlado.

Igual te paso algunos consejos con respecto a la manera de redactar tu programa:

------------------------------------------------------------------------------------------------
Tu colocas:
   LIST      P=16F877A
   #INCLUDE   <P16F877A.INC>
   __CONFIG   0X3F3A

Es más fácil de entender incluso para vos si usaras:
   LIST      P=16F877A
   #INCLUDE   <P16F877A.INC>
   __CONFIG   _HS_OSC&_WDT_OFF&_PWRTE_OFF&_BODEN_OFF&_LVP_OFF&_CPD_OFF&_WRT_OFF&_DEBUG_OFF&_CP_OFF

Se que es más largo, pero mucho más fácil de entender.

------------------------------------------------------------------------------------------------
Luego defines las direcciones de todos los registros, PORTA, PORTB, etc. Si usas la declaración: #INCLUDE <P16F877A.INC> Todos esas direcciones ya están definidas, por lo que no es necesario declararlas.
Busca en la dirección:

C:\Archivos de programa\Microchip

Ahí encontraras el archivo "p16f877a" (sin comillas), que te detalla todas las definiciones que se usan para este micro en particular si defines el INCLUDE tal como lo as hecho

------------------------------------------------------------------------------------------------
CLRF      PORTA
CLRF      PORTB
CLRF      PORTC

Deben ir antes de definir los registros TRIS corespondientes

------------------------------------------------------------------------------------------------
Para definir la memoria RAM es más fácil con el cblock --> endc.
De esta manera no tienes que andar colocándole una posición exacta a cada variable, o sea no necesitas el EQU.

------------------------------------------------------------------------------------------------
Aunque no uses las interrupciones es bueno definirlas, un buen inicio de programa es el siguiente:

   ORG      0
   clrwdt
   bcf      STATUS,RP0         ;Selecciono el banco 0      
   bcf      STATUS,RP1
   goto      PRINCIPIO

   ORG      4
   clrf      INTCON            ; En el caso de no usar las interrupciones
   return

------------------------------------------------------------------------------------------------
Las tablas siempre van primero e inmediatamente después de definir el vector de inicio y el de interrupciones

------------------------------------------------------------------------------------------------
Entonces el programa te quedaría algo como esto:

Código: ASM
  1. LIST            P=16F877A
  2.         #INCLUDE        <P16F877A.INC>
  3.         __CONFIG        _HS_OSC&_WDT_OFF&_PWRTE_OFF&_BODEN_OFF&_LVP_OFF&_CPD_OFF&_WRT_OFF&_DEBUG_OFF&_CP_OFF
  4.  
  5. ;---------------------------------------------------------------------------------------------------------
  6. ; Definición de la RAM
  7.  
  8.         cblock  0x20
  9.                 TIM1
  10.                 TIM2
  11.                 TIM3
  12.                 CNT
  13.                 CNT2
  14.         endc
  15.  
  16. ;---------------------------------------------------------------------------------------------------------
  17. ; Definición de vectores de inicio e interrupciones
  18.         ORG     0
  19.         clrwdt
  20.         bcf     STATUS,RP0              ;Selecciono el banco 0         
  21.         bcf     STATUS,RP1
  22.         goto    PRINCIPIO
  23.  
  24.         ORG     4
  25.         clrf    INTCON                  ; En el caso de no usar las interrupciones
  26.         return
  27.  
  28. ;---------------------------------------------------------------------------------------------------------
  29. ;Tabla
  30.  
  31. BCD7SEG
  32.         ADDWF   PCL,1                   ; SE INCREMENTA EL CONTADOR
  33.         RETLW   B'00000000'             ; 0    
  34.         RETLW   B'00000001'             ; 1    
  35.         RETLW   B'00000010'             ; 2    
  36.         RETLW   B'00000011'             ; 3    
  37.         RETLW   B'00000100'             ; 4    
  38.         RETLW   B'00000101'             ; 5    
  39.         RETLW   B'00000110'             ; 6    
  40.         RETLW   B'00000111'             ; 7    
  41.         RETLW   B'00001000'             ; 8    
  42.         RETLW   B'00001001'             ; 9    
  43.         CLRF    CNT                     ; SI LLEGA A 10 EL CONTADOR SE RESETEA
  44.         RETLW   B'0000000'              ; 0
  45.  
  46. ;---------------------------------------------------------------------------------------------------------
  47. ; Inicio del programa principal
  48.  
  49. PRINCIPIO
  50.         CLRF    PORTA                   ; LIMPIA PUERTO A
  51.         CLRF    PORTB                   ; LIMPIA PUERTO B
  52.         CLRF    PORTC                   ; LIMPIA PUERTO C
  53.         BSF     STATUS,RP0              ; BANCO 1
  54.         MOVLW   0X06
  55.         MOVWF   ADCON1                  ; CONFIGURA TODOS LOS PINES COMO SALIDAS DIGITALES
  56.         MOVLW   B'00111111'                    
  57.         MOVWF   TRISA                   ; PUERTO A ENTRADAS
  58.         MOVLW   B'00000000'                    
  59.         MOVWF   TRISB                   ; PUERTO B SALIDAS
  60.         MOVLW   B'00000000'
  61.         MOVWF   TRISC                   ; PUERTO C SALIDAS
  62.         BCF     STATUS,RP0              ; BANCO 0
  63.         GOTO    INICIO
  64.  
  65. ;---------------------------------------------------------------------------------------------------------
  66. INICIO
  67.         MOVLW   0X00   
  68.         MOVWF   CNT                     ; CONTADOR = 0
  69.         MOVLW   0X0A
  70.         MOVWF   CNT2   
  71. TEST
  72.         BTFSS   PORTA,0                 ; PULSAR BOTON PARA INICIAR
  73.         GOTO    TEST                    ; TESTEAR BOTON
  74. REBOT
  75.         BTFSC   PORTA,0
  76.         GOTO    REBOT                   ; ANTIREBOTE
  77.  
  78. DERECHA
  79.         MOVLW   B'00110011'            
  80.         MOVWF   PORTB                   ; PASO 1
  81.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  82.         CLRF    PORTB
  83.         MOVLW   B'01100110'            
  84.         MOVWF   PORTB                   ; PASO 2
  85.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  86.         CLRF    PORTB
  87.         MOVLW   B'11001100'
  88.         MOVWF   PORTB                   ; PASO 3
  89.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  90.         CLRF    PORTB
  91.         MOVLW   B'10011001'
  92.         MOVWF   PORTB                   ; PASO 4
  93.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  94.         CLRF    PORTB
  95.         BTFSC   PORTA,1                 ; SENSOR 1 INTERRUMPIDO?
  96.         GOTO    DERECHA                 ; REPITE CICLO
  97.  
  98. IZQUIERDA
  99.         MOVLW   B'00111001'            
  100.         MOVWF   PORTB                   ; PASO 1
  101.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  102.         CLRF    PORTB
  103.         MOVLW   B'01101100'            
  104.         MOVWF   PORTB                   ; PASO 2
  105.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  106.         CLRF    PORTB
  107.         MOVLW   B'11000110'
  108.         MOVWF   PORTB                   ; PASO 3
  109.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  110.         CLRF    PORTB
  111.         MOVLW   B'10010011'
  112.         MOVWF   PORTB                   ; PASO 4
  113.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  114.         CLRF    PORTB
  115.         BTFSC   PORTA,2                 ; SENSOR 2 INTERRUMPIDO?
  116.         GOTO    IZQUIERDA               ; REPITE CICLO
  117.  
  118. DERECHA2
  119.         MOVLW   B'00110000'            
  120.         MOVWF   PORTB                   ; PASO 1
  121.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  122.         CLRF    PORTB
  123.         MOVLW   B'01100000'            
  124.         MOVWF   PORTB                   ; PASO 2
  125.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  126.         CLRF    PORTB
  127.         MOVLW   B'11000000'
  128.         MOVWF   PORTB                   ; PASO 3
  129.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  130.         CLRF    PORTB
  131.         MOVLW   B'10010000'
  132.         MOVWF   PORTB                   ; PASO 4
  133.         CALL    DEMORA                  ; 0.1 SEGUNDOS
  134.         CLRF    PORTB
  135.         BTFSC   PORTA,3                 ; SENSOR 3 INTERRUMPIDO?
  136.         GOTO    DERECHA2                ; REPITE CICLO
  137.         INCF    CNT,f                   ; INCREMENTAMOS CONTADOR
  138.         MOVFW   CNT                     ;
  139.         CALL    BCD7SEG                 ; LLAMAMOS A LA TABLA
  140.         MOVWF   PORTC                   ; CARGAMOS TABLA EN PORTB
  141.         DECFSZ  CNT2,f                  ; CNT2 = 0 ?                           
  142.         GOTO    DERECHA                 ; NO, SE REPITE EL CICLO
  143.         GOTO    INICIO                  ; SI, SE RESETEA EL PROGRAMA
  144.  
  145. ;---------------------------------------------------------------------------------------------------------
  146. DEMORA
  147.         MOVLW   0x3F                    ; RETARDO DE 0.1 SEGUNDOS
  148.         MOVWF   TIM1
  149.         MOVLW   0x90
  150.         MOVWF   TIM2
  151. Delay_0
  152.         DECFSZ  TIM1,f
  153.         GOTO    $+2
  154.         DECFSZ  TIM2,f
  155.         GOTO    Delay_0
  156.         GOTO    $+1
  157.         RETURN
  158.  
  159. ;---------------------------------------------------------------------------------------------------------
  160.         END

Lo cual es mucho más fácil de entender y eventualmente corregir

Espero te sea de ayuda.

Un saludo.

Atte. CARLOS.

« Última modificación: 11 de Octubre de 2014, 23:55:38 por Chaly29 »
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda con cristal oscilador del PIC 16F877A
« Respuesta #4 en: 12 de Octubre de 2014, 20:38:34 »
Sólo con fines de simulación, te recomiendo que elimines todo el circuito de oscilación del Proteus. Lo único que hace es morfarte recursos del CPU. Podés darle la oscilación al circuito en la simulación haciendo un click derecho y luego uno izquierdo sobre el micro, y seteando la opción Procesor Clock Frequency al valor 8Mhz en tu caso.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Hansot

  • PIC10
  • *
  • Mensajes: 10
Re: Ayuda con cristal oscilador del PIC 16F877A
« Respuesta #5 en: 13 de Octubre de 2014, 19:19:49 »
Vale tíos, muchos gracias a ambos por esos consejos tan sabios  ((:-))
Ya arme el circuito y parece que todo esta bien, me habéis salvado la vida ¡sois lo máximo!


 

anything