Autor Tema: Ejemplos en PBP y PROTEUS  (Leído 266857 veces)

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

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Ejemplos en PBP y PROTEUS
« Respuesta #195 en: 28 de Junio de 2008, 12:27:21 »
Hola:

Claro que protón tambien tiene interrupciones, que sería de los compiladores sin estas opciones, no?  Son estas:

ON INTERRUPT     Execute a BASIC or ASSEMBLER subroutine using a SOFTWARE interrupt.
ON_INTERRUPT     Execute an ASSEMBLER subroutine on a HARWARE interrupt.
ON_LOW_INTERRUPT Execute an ASSEMBLER subroutine when a LOW PRIORITY HARDWARE interrupt occurs

las dos primeras no son iguales, la una está con espacio y la otra unida con un guión bajo, son diferentes como se puede apreciar en la descripción.

Si no quieres utilizar interrupciones, se me ocurre que el bucle puede ser más corto, eso reduce el tiempo de ejecución, aunque sigo pensando que no haría falta el bucle, ya que puedes hacer lo siguiente:


Device = 16F84A
XTAL 4

TRISA.0=1

Dim i As Byte
   
inicio:
    If PORTA.0=1 Then
        GoSub Atras
    EndIf
    GoSub Adelante
    GoTo inicio
   
Adelante:
    'valores para mover el motor adelante
    PORTB=%00000110:DelayMS 20
    PORTB=%00000101:DelayMS 20   
    PORTB=%00001010:DelayMS 20   
    PORTB=%00001010:DelayMS 20
    Return
   
Atras:
    'valores para mover el motor atrás
    PORTB=%00000110:DelayMS 20
    PORTB=%00000101:DelayMS 20   
    PORTB=%00001010:DelayMS 20   
    PORTB=%00001010:DelayMS 20
    Return


De esta forma, en mover los cuatro pasos tardará 80 ms y puede tranquilamente leer el estado del pin en el que tienes colocado el pulsante, obviamente, si pones menos tiempo entre paso y paso del motór, la lectura del pin en el que tienes el sensor o el pulsador será más rápido.

Lo que tienes que hacer es colocar los valores correctos para que el motor gire, ya que yo les copié igual y no se la secuencia correcta, pruébalo a ver que te parece y me cuentas.

Recuerda, el motór girará hacia atrás mientras tengas presionado el pulsador, si lo sueltas enseguida, solo se moverá cuatro pasos hacia atrás.

Desconectado manupri

  • PIC10
  • *
  • Mensajes: 21
Re: Ejemplos en PBP y PROTEUS
« Respuesta #196 en: 28 de Junio de 2008, 21:07:13 »
hola
Gracias por la remisión de ambos, maestro LordLafebre, el codigo va perfecto, pero solo en este caso, quiero decir con tu trozo de código ciertamente el motor gira hacia delante, y si se le pulsa el button  realiza el giro hacia atras, pero mi problema sigue persistiendo
Y quiza la culpa ha sido mia por no comentar el error con el código completo, voy a explicar de nuevo y espero me perdonen la confusión.
Este es realmente el código completo, y mi intención es hacer rodar el motor hacia la derecha, el tiempo indicado por el bucle (FOR NEXT) y el tiempo dado por los ( DELAYSMS 20 ) en este caso 20 x 4 x 10 del bucle  ( FOR I=0 TO 10 )y una vez termina pasa ala siguiente secuencia donde la demora de los DELAYMS es mayor, de forma que el motor realiza el giro más corto, la secuencia de pasos tarda más en ejecutarse, no se si me explico, y aqui concretamente es  donde no me responde el pulsador osea el button, al menos en la simulación de proteus.
Con todo esto quiero decir, si es posible interrumpir la secuencia, dejo el codigo para que lo inspecciones.


Device = 16F84A
XTAL 4

TRISA.0=1
TRISB=%00000000
Dim i As Byte
   
inicio:
    If PORTA.0=1 Then
        GoSub Atras
    EndIf
    GoSub Adelante
    GoTo inicio
   
Adelante:
    'valores para mover el motor adelante
    FOR i=0 TO 10

    PORTB=%00000110:DelayMS 20 '
    PORTB=%00000101:DelayMS 20 '   
    PORTB=%00001001:DelayMS 20 '   
    PORTB=%00001010:DelayMS 20 '
                                                     '
    NEXT i                                          '''''''''''''''''' EN ESTE TROZO DE CÓDIGO ES CUANDO QUEDA INHABILITADO EL BUTTON                                     
                                                      '               LO DEMAS TODO MARCHA PERFE
    PORTB=%00000110:DelayMS 200 '
    PORTB=%00000101:DelayMS 200  ' 
    PORTB=%00001001:DelayMS 200  '
    PORTB=%00001010:DelayMS 200  '


   Return
   
Atras:
    'valores para mover el motor atrás
   
    FOR I=0 TO 5     

    PORTB=%00001010:DelayMS 20
    PORTB=%00001001:DelayMS 20   
    PORTB=%00000101:DelayMS 20   
    PORTB=%00000110:DelayMS 20
 NEXT I
 
Return
GOTO inicio

Gracias por todo espero tu respuesta maestro LordLafebre, saludos

Desconectado Mc Guiver

  • PIC10
  • *
  • Mensajes: 31
Re: Ejemplos en PBP y PROTEUS
« Respuesta #197 en: 07 de Julio de 2008, 14:17:59 »
Estimado manupri:
No se como es el proteus, nunca practiquè con el, solo he probado con picaxe (basic) y ahora lo estoy haciendo con Pic Basic Pro pero creo que si el proteus tambien se edita en basic no debe ser muy distinto al ejemplo que subì un poco mas arriba de esta pàgina, tal vez uno de los maestros del foro que estè con proteus te pueda dar una mano. Lamento no poder ayudarte esta vez, pero encantado otra vez que lo pueda hacer
saludos
Mc Guiver

Desconectado Mc Guiver

  • PIC10
  • *
  • Mensajes: 31
Re: Ejemplos en PBP y PROTEUS
« Respuesta #198 en: 07 de Julio de 2008, 14:23:38 »
Estimados piclisteros:
Si tengo un pic con entradas analògicas ,  si no las defino como analògicas,¿ arranca con entradas digitales? o tambien las tengo que definir como digitales?
Gracias  por la respuesta
Mc Guiver

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Ejemplos en PBP y PROTEUS
« Respuesta #199 en: 07 de Julio de 2008, 14:38:30 »
Que tal Mc guiver!
Si utilizas un pic con entradas analogicas como por ejemplo el pic16f877, este al al momento de energizarlo o cuando se produzca un reset, tendra sus entradas en modo analogico, por defecto, en el caso del pic16f877 sera el puerto a y el e  :mrgreen:

Si quieres que funcionen como entrada digitales debes configurarlas para ello, a traves del regitro adcom para este pic  :mrgreen:
Siempre lee el data sheet para ver cuales registros debes modificar para obtener entradas analogicas o digitales

Saludos

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Ejemplos en PBP y PROTEUS
« Respuesta #200 en: 07 de Julio de 2008, 17:57:14 »
Ralf tiene razón, al momento de un reset el valor que toma por defecto el ADCON1 es 0x00, así que se configura todas las entradas como analógicas. No obstante, si estás trabajando con PBP, no tienes que definir nada, al usar la entrada como digital, él hace las configuraciones necesarias para que sea así. Diferente a si trabajas con ellos como puertos analógicos, ahí si tienes que definir el ADCON1 y ADCON0 para decirle al compilador cuáles serán analógicas y cuáles digitales.
Tengo tiempo que no trabajo con el basic, pero cuando lo hacía, si usaba el PORTA como digital creo recordar que nunca declaré el ADCON1 y funcionaba perfecto como digital.
En todo caso el maestro Lafebre puede corregirme si estoy equivocado o hacer alguna aclaratoria.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado andyctnt

  • PIC10
  • *
  • Mensajes: 1
Re: Ejemplos en PBP y PROTEUS
« Respuesta #201 en: 10 de Julio de 2008, 02:36:45 »
hola como estas no se si podrias ayudarme con las funciones matematicas de SENO Y COS para un pic 16f877.............
como almaceno la informacion en la memoria EPROM de pic con todos los decimales....
por fa es de urgen...
de ante mano gracias

Desconectado Mc Guiver

  • PIC10
  • *
  • Mensajes: 31
Re: Ejemplos en PBP y PROTEUS
« Respuesta #202 en: 13 de Julio de 2008, 23:21:30 »
Gracias ralf2 lo veré en el datasheet.

Mc Guiver

Desconectado Darkmoon

  • PIC10
  • *
  • Mensajes: 4
Re: Ejemplos en PBP y PROTEUS
« Respuesta #203 en: 02 de Septiembre de 2008, 15:55:36 »
Hola chicos, un saludo desde Barcelona España.

les pongo un ejemplo que he desarrollado para el control de 4 servos. No se si se me ha escapado algo por que no puedo probarlo aun, empeze hace 3 dias y esto es lo que he sacado en claro. Espero que me corrijan si no esta todo bien.

Por cierto, la pagina esta mas tiempo caida que funcionando o es que quizas se sature con tanta gente?

Ahi va el codigo.

DEFINE   OSC   4       ' Para trabajar con un cristal de 4MHz
wsave VAR BYTE $20 system   ' Guarda el registro W
ssave VAR BYTE bank0 system   ' Guarda el registro STATUS
psave VAR BYTE bank0 system   ' Guarda el registro PCLATH

' Aqui van las demas variables a usar
servo1 var byte
servo2 var byte
servo3 var byte
servo4 var byte
contador var byte
 

INTCON.2=0 'apagar flag de desbordamiento
T0CON.7=0 'Timer apagado

TMR0H=0
TMR0L=5 'Faltan aun 250 ciclos para que desborde. 4 instrucc por ciclo a 4 MHz es 1MHz = 1us 250 * 80 = 20ms

T0CON.6=1 '8 bit mode
T0CON.5=0 'Reloj interno
T0CON.4=0 'Flanco de subida
T0CON.3=1 'Sin prescale
T0CON.2=0 'Prescale
T0CON.1=0 'Prescale
T0CON.0=0 'Prescale
contador = 0
     
TRISB = %11111111 'Entradas
TRISC = %00000000 'Salidas
pause 250
goto inicio



' SUBRUTINAS DE EJECUCION

posini:
    servo1 = 150 '150 es un pulso de 1,5 milisegundos
    servo2 = 150
    servo3 = 150
    servo4 = 150
resume

'********************* Vector de Interrupcion****************** (esto lo saque de un foro, siento no acordarme de quien lo puso)

DEFINE INTHAND Int_Vector           ' Handler de Interrupcion

ASM
Int_Vector
    MOVWF wsave                      ; Guardamos el registro W
    MOVF STATUS,W
    CLRF STATUS                     ; Guardamos el registro STATUS
    MOVWF ssave
    MOVF PCLATH,W      ; Guardamos el registro PCLATH
    MOVWF psave
    CLRF PCLATH
ENDASM
;*****************Codigo de interrupcion**********************
    if contador < 80 then    'se tiene que desbordar el timer0 80 veces para ser 20ms
        contador = contador + 1
        TMR0H=0
        TMR0L=5 'volvemos a cargarle 5 para que falten 250
    else   
        pulsout PORTC.0, servo1
        pulsout PORTC.1, servo2
        pulsout PORTC.2, servo3
        pulsout PORTC.3, servo4
        contador = 0
        TMR0H=0
        TMR0L=5
    endif
ASM   ;****** Fin de Interrupcion ***********
End_Int
    CLRF STATUS
    MOVF psave,W
    MOVWF PCLATH                     ; Restauramos el registro PCLATH
    MOVF ssave,W
    MOVWF STATUS                     ; Restauramos el registro STATUS
    SWAPF wsave,F
    SWAPF wsave,W                    ; Restauramos el registro W
    RETFIE
ENDASM

'************************Inicio del Programa*************************
Inicio:
    gosub posini
    T0CON.7=1 'Arranco timer 0
' aqui meto el codigo que haga variar los tiempos de los pulsos en servo1 servo2 servo3 y servo4
    goto inicio 


He leido que haciendo la interrupcion con el handler en asm aun estando en un pause 20000 el pic da preferencia a la interrupcion, es eso cierto?

Un saludo y por favor, criticar mi codigo que aprenderemos todos! 

EDITO por un problema ortografico...
« Última modificación: 02 de Septiembre de 2008, 15:58:21 por Darkmoon »

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Ejemplos en PBP y PROTEUS
« Respuesta #204 en: 02 de Septiembre de 2008, 16:18:47 »
que tal darmoon!
Citar
He leido que haciendo la interrupcion con el handler en asm aun estando en un pause 20000 el pic da preferencia a la interrupcion, es eso cierto?

Eso es correcto si la interrupcion es por hardware este salta directamente a la rutina de atencion a la interrupcion, pero si utilizas interrupciones por software y entras en un pause este espera a que termine el pause para saltar a la rutina de interrupcion.

Eso no pasa en proton ahora  :mrgreen:

Saludos

Desconectado Darkmoon

  • PIC10
  • *
  • Mensajes: 4
Re: Ejemplos en PBP y PROTEUS
« Respuesta #205 en: 03 de Septiembre de 2008, 03:55:21 »
Hola Ralf,

Me quedo aun con la curiosidad de que le echéis un vistazo al código, es posible que pueda funcionar? compila bien, pero como no tengo ni proteus ni pic ni nada... AUN!

Tengo aun una duda, la rutina de interrupción que he puesto salta con cualquier interrupción que se produzca en el pic verdad? lo que ocurre es que como solo he configurado el timer0 solo existirá esa interrupción no? estoy equivocado?

Un saludo.

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Ejemplos en PBP y PROTEUS
« Respuesta #206 en: 03 de Septiembre de 2008, 09:55:01 »
Que tal darkmoon!
Mira de momento no tengo el pic basic pro instalado en mi maquina para poderlo probar  :shock:
Pero veo una cosita  :mrgreen:
Los servos no se moveran todos al mismo tiempo, sino que se movera primero el conectado al portc.0 luego el conectado al portc.1 y asi sucesivamente lo que modificara el periodo de la señal del servo  :shock:  alargandolo.

Saludos

Desconectado Darkmoon

  • PIC10
  • *
  • Mensajes: 4
Re: Ejemplos en PBP y PROTEUS
« Respuesta #207 en: 04 de Septiembre de 2008, 17:59:28 »
Hola Ralf2,

Ya me he dado cuenta de que en el ultimo servo iran los 20ms + la duracion de los tres primeros, pero piensa que el tiempo que pasa a nivel bajo el cuarto servo sera igual que el que pasa a nivel bajo el primero, ya que despues del pulso del primer servo tiene que esperar los pulsos de los otros 3 servos estando el a nivel bajo, lo cual podria llegar a aumentar el periodo de 20ms a 26ms como maximo. Puedo hacer que en vez de 20ms sean 17ms a nivel bajo, y asi con todos los servos al minimo se haran 20ms a nivel bajo y 23 como maximo y teniendo en cuenta que los 20ms es un poco orientativo (de 20 a 30ms los servos funcionan) se podrian llegar a conectar incluso 11 servos al mismo tiempo. Configurando la interrupcion a 10ms + 10ms si todos los servos estan al minimo = 20ms de nivel bajo y si todos van al maximo serian 10ms de la interrupcion + 20ms = 30ms ya rozando el maximo!!

Madre mia que ladrillo!!! Lo leo yo mismo y casi no lo entiedo!!  :D :D :D

Bueno, un saludo y gracias por leer.

Desconectado Darkmoon

  • PIC10
  • *
  • Mensajes: 4
Re: Ejemplos en PBP y PROTEUS
« Respuesta #208 en: 04 de Septiembre de 2008, 18:58:23 »
Por cierto Ralf2, tengo que comprarme un Pic y quisiera que me aconsejaras por un PIC18 de 40 pines (pa no quedarme sin señales, jeje) que vaya bien para mover estos servos, me da igual si es el mejor o el peor, quiero uno que me funcione bien y que sea un poco actual, es que yo me pierdo entre tantos datos del datasheet...
Cuando tenga el primero ya probare de ver que diferencias hay entre uno y otro...
Ah, tengo el JDM plus para "quemarlo", esta bien?
Un saludo.

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Ejemplos en PBP y PROTEUS
« Respuesta #209 en: 04 de Septiembre de 2008, 22:41:01 »
Que tal darkmoon!
Bueno amigo no se como estes con tus conocimientos en microcontroladores pic, pero sino sabes programar en asembler, primero te recomendaria que empezaras por alli, esto porque segun yo  :mrgreen: el asembler te permite conocer bien como opera el pic internamente, en cuanto a sus registros, timer ...
Si es asi puedes utilizar un pic menos potente que uno de la serie p18, ese puede ser por ejemplo el pic16f877A que es de 40 pines y hay mucha informacion sobre el  :mrgreen:

Si estas claro con el asembler y quieres dar el paso a uno mas avanzado, puedes utilizar por ejemplo el pic18F452 que es parecido a la serie pic16F877A, pero con las ventajas de la serie P18  :mrgreen:

Luego te puedes meter con otros pic mas avanzados como el pic18f2550 que tiene un puerto USB o cualquier otro

Saludos


 

anything