duda programacion pic16f877a picbasic

Buenas gente del foro
tengo un PIC16F84A conectado a 4 pulsadores de selección de acción , dependiendo de la acción a realizar envía un 1 por el puerto A(0 1 2 3 ) y el porta.4 recibe de el pic 16f877a envía un 1 para control de un servo , el puerto A (0 1 2 3) tienen una resistencia de 57ohm conectadas a el 16f877a puerto A (0 1 2 3) y el porta.4 envía señal al 16f84a
Tengo el siguiente problema
al accionar un botón y enviar un 1 por el pin 0 del puerto A el 16f877a no reacciona no realiza ninguna acción

Aquí el programa del 16F84A
Código:
@ DEVICE PIC16F84A
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
i var byte
c1        var portb.0;control de ubicacion
c2        var portb.1;control de seguidor de luz
c3        var portb.2;control de seguidor de linea negra
c4        var portb.3;control por radiofrecuencia
servo     var portb.4;control de servo
p1        var porta.0;seleccion ubicacion
p2        var porta.1;seleccion seguidor de luz
p3        var porta.2;seleccion seguidor de linea negra
p4        var porta.3;seleccion radiofrecuencia

cservo      var porta.4;pin control de servo
PORTB.4=0


Inicio;control
if p1=0 then ubi;ubicacion
if p2=0 then luz;seguidor de luz
if p3=0 then cny;seguidor de linea negra  
if p4=0 then rad;control por radiofrecuencia
if (p1=0) and (p3=0) then mov
low c1
low c2
low c3
low c4
pause 10
goto inicio
ubi; ubicacion 
high c1
goto Control
control 
if p1=0 then inicio
if cservo=1 then movimiento
pulsout servo,150
pause 10
goto control
movimiento
for i=150 to 250 step 1
pulsout servo,i
pause 10
next i
pause 700
for i=250 to 150 step -1
pulsout servo,i
pause 10
next i
pause 700
for i=150 to 70 step -1
pulsout servo,i
pause 10
next i
pause 700
goto control

luz
high c2
pause 10
goto luz

cny
high c3
pause 10
goto cny

rad
high c4
pause 10
goto rad

mov
high c3
high c1
if p3=0 then inicio
if cservo=1 then movimiento2
pulsout servo,150
pause 10
goto mov

movimiento2
for i=150 to 250 step 1
pulsout servo,i
pause 10
next i
pause 700
for i=250 to 150 step -1
pulsout servo,i
pause 10
next i
pause 700
for i=150 to 70 step -1
pulsout servo,i
pause 10
next i
pause 700
goto mov
END
Ahora en el 16f877a
Código:
@ DEVICE PIC16F877A   ;Seleccion del Microcontrolador PIC16F877A
@ DEVICE xt_OSC       ;Seleccion del Tipo de oscilador XT de Cristal
@ DEVICE WDT_Off      ;Seleccion del Watchdog Timer Apagado
@ DEVICE PWRT_On     ;Seleccion del Power-on Reset Apagado
@ DEVICE BOD_Off      ;Seleccion del Brown-out Reset Apagado
@ DEVICE LVP_OFF      ;Seleccion del Low-Voltage Programming Apagado
@ DEVICE WRT_OFF      ;Seleccion del Flash Program Memory Write Apagado
@ DEVICE DEBUG_OFF    ;Seleccion del In-Circuit Debugger Apagado
@ DEVICE CPD_OFF      ;Seleccion del Data EEPROM Memory Code Protection Apagado
@ DEVICE PROTECT_Off  ;Seleccion del Flash Program Memory Code Protection Apagado

Define OSC 4  'Definicion de oscilador a 4MHZ
c1         var porta.0;control de ubicacion
c2         var porta.1;control de seguidor de luz
c3         var porta.2;control de seguidor de linea negra
c4         var porta.3;control por radiofrecuencia
cservo     var porta.4;control de servo
cl1        var portc.0;luz1
cl2        var portc.1;luz2
cl3        var portc.2;luz3
ci1        var portc.3;infrarojo 1
ci2        var portc.4;infrarojo 2
ci3        var portc.5;infrarojo head
ci4        var portc.6;infrarojo head
ct         var portc.7;enable luz
m1         var portd.0;motor1 adelante
m2         var portd.1;motor1 atras
m3         var portd.2;motor2 adelante
m4         var portd.3;motor2 atras
m5         var portd.4;motor3 adelante
m6         var portd.5;motor3 atras
m7         var portd.6;motor4 adelante
m8         var portd.7;motor4 atras
cn1        var portb.5;motor1 atras
cn2        var portb.4;motor2 adelante
radio1     var portb.3;motor2 atras
radio2     var portb.2;motor3 adelante
radio3     var portb.1;motor3 atras
radio4     var portd.0;motor4 adelante
en         var porte.0;enable head
inicio ;seleccion de accion

if c1=1 then mov
low m1
goto inicio
mov
high m1
goto inicio
end
Probando esa pequeña acción de solo accionar m1 no hace nada!
supongo que va a suceder lo mismo cuando envié el 1 a la acción del servo desde el 16f877a al 16f84a el esquema esta bien y todo bien por que funcionan los dos pics individualmente pero no colectivamente debería agregar algo ? entre la conexión de los pics? alguna compuerta? un maxx?
Que debo hacer ?
PD: Las pcb están separadas por un bus de datos de una placa a otra (gnd comun 5V común)
Gracias de antemano
 
Última edición por un moderador:
Saludos fife89
Algo que veo extraño en el programa para el 16F84A.
Es que algunas subrutinas están dentro de un bucle.
Entonces cuando llames a una, no podrás retomar el control del programa.

Y en el programa para el 16F877A te hace falta volver a tomar el control del programa,
después del primer IF. Por ejemplo...

Código:
Inicio:
If c1 = 1 Then mov
; Más código
;....
;....
GoTo Inicio

mov:
High m1
; Más código
;....
;....
GoTo Inicio
End

También te recomiendo que en PICBasic termines las etiquetas con dos puntos PE. MyLabel:
Para que en el IDE las puedas identificar fácilmente en el árbol del Code Explorer.

Suerte.
 
Saludos fife89
Algo que veo extraño en el programa para el 16F84A.
Es que algunas subrutinas están dentro de un bucle.
Entonces cuando llames a una, no podrás retomar el control del programa.

Y en el programa para el 16F877A te hace falta volver a tomar el control del programa,
después del primer IF. Por ejemplo...

Código:
Inicio:
If c1 = 1 Then mov
; Más código
;....
;....
GoTo Inicio

mov:
High m1
; Más código
;....
;....
GoTo Inicio
End

También te recomiendo que en PICBasic termines las etiquetas con dos puntos PE. MyLabel:
Para que en el IDE las puedas identificar fácilmente en el árbol del Code Explorer.

Suerte.

hola , coloque los ":" , y sucede lo mismo , el programa del 16f84a solo falta mejorarlo un poco pero en esencia funciona lo probe con leds cada funcion de cada boton pero el 16f877a es el que no reacciona al enviarle los 5v
creo que necesito agregarle algo al circuito pero no se que podria ser , tengo en mente un 74LS04
Saludos
 
coloque los ":" , y sucede lo mismo.
Si. No es para que cambie, es solo para que puedas encontrar la etiquetas en el Code Explorer.
el programa del 16f84a solo falta mejorarlo un poco
Estructuralo mejor y funcionara mejor. ;)
el 16f877a es el que no reacciona al enviarle los 5v
creo que necesito agregarle algo al circuito pero no se que podria ser , tengo en mente un 74LS04
No. Los puedes comunicar directamente, eso no hace falta.

Lo que te hace falta es definir que usaras el puerto A en modo digital.
Ya que estas usando el pin RA0 como entrada, y el puerto A es por default análogo.
Para eso configuralo digital I/O, usando el registro ADCON1
Antes de tu programa escribe esto.
ADCON1 = 7 ; Ó ADCON1 = 6 (11x) donde la x es Bit Unknown. Puede ser 1 ó 0

Suerte.
 
Última edición:
Lo que te hace falta es definir que usaras el puerto A en modo digital.
Ya que estas usando el pin RA0 como entrada, y el puerto A es por default análogo.
Para eso configuralo digital I/O, usando el registro ADCON1
Antes de tu programa escribe esto.
ADCON1 = 7 ; Ó ADCON1 = 6 (11x) donde la x es Bit Unknown. Puede ser 1 ó 0

Suerte.

Gracias por tu respuesta, eso estuve leyendo pero no entiendo bien como aplicarlo
especificar el puerto y tambien digamos quiero el puerto A como entrada en porta.0,1,2,3y el 4 solo de entrada podrias explicarme?
muchisimas gracias
PD: mañana trato de estructurarlo mejor a ver como me va que es un poco tarde :LOL: muchas gracias por los consejos :apreton:(y)
Sludos
 
Última edición:
no entiendo bien como aplicarlo
especificar el puerto y tambien digamos quiero el puerto A como entrada los pines 0123,y el 4 solo de entrada podrias explicarme?

Eso lo logras con las instrucciones TRISx
Como ejemplo facil, siempre toma el puerto como si fuera un número binario de 8 bits.
Entonces para hacer el puerto con los bits RA4 a RA0 como entradas, solo declaras esto.

TRISA = %00011111
Los ceros a la izquierda son redundantes, así que se pueden omitir.
Muchos los dejan o ponen los 8 ceros, pero no tiene caso, ya sabemos que 0+0+0+0... = 0

Y empiezas a contar desde el bit más significativo que es el bit 7
RA7,RA6,RA5... Etc.
Los ceros significan que ese bit será salida, y los unos entrada.

Esto es elemental, así que te recomiendo te leas un curso. ;)

Suerte.
 
Esto es elemental, así que te recomiendo te leas un curso. ;)

Suerte.

hola, me lei el curso de aca y tenia ciertos cabos sueltos , pero bueno anoche me compre un libro de pbp me lo leere para estructurar mejor mis programas, gracias por la respuesta pero, no me respondiste completamente , como se hace lo de convertir analogo a digital un solo puerto
te agradezco tu ayuda
esto es para un proyecto de la u
 
Última edición:
no me respondiste completamente , como se hace lo de convertir analogo a digital un solo puerto
Ahhh!!! OK.
Como te decía anteriormente, configurando en registro ADCON1
Para saber que pines quieres análogos y que pines digitales, necesitas tener a la mano la hoja de datos.
Buscas las sección referente al registro ADCON1, y en ella se explica que bits tienes modificar.
Algo que yo hago para determinar que registro es el involucrado, es buscar en el árbol 'Bookmarks',
la sección I/O Ports. La expandes y veras la sección PORTA and TRISA registers.
Le das click y veras un ejemplo de inicialización del puerto A en lenguaje ensamblador.
Buscas el registro al que se hace referencia, en este caso veras que es ADCON1
Y viene algo como esto...
movlw 0x06
movwf ADCON1
Aquí se esta moviendo el literal w que tiene el valor 6, al registro ADCON1.
Si existen más puertos que tienen conversores AD sigues buscando.
Al inicio de las hojas de datos viene el diagrama de pines.
Te fijas cuales tienen AD, y vemos que el PIC16F877A tiene también AD en el puerto E
Así que buscas en Bookmarks PORTE and TRISE registers. Y veras que seguimos con ADCON1.
Ahora haces una búsqueda (Control + F) es lo que yo hago. Escribes ADCON1,
seleccionando que busque solo palabras exactas.
Encontraras varias, haces F3 hasta que encuentres ADCON1 REGISTER
Allí está toda la información referente a la configuración de los pines involucrados. ;)

Suerte.
 
Última edición:
Muchísimas gracias
entonces según lo que dijiste sería
ADCON1 = %0000011x que sería todos los puertos A y E en digital
Así es. Solo cambia la x por un 1 ó un 0 para que el compilador no produzca error.
Y si omitimos los ceros a la izquierda, quedaría así...
ADCON1 = %110
ó
ADCON1 = %111

Saludos.
 
Así es. Solo cambia la x por un 1 ó un 0 para que el compilador no produzca error.
Y si omitimos los ceros a la izquierda, quedaría así...
ADCON1 = %110
ó
ADCON1 = %111

Saludos.

entonces en la tabla por que coloca una x? bueno de todas maneras, si quiero todos los pines de A y E en digital es
ADCON1 = %110
Saludos
 
entonces en la tabla por que coloca una x?

ADCON1 = 7 ; Ó ADCON1 = 6 (11x) donde la x es Bit Unknown. Puede ser 1 ó 0
el Bit marcado con una x dice la tabla x = Bit is unknown. (Bit con valor desconocido)
Y no tiene importancia en esa configuración. Debe ser sustituida por un 1 ó un 0
Recuerda que estamos expresando los valores en binario. No debes poner una x
si quiero todos los pines de A y E en digital es
ADCON1 = %110
Si. En binario así es como debe ser.

Saludos.
 
bueno muchas gracias por la ayuda me voy a dedicar a mejorar el programa y a realizar las pruebas respectivas, cuando lo termine lo cuelgo aca :D
 
bueno esto fue lo que logre pero no anda :LOL: no se
Código:
@ DEVICE PIC16F877A   ;Seleccion del Microcontrolador PIC16F877A
@ DEVICE xt_OSC       ;Seleccion del Tipo de oscilador XT de Cristal
@ DEVICE WDT_Off      ;Seleccion del Watchdog Timer Apagado
@ DEVICE PWRT_On     ;Seleccion del Power-on Reset Apagado
@ DEVICE BOD_Off      ;Seleccion del Brown-out Reset Apagado
@ DEVICE LVP_OFF      ;Seleccion del Low-Voltage Programming Apagado
@ DEVICE WRT_OFF      ;Seleccion del Flash Program Memory Write Apagado
@ DEVICE DEBUG_OFF    ;Seleccion del In-Circuit Debugger Apagado
@ DEVICE CPD_OFF      ;Seleccion del Data EEPROM Memory Code Protection Apagado
@ DEVICE PROTECT_Off  ;Seleccion del Flash Program Memory Code Protection Apagado
a var byte
x var byte
z var byte
i var byte
y var byte
ADCON1 = %000110
TRISB = %11110000  'Puerto B del bit 0 al 4 como entrada
TRISC = %01111111  'Puerto A como salida
TRISD = %00001111  'Puerto A como salida                    
Define OSC 4  'Definicion de oscilador a 4MHZ
c1         var porta.0;control de ubicacion
c2         var porta.1;control de seguidor de luz
c3         var porta.2;control de seguidor de linea negra
c4         var porta.3;control por radiofrecuencia
cservo     var porta.4;control de servo
cl1        var portc.0;luz1
cl2        var portc.1;luz2
cl3        var portc.2;luz3
cid1       var portc.3;infrarojo derecha
cii2       var portc.4;infrarojo izquierda
cis3       var portc.5;infrarojo suelo derecha
cis4       var portc.6;infrarojo suelo izquierda
ct         var portc.7;enable luz
m1         var portd.0;motor1 adelante
m2         var portd.1;motor1 atras
m3         var portd.2;motor2 adelante
m4         var portd.3;motor2 atras
cif        var portd.5;infrarojo frente
cih        var portd.6;infrarojo cabeza
ens        var portd.7;habilitar suelo
cn1        var portb.5;cny izquierda
cn2        var portb.4;cny derecha
radio1     var portb.3;radiocontrol1
radio2     var portb.2;radiocontrol2
radio3     var portb.1;radiocontrol3
radio4     var portd.0;radiocontrol4

;comienzo programa
inicio ;accion a ejecutar
if c1=1 then suelo;autonomo
if c2=1 then luz;
if c3=1 then cny
if c4=1 then radio;radiocontrol 
low m1:low m2:low m3:low m4:low ens:low ct:low cservo
goto inicio
luz
if (cl1=0) and (cl3=1) then  luz1
if (cl1=1) and (cl3=0) then  luz2
if(cl3=1) then luz3
low m1:low m2:low m3:low m4;detener motores
goto luz

luz1
low m1:high m2:high m3:low m4;izquierda
goto luz

luz2
high m1:low m2:low m3:high m4; derecha
goto luz

luz3
high m1:low m2:high m3:low m4 ;adelante
goto luz

cny
if (cn1=0) and (cn2=0)then high m1:low m2:high m3:low m4; adelante
if (cn1=1) and (cn2=0)then high m1:low m2:low m3:high m4 ; derecha 
if (cn1=0) and (cn2=1)then low m1:high m2:high m3:low m4; izquierda
pause 10
goto cny

suelo;deteccion de suelo
high ens;hablitar infrarojo suelo
if (cis3=1) and (cis4=1) then auto;hay suelo en derecha e izquierda 
if (cis3=1) and (cis4=0) then izquierda;hay suelo en derecha
if (cis3=0) and (cis4=1) then derecha;hay suelo en izquierda
if (cis3=0) and (cis4=0) then atras;no hay suelo
low m1:low m2:low m3:low m4;detener motores 
goto suelo

izquierda;movimiento izquierda
high m2:high m4:low m3:low m1;  movimiento atras
pause 500
low m1:low m2:low m3:low m4;detener motores
pause 50
high m2:high m3:low m1: low m4;movmiento hacia izquierda
pause 300
goto suelo; devuelve a comprobacion de suelo

derecha;movimiento izquierda
high m2:high m4:low m3: low m1; movimiento atras
pause 500
low m1:low m2:low m3:low m4;detener motores
pause 50
high m1:high m4:low m2:low m3;movmiento hacia derecha
pause 300
goto suelo;devuelve a comprobacion de suelo

atras; movimiento hacia atras
high m2:high m4:low m1:low m3;movimiento hacia atras
pause 500
low m1:low m2:low m3:low m4;detener motores
pause 300
goto suelo

auto
x=0
y=0
z=0
a=0
if (cid1=1) and (cii2=1) then det1 ;movimiento hacia atras  
if (cid1=1) and (cii2=0) then det2 ;movimiento hacia izquierda
if (cid1=0) and (cii2=1) then det3 ;movimiento hacia derecha
if (cid1=1) and (cif=1)  then det2 ;movimiento hacia izquierda
if (cii2=1) and (cif=1)  then det3 ;movimeinto hacia derecha
if (cif=1)               then det4 ;movimiento hacia
high m1:low m2:high m3:low m4  ;adelante
low cservo:low ct; deshabilitar controles de luz y servo

goto auto
det1
low m1:low m2:low m3:low m4;detener motores
pause 20
low m1:high m2:low m3:high m4
pause 200
low m1:low m2:low m3:low m4
goto movc
det2
low m1:low m2:low m3:low m4;detener motores
pause 20                      ;espera
low m1:high m2:high m3:low m4;movimiento izquierda
pause 200
low m1:low m2:low m3:low m4
goto movc
det3
low m1:low m2:low m3:low m4
pause 20
high m1:low m2:low m3:high m4;movimiento derecha
pause 200
low m1:low m2:low m3:low m4;detener motores
goto movc

det4
low m1:low m2:low m3:low m4
pause 20
high m1:low m2:low m3:high m4;movimiento derecha
pause 400
low m1:low m2:low m3:low m4;detener motores
goto movc

movc;comprobacion de cabeza atras
high cservo
for i=150 to 250 step 1 ;movmiento centro a izquierda
if (cih=1) then x=3;
pause 10
next i
a=x+a
pause 680
for i=250 to 150 step -1 ;movimiento izquierda hacia centro
pause 10
next i
if (cih=1) then y=4
a=y+a
pause 700

for i=150 to 70 step -1 ;movimiento centro a derecha
if (cih=1) then z=2
pause 10
next i
a=z+a
pause 700

if a=2 then movimiento2 ;obstaculo a la derecha
if a=3 then movimiento1 ;obstaculo en la izquierda
if a=4 then movimiento1 ;obstaculo en el medio
if a=5 then movimiento3 ;obstaculo en derecha e izquierda
if a=6 then movimiento3 ;obstaculo en el centro y la derecha
if a=7 then movimiento4 ;obstaculo centro y izquierda

goto auto

movimiento1;movimiento derecha
pause 10
low m1:low m2:low m3:low m4;detener motores
pause 20                     ;espera
high m1:low m2:low m3:high m4;movmiento derecha
pause 200
low m1:low m2:low m3:low m4 ;detener motores
goto auto

movimiento2;movimiento izquierda
pause 10
low m1:low m2:low m3:low m4;detener motores
pause 20                      ;espera
low m1:high m2:high m3:low m4;movimiento izquierda
pause 200
low m1:low m2:low m3:low m4
goto auto

movimiento3
pause 10
low m1:low m2:low m3:low m4;detener motores
pause 20                    ;espera
low m1:high m2:low m3:high m4;movimiento atras
pause 200                    ;espera
low m1:low m2:low m3:low m4;detener motres
pause 10                    ;espera
low m1:high m2:high m3:low m4;movimiento izquierda
pause 400
low m1:low m2:low m3:low m4;detener motores
goto auto

movimiento4
pause 10
low m1:low m2:low m3:low m4;detener motores
pause 20                    ;espera
low m1:high m2:low m3:high m4;movimiento atras
pause 200                    ;espera
low m1:low m2:low m3:low m4;detener motres
pause 10                    ;espera
high m1:low m2:low m3:high m4;movimiento derecha
pause 400
low m1:low m2:low m3:low m4;detener motores
goto auto
 
radio ;radiocontrol
if radio1=1 then high m1: high m3: low m2: low m4;adelante
if radio2=1 then high m2: high m4: low m3: low m1; atras
if radio3=1 then high m1: high m4: low m2: low m3;derecha
if radio4=1 then high m2: high m3: low m1: low m2;izquierda
low cservo: low ct; deshabilitar controles de luz y servo
low m1: low m2: low m3: low m4 ;detener motores
goto radio


end
 
El esquema esta muy enredado como para subirlo pero este proyecto esta quedando prolijo, ya pude resolver el problema en el codigo gracias D@rkbytes por tu colaboración ya casi esta por terminado y apenas termine subo o si tengo duda sigo posteando
 
Atrás
Arriba