Problema con PIC16F877A

#1
Hola amigos, estoy realizando un montaje sencillo con el pic 16f877a, el cual es una secuancia de leds por el puerto d y salida a lcd por el puerto b, pasa que em la simulación sale todo bien, pero en la realidad solo funciona cuando conecto el pinB7 a tierra.
Cambie los puertos para la lcd dejando el que tiene por defecto (D) y las salidas por el B pero pasa lo mismo solo cuando D7 esta a tierra funciona lo cual no seria problema si por el lcd saliera la información que quiero, pero como el pin D7 o B7 está a tierra no sale nada
ya probe con los capacitores de 15pF en el cristal y la verdad nos e que pueda ser, agradezco su colaboración.
el programa esta en C++, montaje en proteus y el físico en protoboard ...
 

Adjuntos

Última edición:
#2
Pues no deberías tener problemas con la pantalla en ninguno de los dos puertos.
Lo que si veo mal en tu programa, es la forma de definir el puerto para la pantalla.
Si requieres que el puerto para la pantalla sea el puerto B, se define de esta forma:
#define LCD_DATA_PORT getenv("SFR:pORTB")
#include <lcd.c>
Primero se define el puerto para la pantalla y a continuación se incluye la librería.

Otros detalles:
El uso de los standard_io (puerto) que usaste, salen sobrando, al igual que los set_tris_x();
Los puertos por defecto son entradas, y con tan solo usar output_d(0); ya tienes todos los bits del puerto D en 0.

Ahora por ejemplo. Si requieres que algunos bits sean entradas y otros salidas, usas: #use fast_io(d)
Y entonces aquí si conviene usar set_tris_x();
Por ejemplo:
set_tris_d(0b11001100);
Aquí los bits 7, 6, 3 y 2 serán entradas y los bits 5, 4, 1 y 0 serán salidas.
Como ya se usó #use fast_io(d), entonces al usar output_d(0); únicamente los bits configurados como salida se pondrán en 0 y los bits configurados como entradas se mantendrán sin cambio.

Prueba definiendo el puerto para la pantalla de la forma que te digo y verás que funciona sin problemas.
Si sigues teniendo problemas, realiza una prueba de los puertos para comprobar que funcionen como salidas.
 
#3
buenas noches. estoy creando un programita en pbp mcs con pic 16f877a .
el proyecto consiste en encender leds con pulsadores.
ejemplo:
todo el puerto b son pulsadores + 2 del puerto a, osea ra1 y ra2 en total 10 pulsadores.
y el puerto d con e1 y e2 son total 10 salidas.

Que pasa cuando inicio se me enciende algunos leds, sin les halla dado orden. quisiera tener el control de todos por medio de cada pulsador, y eso no sucede, que estaria haciendo mal digan.
muchas gracias
Inicio el pic con VCC 5volts y se encienden algunos leds. En especial el Re0' Re1, rc0, etc. Así después de un tiempo. Otro poco de leds. La verdad no sé qué paSa, serán los fuses que no le pongo?. Estoy en Windows 7 64 bits.
 

Adjuntos

Última edición:
#4
Podrias subir el esquema eléctrico de tu aplicación, me parece más un problema de hardware que de programación.
Las entradas las has referenciado al valor opuesto de activación??? esto puede hacerse por programación o con resistencias externas.
Por ejemplo si tu pulsador activa en alto debes activar el pulldown, si activan en bajo debes activar el pullup.
En su defecto puedes poner resistencias externas, 1k a masa para el primer caso y a +B para el segundo caso.

Para estar más seguro sube tu diagrama eléctrico de tu montaje
 

capitanp

Miembro irreconocible
#5
Estaria bueno que pongas un formato que podamos ver, como una imagen y el programa lo podes insertar directamente entre los comandos de CODE </>Código
 
#6
Tiene razón.
Código:
define osc 4


ADCON1=7


TRISA=%1

TRISB=%1

TRISC=0

TRISD=0

TRISE=0


Porta=%00000011

Portb=%11111111


Portc=%00000000

Portd=%00000000

Porte=000


activar VAR BIT


pause 250


                

sensado:

if portb.0= 0 then diez

if portb.1= 0 then nueve

if portb.2= 0 then ocho

if portb.3= 0 then siete

if portb.4= 0 then seis

if portb.5= 0 then cinco

if portb.6= 0 then cuatro

if portb.7= 0 then tres


if porta.0= 0 then dos

if porta.1= 0 then uno

activar=1


goto sensado



diez:

portd=%11111111

porte=%11

if portb.1= 0 then nueve

LOW PORTC.0

pause 250

goto diez


nueve:

portd=%11111110

porte=%11

if portb.2= 0 then ocho

        if portb.0= 0 then diez

pause 250

goto nueve


ocho:

portd=%11111100

porte=%11

if portb.3= 0 then siete

        if portb.1= 0 then nueve

pause 250

goto ocho


siete:

portd=%11111000

porte=%11

if portb.4= 0 then seis

        if portb.2= 0 then ocho

pause 250

goto siete


seis:

portd=%11110000

porte=%11

if portb.5= 0 then cinco

        if portb.3= 0 then siete

pause 250

goto seis


cinco:

portd=%11100000

porte=%11

if portb.6= 0 then cuatro

        if portb.4= 0 then seis

pause 250

goto cinco


cuatro:

portd=%11000000

porte=%11

if portb.7= 0 then tres

        if portb.5= 0 then cinco       

pause 250

goto cuatro


tres:

portd=%10000000

porte=%11

if porta.0= 0 then dos

        if portb.6= 0 then cuatro

pause 250

goto tres


dos:

portd=%00000000

porte=%11

if porta.1= 0 then uno

        if portb.7= 0 then tres

pause 250

goto dos


uno:

portd=%00000000

porte=%10

high PORTC.0

        if porta.0= 0 then dos

pause 250

goto uno
 
#7
Cuando pongas código hazlo de la siguiente manera
Código:
define osc 4

ADCON1=7

TRISA=%1
TRISB=%1
TRISC=0
TRISD=0
TRISE=0

Porta=%00000011
Portb=%11111111

Portc=%00000000
Portd=%00000000
Porte=000

activar VAR BIT

pause 250


sensado:
if portb.0= 0 then diez
if portb.1= 0 then nueve
if portb.2= 0 then ocho
if portb.3= 0 then siete
if portb.4= 0 then seis
if portb.5= 0 then cinco
if portb.6= 0 then cuatro
if portb.7= 0 then tres

if porta.0= 0 then dos
if porta.1= 0 then uno
activar=1

goto sensado


diez:
portd=%11111111
porte=%11
if portb.1= 0 then nueve
LOW PORTC.0
pause 250
goto diez

nueve:
portd=%11111110
porte=%11
if portb.2= 0 then ocho
if portb.0= 0 then diez
pause 250
goto nueve

ocho:
portd=%11111100
porte=%11
if portb.3= 0 then siete
if portb.1= 0 then nueve
pause 250
goto ocho

siete:
portd=%11111000
porte=%11
if portb.4= 0 then seis
if portb.2= 0 then ocho
pause 250
goto siete

seis:
portd=%11110000
porte=%11
if portb.5= 0 then cinco
if portb.3= 0 then siete
pause 250
goto seis

cinco:
portd=%11100000
porte=%11
if portb.6= 0 then cuatro
if portb.4= 0 then seis
pause 250
goto cinco

cuatro:
portd=%11000000
porte=%11
if portb.7= 0 then tres
if portb.5= 0 then cinco
pause 250
goto cuatro

tres:
portd=%10000000
porte=%11
if porta.0= 0 then dos
if portb.6= 0 then cuatro
pause 250
goto tres

dos:
portd=%00000000
porte=%11
if porta.1= 0 then uno
if portb.7= 0 then tres
pause 250
goto dos

uno:
portd=%00000000
porte=%10
high PORTC.0
if porta.0= 0 then dos
pause 250
goto uno
 
#8
Código:
Porta=%00000011

Portb=%11111111


Portc=%00000000

Portd=%00000000

Porte=000


activar VAR BIT


pause 250


            

sensado:

if portb.0= 0 then diez

if portb.1= 0 then nueve

if portb.2= 0 then ocho

if portb.3= 0 then siete

if portb.4= 0 then seis

if portb.5= 0 then cinco

if portb.6= 0 then cuatro

if portb.7= 0 then tres


if porta.0= 0 then dos

if porta.1= 0 then uno

activar=1


goto sensado



diez:

portd=%11111111

porte=%11

if portb.1= 0 then nueve

LOW PORTC.0

pause 250

goto diez


nueve:

portd=%11111110

porte=%11

if portb.2= 0 then ocho

        if portb.0= 0 then diez

pause 250

goto nueve


ocho:

portd=%11111100

porte=%11

if portb.3= 0 then siete

        if portb.1= 0 then nueve

pause 250

goto ocho


siete:

portd=%11111000

porte=%11

if portb.4= 0 then seis

        if portb.2= 0 then ocho

pause 250

goto siete


seis:

portd=%11110000

porte=%11

if portb.5= 0 then cinco

        if portb.3= 0 then siete

pause 250

goto seis


cinco:

portd=%11100000

porte=%11

if portb.6= 0 then cuatro

        if portb.4= 0 then seis

pause 250

goto cinco


cuatro:

portd=%11000000

porte=%11

if portb.7= 0 then tres

        if portb.5= 0 porte=%11

if porta.0= 0 then dos

        if portb.6= 0 then cuatro

pause 250

goto tres


dos:

portd=%00000000

porte=%11

if porta.1= 0 then uno

        if portb.7= 0 then tres

pause 250

goto dos
Buenas. ¿Podrías mostrar el diagrama de flujo de lo que quieres hacer?
Yo no veo que se cierre un bucle.
Empieza con una entrada y una salida, luego dos.

G.
 
#9
Lo que quiero hacer en verdad, es controlar el nivel de agua de un tanque y controlar su encendido y apagado automático.
Aquí les pongo una imagen del proyecto y el margen de sensado, o_sea, es de la mitad del tanque hacia arriba.
Esos puntos que ven allí son sensores IR (emisor receptor)
Cada vez que la bolita pasa por allí, va a marcar en un grupo de leds donde me indica dónde está el nivel del agua.

WhatsApp Image 2019-01-31 at 1.42.16 PM.jpeg
Entonces estos sensores IR ingresan a unos comparadores LM324 para definir con presición el bit negativo que entrará al PIC.
No sé si me dejo entender.
Este es el esquema en ISIS de Proteus y PDF.
Por eso quiero, por ejemplo:
Pulso button 1 se encienden los diez leds, presiono button 2 y se encienden 9 leds, asi sucesivamente, y cuando este en el ultimo, button 10 se presiona y enciende la bomba por RC0 y empieza a llenar el tanque otra vez, indicando por los button el nivel del agua.
Espero me entiendan. nos comunicamos, gracias.
 

Adjuntos

#10
Te recomiendonque cambies los sensores IR ppr switch magneticos (vienen encapsulado)... La metodologia de sensado es sencilla, podes usar un puertopor nivel o bien, un solo puerto adc si haces una red resistiva... Te ahorras los amp op y te rwsguardas de que estos dejen de funcionar por suciedad.
Pones del lado interno los sensores, y externamente buscas un iman redondo al cual le vas a sumar algun elemento quebtenga la capacidad de hacer flotar al iman, y que pueda activar el sensor dentro del caño..
Aun no pude ver el programa por que estoy en el telefono, si podes subir el codigo vemos en que te puedo ayudar
 
#12
Claro, la idea del ir por switch magnéticos está lindo, solo que ya instalé la varita con sensores ir. Si pero aquí te lo adjunto el programa en pbp y el diseño en Isis Proteus., gracias
Hola Gudino, no tengo otro esquema solo la placa hecha jejeje.
 

Adjuntos

#14
Los fuses de la palabra de configuración y los registros, son cosas diferentes.
En la palabra de configuración se establece, el tipo de oscilador, el comportamiento del Watch dog Timer, el Power On Timer, las protecciones, etc.
Y con los registros se configuran otras funciones, como el caso del ADCON0 y ADCON1 que van ligados al conversor ADC.
Si nunca lees la hoja de datos, nunca entenderás el funcionamiento de un microcontrolador, ahí está todo.
Si quieres que los pines con ADC sean digitales, mira el registro ADCON1 y busca cuál sería su valor.
Verás que puede ser tanto 0x06, como 0x07.
¿Por qué? (Enésima vez explicado)
Porque esos son los valores que vienen en la hoja de datos para que esos pines se comporten como digitales.
ADCON1.jpg
En tu programa ya estableciste que los pines con ADC sean digitales al configurar ADCON1 con el valor 7
Así que el problema claro que está en el programa, pero por lo mal estructurado que se encuentra.
Y así como está, cualquier cosa puede pasar, menos lo esperado.
 
#15
Que se puede hacer para educar los novatos? Por un lado no quieren aprender empezando por dominar ls cosas simples como el ejecutar el ejemplo de blinqueo que aparece en toda biblioteca de ejemplos para así confirmar que el entorno este correctamente instalado e iniciado. De allí deberían partir a profundizar sus conocimientos en la búsqueda de como realizar sus objetivos. Por el otro lado una y otra vez ignoran la importancia de leer la hoja de datos! Como muy bien D@rkbytes escribe. Cuando se tiene cierta experiencia de leer la hoja de datos se sabe como están organizadasy así saber donde buscar la información requerida. No es que se lea la hoja de datos como un libro, es saber como acceder la información requerida, donde encontrarla allí!
 
#16
No sé qué decir, como práctica está bien, pero si es para llenar un depósito ... basta con una boya de presión de una lavadora. También el simple sensor de nivel por resistencia, por capacidad ...
 
#17
Claro, está bien la idea Gasparv, solo que yo quiero hacerlo así, que el nivel de agua sea visible a través de esos leds.
Muchas gracias amigos, D@rkbytes y demás.
Voy a retomar de nuevo paso a paso.
Gracias, volveré a escribiros en breve.
 
#18
Cuando subas los archivos incluye el archivo compilado(.hex) por que no todos tenemos instalados el PBP y también por que como no declaras el micro-controlador ni fusibles en el programa que subiste(creo que no es necesario en PBP), no sabemos que hiciste con ellos.

Se me ocurre que tal vez te enredarías menos si solo leyeras el estado del puerto de los pulsadores, lo compararas y tomaras decisiones sin tener tantas etiquetas encadenadas.

Saludos.

Ric.
 
#19
Claro, está bien la idea Gasparv, solo que yo quiero hacerlo así, que el nivel de agua sea visible a través de esos leds.
Hola, pero, en ese caso, imagino que te interesará trasladar esos LED a cierta distancia del depósito. Para eso puedes usar un cable múltiple.

Una sugerencia, si te conformas con 8 LED, puedes arrancar bomba si todos bits a cero, parada cuando bit 6 sea uno y alarma cuando bit 7 sea uno. No hace falta código para convertir a decimal y luego convertir a binario … nada más sencillo que

- lazo01
- leer puerto de entrada (sensores)
- copiar en puerto de salida (LEDS)
- si sensor,6 = 1 PARO BOMBA
- si sensor,7 =1 ALARMA
- si sensor = 0 MARCHA BOMBA
- goto lazo01

G.
 
Última edición:
#20
ola estimados ,hice este codigo y en isis proteus me funciona ok.
pero en mi tarjeta no funciona, osea pulso y se encienden todos los leds, es mas a ratos parece un vumetro, jejejeje

Código:
define osc 4

ADCON1=7

TRISA=%1
TRISB=%1
TRISC=0
TRISD=0
TRISE=0

Porta=%00000011
Portb=%11111111

Portc=%00000000
Portd=%00000000
Porte=000

activar VAR BIT

pause 250

lazo:

if portb.0=0 then
portd=%11111111
porte=%11
portc.0=0
endif

if portb.1=0 then
portd=%11111110
porte=%11
endif

if portb.2= 0 then
portd=%11111100
porte=%11
endif

if portb.3= 0 then
portd=%11111000
porte=%11
endif

if portb.4= 0 then
portd=%11110000
porte=%11
endif


if portb.5= 0 then
portd=%11100000
porte=%11
endif


if portb.6= 0 then
portd=%11000000
porte=%11   
endif

if portb.7= 0 then
portd=%10000000
porte=%11
endif

if porta.0= 0 then
portd=%00000000
porte=%11
endif

if porta.1= 0 then
portd=%00000000
porte=%10
portc.0=1
endif



goto lazo
adjuntare el isis en proteus.

y el archivo hex que pide ricvebi.
gracias
 

Adjuntos


Arriba