PIC16F84A AYUDA!!!!!!!!

jack921

Bovino adicto
#1
Hola a todos, soy yo otra vez, y tengo otro problemilla que me quita el sueño...

La práctica es lo más sencillo del mundo (otra vez):

1. Realizar programa y circuito que pretenda encender los bits 0,1,3,5,7 del puerto B del pic16f84a. "eso es todo"

Mi programa es el siguiente (en MPLAB):

LIST P=16F84A
#INCLUDE <P16F84A.INC>

ORG 00H
BSF STATUS,RP0
CLRF TRISB
BCF STATUS,RP0
LOOP MOVLW 0ABH
MOVWF PORTB
GOTO LOOP
END

Funciona al 100% en el ISIS, pero en la práctica necesito a veces sostener entre mis dedos el cristal oscilador o los capacitores cerámicos (y aún así solo dura un segundo); no es el material, ya los cambié varias veces y hace lo mismo, creo que el programa esta mal estructurado o algo por el estilo, porfa ayudenme.

PD. Cualquier comentario ofensivo o en mala onda favor de "RESERVÁRSELO"...
 

micrograms

Bovino maduro
#2
No logro entender bien tus instrucciones pareciera lenguaje C, pero tu dices que estas utilizando el mplab. Creo que olvidas algo importante que es configurar los puertos, puedes utilizar el oscilador interno y asi te evitas el oscilador de cristal y los capacitores.
Veamos para configurar los puertos esto es lo que hago:

Main
MOVLW d'7'
MOVWF CMCON
BCF STATUS,5
MOVLW b'01010101'
MOVWF PORTB

Creo que esto es parte de lo que quieres hacer aclaro que solo te estoy dando unA idea de lo que puede ser espero que te sirva, saludos
 
#3
si parece q es lo q comenta el compañero falta q configures las salidas del puerto b, pues segun yo dentro de tu programa no indicas que puertos deben de encender bueno espero te sirva de ayuda
 

kampon

Bovino adolescente
#4
amigo si el programa funciona en el ISIS perfectamente no tiene porque fallar en forma real, muchas veces cambiamos los componentes y lo que viene siendo es algun alambre o el protoboard te recomiendo que tambien cambies eso.
 

mcpiebot

Bovino adicto
#5
Hola a todos, soy yo otra vez, y tengo otro problemilla que me quita el sueño...

La práctica es lo más sencillo del mundo (otra vez):

1. Realizar programa y circuito que pretenda encender los bits 0,1,3,5,7 del puerto B del pic16f84a. "eso es todo"

Mi programa es el siguiente (en MPLAB):

LIST P=16F84A
#INCLUDE <P16F84A.INC>

ORG 00H
BSF STATUS,RP0
CLRF TRISB
BCF STATUS,RP0
LOOP MOVLW 0ABH
MOVWF PORTB
GOTO LOOP
END

Funciona al 100% en el ISIS, pero en la práctica necesito a veces sostener entre mis dedos el cristal oscilador o los capacitores cerámicos (y aún así solo dura un segundo); no es el material, ya los cambié varias veces y hace lo mismo, creo que el programa esta mal estructurado o algo por el estilo, porfa ayudenme.

PD. Cualquier comentario ofensivo o en mala onda favor de "RESERVÁRSELO"...
Hola,

El codigo esta bien, pero no se si en la configuracion de bits, configuraste correctamente el cristal, me parece que por ahi esta el error, o puede que el mismo no este bien conectado.

Revisa tambien que el reset tenga su resistencia de 10kohms a Vcc.

Saludos!
 
#6
a mi me sucedia lo mismo y mi error era que no lei bien el datasheet del pic, yo usaba un cristal de 20 mhz pero lo configuraba en el programa como xt, pero no era xt era hs.

checa el datasheet de tu pic.
 

jack921

Bovino adicto
#8
[highlight]Gracias a Todos, lo que era, era la línea de configuraciones, ésta:

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

:) era la configuración del oscilador, desactivar el WDT y porfin funcionó!!!!! Gracias por el interés. Pero ahora tengo una cuestión en la que quisiera que me ayuden... tengo el problema de una alarma:
1. El buzzer (conectado en RB0) se activa al presionar cuanquiera de los 5 sensores (RA0,RA1,RA2,RA3,RA4). Necesito hacer un programa usando compuertas OR (IORLW ó IORWF), otro con XOR Y otro con NOT(por cierto no he visto instrucciones que utilicen not pero..) Yo ya hice uno con AND y al mismo usando el Flag Z del STATUS REGISTER es el siguiente:

LIST P=16F84A
#INCLUDE <P16F84A.INC>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

ORG 00H

BSF STATUS,5
MOVLW 1FH
MOVWF TRISA
CLRF TRISB
BCF STATUS,5

CLRF PORTB
NADA MOVLW 1FH
ANDWF PORTA,0
BTFSS STATUS,2

GOTO PRENDER

BCF PORTB,0
GOTO NADA

PRENDER BSF PORTB,0
GOTO NADA
END

Éste funciona bien :vientos: si me orientaran en los otros se los agradecería.[/highlight]
 

lugo00

Bovino maduro
#9
[highlight]Gracias a Todos, lo que era, era la línea de configuraciones, ésta:

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

:) era la configuración del oscilador, desactivar el WDT y porfin funcionó!!!!! Gracias por el interés. Pero ahora tengo una cuestión en la que quisiera que me ayuden... tengo el problema de una alarma:
1. El buzzer (conectado en RB0) se activa al presionar cuanquiera de los 5 sensores (RA0,RA1,RA2,RA3,RA4). Necesito hacer un programa usando compuertas OR (IORLW ó IORWF), otro con XOR Y otro con NOT(por cierto no he visto instrucciones que utilicen not pero..) Yo ya hice uno con AND y al mismo usando el Flag Z del STATUS REGISTER es el siguiente:

LIST P=16F84A
#INCLUDE <P16F84A.INC>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

ORG 00H

BSF STATUS,5
MOVLW 1FH
MOVWF TRISA
CLRF TRISB
BCF STATUS,5

CLRF PORTB
NADA MOVLW 1FH
ANDWF PORTA,0
BTFSS STATUS,2

GOTO PRENDER

BCF PORTB,0
GOTO NADA

PRENDER BSF PORTB,0
GOTO NADA
END

Éste funciona bien :vientos: si me orientaran en los otros se los agradecería.[/highlight]

Para OR es lo mismo man pero tienes que usar la lógica OR, osea en lugar 1Fh usas 00h, por que? sencillo por que prende la bandera Z solo si la comparación es falsa.

Para NOT más facil todavía haces el NOT del puerto A y si el resultado es cero se enciende la bandera Z.

Para XOR igual investiga la lógica pero creo que dice que si los bits a comparar son iguales el resultado es cero, y si es cero enciende la bandera Z.

y eso es todo.
 

lugo00

Bovino maduro
#10
En cuanto a la configuración de __CONFIG, tienes razón nunca debes olvidar ponerla eso es lo mejor.

Y para los que no entendieron el código. NO ES C, es código ENSAMBLADOR.
 

jack921

Bovino adicto
#11
[highlight]Listo... por fin resolví los que ocupan OR, XOR, AND(que de hecho lo deje igual al que puse porque ya usa una AND), solo me falta el de la NOT. Ya lo chequé y me dí cuenta de que COMF la hace de NOT (jaja) ya que intercambia los bits del file seleccionado. Por ejemplo si tengo en un file el dato 01100100, después de usar la instrucción COMF será el dato de 10011011, (que bien diría yo que es NOT), lo malo es que al hacer el programa, nomás no quiere, se queda encendido o apagado, y nomás, tmb en ese testeo el Flag Z, pero igual no me hace el cambio, el programa es el siguiente:

LIST P=16F84A
#INCLUDE <P16F84A.INC>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

ORG 00H

BSF STATUS,5
MOVLW 1FH
MOVWF TRISA
CLRF TRISB
BCF STATUS,5

NADA COMF PORTA,0
BTFSS STATUS,2

GOTO ENCENDER

BCF PORTB,0
GOTO NADA

ENCENDER BSF PORTB,0
GOTO NADA
END

Mi razonamiento era poner resistencias de pull-up a los bits del PORTA, y así con la instrucción cambiarlos a 00000000, de esta manera encender la Flag Z, y usar eso como referencia, en cualquier caso de botón oprimido; el resultado ya no sería 0 y el Flag se quedaría en 0 o no?

Gracias, por la ayuda. Tmb (han de decir que como friego) tengo que hacer una señal cuadrada de 50 Hz por el RB4, ya tengo el retardo que me hace el tiempo que necesito (10ms), pero no funciona. Si puedo más tarde les doy más detalles de éste último.

Gracias por el Interés.[/highlight]
 
#13
[highlight]Listo... por fin resolví los que ocupan OR, XOR, AND(que de hecho lo deje igual al que puse porque ya usa una AND), solo me falta el de la NOT. Ya lo chequé y me dí cuenta de que COMF la hace de NOT (jaja) ya que intercambia los bits del file seleccionado. Por ejemplo si tengo en un file el dato 01100100, después de usar la instrucción COMF será el dato de 10011011, (que bien diría yo que es NOT), lo malo es que al hacer el programa, nomás no quiere, se queda encendido o apagado, y nomás, tmb en ese testeo el Flag Z, pero igual no me hace el cambio, el programa es el siguiente:

LIST P=16F84A
#INCLUDE <P16F84A.INC>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

ORG 00H

BSF STATUS,5
MOVLW 1FH
MOVWF TRISA
CLRF TRISB
BCF STATUS,5

NADA COMF PORTA,0
BTFSS STATUS,2

GOTO ENCENDER

BCF PORTB,0
GOTO NADA

ENCENDER BSF PORTB,0
GOTO NADA
END

Mi razonamiento era poner resistencias de pull-up a los bits del PORTA, y así con la instrucción cambiarlos a 00000000, de esta manera encender la Flag Z, y usar eso como referencia, en cualquier caso de botón oprimido; el resultado ya no sería 0 y el Flag se quedaría en 0 o no?

Gracias, por la ayuda. Tmb (han de decir que como friego) tengo que hacer una señal cuadrada de 50 Hz por el RB4, ya tengo el retardo que me hace el tiempo que necesito (10ms), pero no funciona. Si puedo más tarde les doy más detalles de éste último.

Gracias por el Interés.[/highlight]

aqui esta uno que realice pero como dices que ya tienes la rutina solo cambiale para que sea de 10ms

;************************************** Timer.asm ***********************************
; Por la línea RB3 se genera una onda rectangular de 500 µs en alto y 300 µs en bajo.
;
; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
ENDC
TMR0_Carga_500us EQU d'256'-d'242' ; Estos valores se han obtenido
TMR0_Carga_300us EQU d'256'-d'143' ; experimentalmente.
#DEFINE Salida PORTB,3
; ZONA DE CÓDIGOS ********************************************************************
ORG 0
Inicio
bsf STATUS,RP0
bcf Salida ; Esta línea se configura como salida.
movlw b'00000000'
movwf OPTION_REG ; Prescaler de 2 para el TMR0
bcf STATUS,RP0
Principal
bsf Salida ; La salida pasa a nivel alto
call Timer0_500us ; durante este tiempo.
bcf Salida ; La salida pasa a nivel bajo
call Timer0_300us ; durante este tiempo.
goto Principal
; Subrutinas "Timer0_500us" y "Timer0_300us" --------------------------------------------
;
Timer0_500us
nop ; Para ajustar el tiempo exacto.
nop
movlw TMR0_Carga_500us
goto Timer0_Temporizador
Timer0_300us
movlw TMR0_Carga_300us
Timer0_Temporizador
movwf TMR0 ; Carga el Timer 0.
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_Rebosamiento
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_Rebosamiento ; Todavía no. Repite.
return
END

suerte
 

jack921

Bovino adicto
#14
[highlight]Gracias por el apoyo, ya terminé el de la frecuencia de 50 Hz, sólo necesito ayuda para el que había mencionado del COMF, ya le calé de una manera y de otra y no quiere, es el de este problema de arriba, menos el de la frecuencia, por favor ayuda para esta pobre alma descarriada :llorar: (jaja).[/highlight]
 
Arriba