Autor Tema: ayuda de comprension de programa muy avanzado  (Leído 5731 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
ayuda de comprension de programa muy avanzado
« en: 19 de Septiembre de 2015, 20:22:04 »
hola, necesito que me ayuden a entender un programa que hice en asm cuando era muy bueno para programar en el programa consiste en el movimiento de motores con el pueto b pero el mayor problema es que el programa evoluciono dos veces en menos de una semana y naturalmente hoy en dia no puedo entender la ultima version del programa por eso voy a poner los tres programas para que noten la evolucion del programa y men puedan explicar mejor la ultima version del programa
version 1
Código: [Seleccionar]
#INCLUDE<P18F4550.INC>


#DEFINE PAR   PORTB,0
#DEFINE LED PORTC,2
#DEFINE MOTOR1_1 PORTA,0
#DEFINE MOTOR1_2 PORTA,1
#DEFINE MOTOR2_1 PORTA,2
#DEFINE MOTOR2_2 PORTA,3
#DEFINE MOTOR3_1 PORTB,2
#DEFINE MOTOR3_2 PORTB,3
#DEFINE MOTOR4_1 PORTA,4
#DEFINE MOTOR4_2 PORTB,6
#DEFINE SEL_DERECHA PORTB,7
#DEFINE SEL_ADELANTE PORTE,0
#DEFINE SEL_ATRAS PORTE,1
#DEFINE SEL_IZQUIERDA PORTE,2
#DEFINE SEL_DIAGONAL_ADE_DER PORTB,1
#DEFINE SEL_DIAGONAL_ADE_IZQ PORTB,4
#DEFINE SEL_DIAGONAL_ATR_DER PORTB,5
#DEFINE SEL_DIAGONAL_ATR_IZQ PORTA,6








CBLOCK 0x00
CONTA_1
CONTA_2
CONTA_3
CONTA_4
CONTA_5
CONTA_6
CONTA_7
CONTA_8
CONTA_9


ENDC

CLRF TRISD   ;puerto D como salida
CLRF TRISC
CLRF TRISB
CLRF TRISA
CLRF TRISE

OSCILADOR
BSF OSCCON,6
BSF OSCCON,5
BCF OSCCON,4

PUERTOS_DIGITALES

BSF ADCON1,0
BSF ADCON1,1
BSF ADCON1,2
BSF ADCON1,3



CALL MOTORES

GOTO OTRO

OTRO
BSF LED
CALL Retardo_500ms
BCF LED
CALL Retardo_500ms
GOTO OTRO

MOTORES
BCF SEL_ADELANTE
BCF SEL_ATRAS
BCF SEL_IZQUIERDA
BCF SEL_DERECHA
BCF SEL_DIAGONAL_ADE_DER
  BCF SEL_DIAGONAL_ADE_IZQ
  BCF SEL_DIAGONAL_ATR_DER
  BCF SEL_DIAGONAL_ATR_IZQ
BTFSS SEL_ATRAS
GOTO  ATRAS ;ATRAS 
BCF SEL_ADELANTE
BCF SEL_ATRAS
BCF SEL_IZQUIERDA
BCF SEL_DERECHA
BCF SEL_DIAGONAL_ADE_DER
  BCF SEL_DIAGONAL_ADE_IZQ
  BCF SEL_DIAGONAL_ATR_DER
  BCF SEL_DIAGONAL_ATR_IZQ
BTFSS SEL_DERECHA
GOTO  DERECHA ;DERECHA
BCF SEL_ADELANTE
BCF SEL_ATRAS
BCF SEL_IZQUIERDA
BCF SEL_DERECHA
BCF SEL_DIAGONAL_ADE_DER
  BCF SEL_DIAGONAL_ADE_IZQ
  BCF SEL_DIAGONAL_ATR_DER
  BCF SEL_DIAGONAL_ATR_IZQ
BTFSS SEL_IZQUIERDA
GOTO IZQUIERDA ;IZQUIERDA
BCF SEL_ADELANTE
BCF SEL_ATRAS
BCF SEL_IZQUIERDA
BCF SEL_DERECHA
BCF SEL_DIAGONAL_ADE_DER
  BCF SEL_DIAGONAL_ADE_IZQ
  BCF SEL_DIAGONAL_ATR_DER
  BCF SEL_DIAGONAL_ATR_IZQ
BTFSS SEL_ADELANTE ;ADELANTE
GOTO ADELANTE
BCF SEL_ADELANTE
BCF SEL_ATRAS
BCF SEL_IZQUIERDA
BCF SEL_DERECHA
BCF SEL_DIAGONAL_ADE_DER
  BCF SEL_DIAGONAL_ADE_IZQ
  BCF SEL_DIAGONAL_ATR_DER
  BCF SEL_DIAGONAL_ATR_IZQ
BTFSS SEL_DIAGONAL_ADE_DER ;DIAGONAL ADELANTE DERECHA
GOTO  DIAGONAL_ADE_DER
BCF SEL_ADELANTE
BCF SEL_ATRAS
BCF SEL_IZQUIERDA
BCF SEL_DERECHA
BCF SEL_DIAGONAL_ADE_DER
  BCF SEL_DIAGONAL_ADE_IZQ
  BCF SEL_DIAGONAL_ATR_DER
  BCF SEL_DIAGONAL_ATR_IZQ
BTFSS SEL_DIAGONAL_ADE_IZQ ;DIAGONAL ADELANTE IZQUIERDA
GOTO DIAGONAL_ADE_IZQ
BCF SEL_ADELANTE
BCF SEL_ATRAS
BCF SEL_IZQUIERDA
BCF SEL_DERECHA
BCF SEL_DIAGONAL_ADE_DER
  BCF SEL_DIAGONAL_ADE_IZQ
  BCF SEL_DIAGONAL_ATR_DER
  BCF SEL_DIAGONAL_ATR_IZQ
BTFSS SEL_DIAGONAL_ATR_DER ;DIAGONAL ATRAS DERECHA
GOTO DIAGONAL_ATR_DER
BCF SEL_ADELANTE
BCF SEL_ATRAS
BCF SEL_IZQUIERDA
BCF SEL_DERECHA
BCF SEL_DIAGONAL_ADE_DER
  BCF SEL_DIAGONAL_ADE_IZQ
  BCF SEL_DIAGONAL_ATR_DER
  BCF SEL_DIAGONAL_ATR_IZQ
BTFSS SEL_DIAGONAL_ATR_IZQ ;DIAGONAL ATRAS IZQUIERDA
GOTO DIAGONAL_ATR_IZQ
GOTO MOTORES


DIAGONAL_ADE_DER
BCF  MOTOR1_1
BCF  MOTOR1_2
BCF  MOTOR2_1
BCF  MOTOR2_2
BCF  MOTOR3_1
BCF  MOTOR3_2
BCF  MOTOR4_1
BCF  MOTOR4_2
CALL Retardo_5ms
BSF MOTOR1_1
BSF MOTOR2_1 
BSF MOTOR3_1
BSF MOTOR4_1
CALL Retardo_1s
BCF MOTOR1_2
BCF MOTOR2_2
BSF MOTOR3_2
BSF MOTOR4_2
GOTO MOTORES



DIAGONAL_ADE_IZQ
BCF  MOTOR1_1
BCF  MOTOR1_2
BCF  MOTOR2_1
BCF  MOTOR2_2
BCF  MOTOR3_1
BCF  MOTOR3_2
BCF  MOTOR4_1
BCF  MOTOR4_2
CALL Retardo_5ms
BSF MOTOR1_1
BSF MOTOR2_1
BSF MOTOR3_2
BSF MOTOR4_2
CALL Retardo_1s
BCF MOTOR1_2
BCF MOTOR2_2
BCF MOTOR3_1
BCF MOTOR4_1
GOTO MOTORES




DIAGONAL_ATR_DER
BCF  MOTOR1_1
BCF  MOTOR1_2
BCF  MOTOR2_1
BCF  MOTOR2_2
BCF  MOTOR3_1
BCF  MOTOR3_2
BCF  MOTOR4_1
BCF  MOTOR4_2
CALL Retardo_5ms
BSF MOTOR1_2
BSF MOTOR2_2
BSF MOTOR3_1
BSF MOTOR4_1
CALL Retardo_1s
BCF MOTOR1_1
BCF MOTOR2_1
BCF MOTOR3_2
BCF MOTOR4_2
GOTO MOTORES


DIAGONAL_ATR_IZQ
BCF  MOTOR1_1
BCF  MOTOR1_2
BCF  MOTOR2_1
BCF  MOTOR2_2
BCF  MOTOR3_1
BCF  MOTOR3_2
BCF  MOTOR4_1
BCF  MOTOR4_2
CALL Retardo_5ms
BSF MOTOR1_2
BSF MOTOR2_2
BSF MOTOR3_2
BSF MOTOR4_2
CALL Retardo_1s
BCF MOTOR1_1
BCF MOTOR2_1
BCF MOTOR3_1
BCF MOTOR4_1
GOTO MOTORES

ADELANTE
BCF  MOTOR1_1
BCF  MOTOR1_2
BCF  MOTOR2_1
BCF  MOTOR2_2
BCF  MOTOR3_1
BCF  MOTOR3_2
BCF  MOTOR4_1
BCF  MOTOR4_2
CALL Retardo_5ms
BSF MOTOR1_1
BSF MOTOR2_1 
CALL Retardo_1s
BCF MOTOR1_2
BCF MOTOR2_2
GOTO MOTORES

ATRAS
BCF  MOTOR1_1
BCF  MOTOR1_2
BCF  MOTOR2_1
BCF  MOTOR2_2
BCF  MOTOR3_1
BCF  MOTOR3_2
BCF  MOTOR4_1
BCF  MOTOR4_2
CALL Retardo_5ms
BSF MOTOR1_2
BSF MOTOR2_2
CALL Retardo_1s
BCF MOTOR1_1
BCF MOTOR2_1
GOTO MOTORES

DERECHA
BCF  MOTOR1_1
BCF  MOTOR1_2
BCF  MOTOR2_1
BCF  MOTOR2_2
BCF  MOTOR3_1
BCF  MOTOR3_2
BCF  MOTOR4_1
BCF  MOTOR4_2
CALL Retardo_5ms
BSF MOTOR3_1
BSF MOTOR4_1
CALL Retardo_1s
BCF MOTOR3_2
BCF MOTOR4_2
GOTO MOTORES

IZQUIERDA
BCF  MOTOR1_1
BCF  MOTOR1_2
BCF  MOTOR2_1
BCF  MOTOR2_2
BCF  MOTOR3_1
BCF  MOTOR3_2
BCF  MOTOR4_1
BCF  MOTOR4_2
CALL Retardo_5ms
BSF MOTOR3_2
BSF MOTOR4_2
CALL Retardo_1s
BCF MOTOR3_1
BCF MOTOR4_1
GOTO MOTORES



#INCLUDE<C:\Users\Jair Ampudia\Desktop\yair\/RETARDOS.INC>


END

aqui va la segunda version del programa
Código: [Seleccionar]
#INCLUDE<P18F4550.INC>

#DEFINE MOTOR1_1 PORTB,6
#DEFINE MOTOR1_2 PORTB,7
#DEFINE MOTOR2_1 PORTB,2
#DEFINE MOTOR2_2 PORTB,3
#DEFINE MOTOR3_1 PORTB,0
#DEFINE MOTOR3_2 PORTB,1
#DEFINE MOTOR4_1 PORTB,4
#DEFINE MOTOR4_2 PORTB,5
#DEFINE SEL_DER PORTA,0
#DEFINE SEL_IZQ PORTA,1
#DEFINE SEL_ATR PORTA,2
#DEFINE SEL_ADE PORTA,3
#DEFINE SEL_DIAGONAL_ADE_DER  PORTA,4
#DEFINE SEL_DIAGONAL_ADE_IZQ  PORTE,0
#DEFINE SEL_DIAGONAL_ATR_DER  PORTE,1
#DEFINE SEL_DIAGONAL_ATR_IZQ  PORTE,2


CLRF TRISB
MOVLW .255
MOVWF TRISA
MOVWF TRISE

CALL MOTORES_0


OSCILADOR
BSF OSCCON,6
BSF OSCCON,5
BCF OSCCON,4

PUERTOS_DIGITALES

BSF ADCON1,0
BSF ADCON1,1
BSF ADCON1,2
BSF ADCON1,3





MOTORES_P
BTFSS  SEL_DER
GOTO   DER
BTFSS  SEL_IZQ
GOTO   IZQ
BTFSS  SEL_ADE
GOTO   ADE
BTFSS  SEL_ATR
GOTO ATR
BTFSS SEL_DIAGONAL_ADE_DER
GOTO  DIAGONAL_ADE_DER
BTFSS SEL_DIAGONAL_ADE_IZQ
GOTO DIAGONAL_ADE_IZQ
BTFSS SEL_DIAGONAL_ATR_DER
GOTO DIAGONAL_ATR_DER
BTFSS SEL_DIAGONAL_ATR_IZQ
GOTO DIAGONAL_ATR_IZQ
CALL MOTORES_0
GOTO MOTORES_P


DER
BSF MOTOR3_1
BCF MOTOR3_2
BCF MOTOR1_1
BCF MOTOR1_2
BCF MOTOR2_1
BCF MOTOR2_2
BSF MOTOR4_1
BCF MOTOR4_2
GOTO MOTORES_P

IZQ
BCF MOTOR4_1
BSF MOTOR4_2
BCF MOTOR3_1
BSF MOTOR3_2
BCF MOTOR2_1
BCF MOTOR2_2
BCF MOTOR1_1
BCF MOTOR1_2
GOTO MOTORES_P

ADE
BSF MOTOR1_1
BCF MOTOR1_2
BCF MOTOR4_1
BCF MOTOR4_2
BCF MOTOR3_1
BCF MOTOR3_2
BSF MOTOR2_1
BCF MOTOR2_2
GOTO MOTORES_P

ATR
BCF MOTOR2_1
BSF MOTOR2_2
BCF MOTOR4_1
BCF MOTOR4_2
BCF MOTOR3_1
BCF MOTOR3_2
BCF MOTOR1_1
BSF MOTOR1_2
GOTO MOTORES_P

DIAGONAL_ADE_DER
BSF MOTOR1_1
BCF MOTOR1_2
BSF MOTOR3_1
BCF MOTOR3_2
BSF MOTOR4_1
BCF MOTOR4_2
BSF MOTOR2_1
BCF MOTOR2_2
GOTO MOTORES_P

DIAGONAL_ADE_IZQ
BSF MOTOR1_1
BCF MOTOR1_2
BCF MOTOR4_1
BSF MOTOR4_2
BSF MOTOR2_1
BCF MOTOR2_2
BCF MOTOR3_1
BSF MOTOR3_2
GOTO MOTORES_P

DIAGONAL_ATR_DER
BCF MOTOR2_1
BSF MOTOR2_2
BSF MOTOR3_1
BCF MOTOR3_2
BSF MOTOR4_1
BCF MOTOR4_2
BCF MOTOR1_1
BSF MOTOR1_2
GOTO MOTORES_P

DIAGONAL_ATR_IZQ
BCF MOTOR2_1
BSF MOTOR2_2
BCF MOTOR4_1
BSF MOTOR4_2
BCF MOTOR1_1
BSF MOTOR1_2
BCF MOTOR3_1
BSF MOTOR3_2
GOTO MOTORES_P




MOTORES_0
BCF MOTOR1_1
BCF MOTOR1_2
BCF MOTOR2_1
BCF MOTOR2_2
BCF MOTOR3_1
BCF MOTOR3_2
BCF MOTOR4_1
BCF MOTOR4_2
RETURN




END

este segunda version necesito que me expliquen que hace motores p, y las ocho direcciones porque motores cero los pone en cero
y ahora aqui va la tercera version del programa
Código: [Seleccionar]
#INCLUDE<P18F4550.INC>
CBLOCK 0X00
AUX
ENDC




#DEFINE MOTOR3_1 PORTB,0
#DEFINE MOTOR3_2 PORTB,1
#DEFINE MOTOR2_1 PORTB,2
#DEFINE MOTOR2_2 PORTB,3
#DEFINE MOTOR4_1 PORTB,4
#DEFINE MOTOR4_2 PORTB,5
#DEFINE MOTOR1_1 PORTB,6
#DEFINE MOTOR1_2 PORTB,7
#DEFINE BITZ STATUS,2





CLRF TRISB
CLRF TRISD
CLRF TRISC
MOVLW .255
MOVWF TRISA
MOVWF TRISE

CALL MOTORES_0







OSCILADOR
BSF OSCCON,6
BSF OSCCON,5
BCF OSCCON,4

PUERTOS_DIGITALES

BSF ADCON1,0
BSF ADCON1,1
BSF ADCON1,2
BSF ADCON1,3


MOTORES_P
MOVF PORTA,W
ANDLW B'00000111'
MOVWF AUX

MOVLW .0
XORWF AUX,W
BTFSC BITZ
GOTO DER


MOVLW .1
XORWF AUX,W
BTFSC BITZ
GOTO IZQ

MOVLW .2
XORWF AUX,W
BTFSC BITZ
GOTO ADE

MOVLW .3
XORWF AUX,W
BTFSC BITZ
GOTO ATR

MOVLW .4
XORWF AUX,W
BTFSC BITZ
GOTO DIAGONAL_ADE_DER

MOVLW .5
XORWF AUX,W
BTFSC BITZ
GOTO DIAGONAL_ADE_IZQ

MOVLW .6
XORWF AUX,W
BTFSC BITZ
GOTO DIAGONAL_ATR_DER

MOVLW .7
XORWF AUX,W
BTFSC BITZ
GOTO DIAGONAL_ATR_IZQ
GOTO MOTORES_P


DER
BSF MOTOR3_1
BCF MOTOR3_2
BCF MOTOR1_1
BCF MOTOR1_2
BCF MOTOR2_1
BCF MOTOR2_2
BSF MOTOR4_1
BCF MOTOR4_2
GOTO MOTORES_P

IZQ
BCF MOTOR4_1
BSF MOTOR4_2
BCF MOTOR3_1
BSF MOTOR3_2
BCF MOTOR2_1
BCF MOTOR2_2
BCF MOTOR1_1
BCF MOTOR1_2
GOTO MOTORES_P

ADE
BSF MOTOR1_1
BCF MOTOR1_2
BCF MOTOR4_1
BCF MOTOR4_2
BCF MOTOR3_1
BCF MOTOR3_2
BSF MOTOR2_1
BCF MOTOR2_2
GOTO MOTORES_P

ATR
BCF MOTOR2_1
BSF MOTOR2_2
BCF MOTOR4_1
BCF MOTOR4_2
BCF MOTOR3_1
BCF MOTOR3_2
BCF MOTOR1_1
BSF MOTOR1_2
GOTO MOTORES_P

DIAGONAL_ADE_DER
BSF MOTOR1_1
BCF MOTOR1_2
BSF MOTOR3_1
BCF MOTOR3_2
BSF MOTOR4_1
BCF MOTOR4_2
BSF MOTOR2_1
BCF MOTOR2_2
GOTO MOTORES_P

DIAGONAL_ADE_IZQ
BSF MOTOR1_1
BCF MOTOR1_2
BCF MOTOR4_1
BSF MOTOR4_2
BSF MOTOR2_1
BCF MOTOR2_2
BCF MOTOR3_1
BSF MOTOR3_2
GOTO MOTORES_P

DIAGONAL_ATR_DER
BCF MOTOR2_1
BSF MOTOR2_2
BSF MOTOR3_1
BCF MOTOR3_2
BSF MOTOR4_1
BCF MOTOR4_2
BCF MOTOR1_1
BSF MOTOR1_2
GOTO MOTORES_P

DIAGONAL_ATR_IZQ
BCF MOTOR2_1
BSF MOTOR2_2
BCF MOTOR4_1
BSF MOTOR4_2
BCF MOTOR1_1
BSF MOTOR1_2
BCF MOTOR3_1
BSF MOTOR3_2
GOTO MOTORES_P



MOTORES_0
BCF MOTOR1_1
BCF MOTOR1_2
BCF MOTOR2_1
BCF MOTOR2_2
BCF MOTOR3_1
BCF MOTOR3_2
BCF MOTOR4_1
BCF MOTOR4_2
RETURN


#INCLUDE<C:\Users\Jair Ampudia\Desktop\yair\/RETARDOS.INC>

END

aqui la evolucion se nota expliquenme como funciona motores p aqui porque en este motores evoluciono para seleccionar la 8 direcciones solo usando 3 pines del micro lo siento killer pero si era fastidioso con eso de los define en ese entonces

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda de comprension de programa muy avanzado
« Respuesta #1 en: 19 de Septiembre de 2015, 23:01:14 »
Comienzo a analizar:

El primer programa:
No tiene sentido, estan todos los pines configuradas como todas salidas, le falta definiciones al ASM, no entiendo por que elegir esa ensalada de Pines y no directamente poner por ejemplo todo los motores en el puerto B solo
Escribis mal las salidas y de mala forma, por que deberias escribir el registro LATx y terminas escribiendo PORTx.
Hay MUCHISIMO codigo repetido, por demas diria yo, eso se podria haber hecho en 1/5 parte de todo ese codigo.
Hasta tenes codigo que no se ejecuta. Y demoras... las demoras son malas

En fin lo que intenta hacer tu codigo es leer cerca de 8 entradas, que eso le indica a donde moverse parece ser.
Atras, Adelante, derecha , izquierda, y las combinaciones de estas, como atras derecha, etc.

Las rutinas de los motores son todas iguales. Excepto uno que pone a funcionar los motores por unos 3 microsegundos, seguro un error de programacion.
En resumen tu rutina de cada motor que es lo unico que hay es:

- Apago todos los motores
- Espero 5ms
- Activo los motores segun la direccion
- Los dejo activados por 1 segundo


El segundo programa:

Este esta mejor en configuracion!, aunque le faltan cosas, por fin ponemos todos los motores en el PORTB, todas las entradas en el PORTA y PORTE, ( que podrias haber buscado un puerto completo tambien )
Aunque hay muchisimo codigo que se puede poner en 2 lineas, hacer lo mismo, mas seguro y mas rapido, se sigue escribiendo mal las salidas al puerto y hay una sintaxis incorrecta con respecto al ASM, en los PIC18 cambia un poco las cosas.
Aunque este se podria llegar a llamar un "programa", asi que espero que la tercera version sea una mejora
El programa es igual, se prueban todos los botones, y segun el valor del boton se procede a encender los motores, la unica forma que se apaga los motores es cuando se sueltan todos los botones.
Este codigo no tiene demoras lo cual es algo bueno


El tercer programa

No hay mucha mejora, si supongo que son botones, lo que se hizo fue complicar el hardware para simplificar el software. Lo cual por ahi es lo contrario a lo que se hace.
De alguna forma lograron meter las 8 entradas de forma binaria (supongo que con un conversor decimal/binario), lo cual hace que con 3 bits sean suficientes para seleccionar las rutinas de los motores. Esto es lo unico que cambio del anterior programa, esta bien implementado pero se podria mejorar

Hay un error o tal ves no(todo depende que querian hacer), pero el robot nunca se detendría, es decir presionas Adelante, y el robot va a seguir hasta que alguien presione otra tecla, supongamos derecha, y ahora va a seguir haciendo derecha hasta que nuevamente se cambie de direccion

Este es tu ultimo programa con algunas cosas realizadas:

Código: ASM
  1. #INCLUDE<P18F4550.INC>
  2.  
  3. __CONFIG .............
  4.  
  5.  
  6.         ;Comienzo de Programa
  7.  
  8.  
  9.         ORG 0x00                ;Vector de Reset
  10.         GOTO CONFIGURACION
  11.         ORG 0x08                ;Vector de Interrupcion Baja prioridad
  12.         RETURN
  13.         ORG 0x18                ;Vector de Interrupcion Alta prioridad
  14.         RETURN
  15.  
  16.  
  17. CONFIGURACION
  18.  
  19.         BSF OSCCON,5, ACCESS    ;Oscilador 4 Mhz
  20.  
  21.         CLRF TRISB, ACCESS      ;Configuracion Salidas/Entradas
  22.         CLRF TRISD, ACCESS
  23.         CLRF TRISC, ACCESS
  24.         MOVLW .255
  25.         MOVWF TRISA, ACCESS
  26.         MOVWF TRISE, ACCESS
  27.  
  28.         MOVLW   0xF             ;Todas digitales
  29.         MOVWF   ADCON1, ACCESS
  30.  
  31. MOTORES_P
  32.  
  33.         RLNCF   PORTA, W, ACCESS
  34.         ANDLW   B'00001110'
  35.         CALL    TABLA_MOT
  36.         MOVWF   LATB, ACCESS
  37.         GOTO MOTORES_P
  38.  
  39. TABLA_MOT
  40.  
  41.         ADDWF   PCL,F,ACCESS
  42.         RETLW   0x11    ;DER
  43.         RETLW   0x22    ;IZQ
  44.         RETLW   0x44    ;ADE
  45.         RETLW   0x88    ;ATR
  46.         RETLW   0x55    ;ADE_DER
  47.         RETLW   0x66    ;ADE_IZQ
  48.         RETLW   0x99    ;ATR_DER
  49.         RETLW   0xAA    ;ATR_IZQ
  50.  
  51. END

Tenes que darte cuenta que el PIC18 posee Muchas instrucciones mas

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda de comprension de programa muy avanzado
« Respuesta #2 en: 19 de Septiembre de 2015, 23:22:24 »
gracias killer podes explicarme mejor esas nuevas instrucciones que haces como estas ACCESS,    RLNCF   PORTA, W, ACCESS, MOVWF   LATB, ACCESS,    
ADDWF   PCL,F,ACCESS
   RETLW   0x11   

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda de comprension de programa muy avanzado
« Respuesta #3 en: 19 de Septiembre de 2015, 23:50:09 »
El ACCESS es por como el PIC18 busca en la memoria de datos. Si vas a una instruccion tenes esto:

INCF f,d,a


d, de destino sabes que puede ser W o F ( el registro )

Ahora "a" puede tomar 2 valores 0 (ACCESS) o 1 (BANKED)

segun como sea la instruccion el nucleo buscara de una u otra forma

Cuando a = 0 = ACCESS y f > 0x60
Se accede a los SFR, es decir los registros de los perifericos,nucleo,etc.

Si es a = 0 = ACCESS y f < 0x60
Se usa el acceso indirecto FSR2 para acceder, la diferencia esta que el valor f actua como un Offset, suponete que en FSR2 tenes 0x100 y f vale 0x20
Entonces vas a estar accediendo a la direccion 0x120

Si es a = 1 = BANKED
Ocurre otra cosa distinta, en el que el acceso de datos ahora esta dado por FSR2 y BSR , la memoria interna se encuentra dividida en 15 bancos, el ultimo banco contiene los SFR.
Con el registro BSR se puede seleccionar el banco y luego se usa FSR2 para seleccionar dentro de ese banco., Ejemplo BSR = 2 ( banco 2 - 0x200 a 02FF) y FSR2=0x20
Estarias accediendo a la direcicon de memoria 0x220


Y esto es la parte facil, ni hablar de USB en el que las memorias se comparten y estan protegidas entre uno y otro.



RLNCF es Rotar a la izquierda sin Carry, en los PIC16 solo existia RLF que era Rotar a la izquierda con carry, es decir se rotaba y y el carry estaba incluido en la rotacion, es decir eran 9 bits, no solo los 8 del registro., rotar a la izquierda es multiplicar por 2
Por que rotarlo ?
Por que las instrucciones en el PIC18 son de 16bits (2 bytes), para no perder alineacion el contador de programa mantiene siempre su ultimo bit en 0. Por lo que si yo quisiera moverme una sola instruccion mas, deberia sumar 2, si quisiera moverme 3 instrucciones mas adelante deberia sumarle 6 al contador de programa (Esto para instrucciones de 16bits, hay instrucciones de 32bits tmb )

MOVWF   LATB, ACCESS
Es simple, solo muevo el dato a la salida del Puerto, en lso PIC18 en adelante, para escribir un puerto usas LATx, para leerlo usas PORTx

ADDWF   PCL,F,ACCESS
Esto lo uso par una tabla, lo que hago es pasar ese offset que consegui de las llaves y se lo sumo al contador de programa. Es decir que le estoy diciendo que apunte a la direccion que le doy, cuando llega a esa direccion se encuentra con un RETLW de valor acorde a mi tabla

RETLW 0x11
Esta instruccion hace un RETURN pero ademas devuelve el valor 0x11 en este caso por W

Para que se entienda...
Supongamos que en el PORTA hay el valor 1010 0110 , segun el programa lo rota y lo guarda en W, quedando W= 0100 1101
Luego le hace una AND para solo obtener los bits que necesito quedando W = 0000 1100
LLamo a la tabla Y le suma el valor ese al contador de programas PCL, devolviendo estos resultados:

Código: ASM
  1. RETLW   0x11    ; Caso W = 0000 0000
  2.         RETLW   0x22    ; Caso W = 0000 0010
  3.         RETLW   0x44    ; Caso W = 0000 0100
  4.         RETLW   0x88    ; Caso W = 0000 0110
  5.         RETLW   0x55    ; Caso W = 0000 1000
  6.         RETLW   0x66    ; Caso W = 0000 1010
  7.         RETLW   0x99    ; Caso W = 0000 1100
  8.         RETLW   0xAA    ; Caso W = 0000 1110

Luego eso que obtengo lo muevo a el puerto.

Segun el programa original si se tocaba la tecla de derecha se encendia PORTB,4 y PORTB,0 y todas las demas se ponian a 0.

Tu forma de hacerlo:

Código: ASM
  1. DER
  2.         BSF MOTOR3_1
  3.         BCF MOTOR3_2
  4.         BCF MOTOR1_1
  5.         BCF MOTOR1_2
  6.         BCF MOTOR2_1
  7.         BCF MOTOR2_2
  8.         BSF MOTOR4_1
  9.         BCF MOTOR4_2
  10.         GOTO MOTORES_P

Tranquilamente podrias haber realizado:

Código: ASM
  1. MOVLW   B'00010001'
  2.         MOVWF   LATB, ACCESS

Yo para no repetir ese MOVWF, decidi usar una tabla. de esa forma lo escribo una sola ves y no tengo tantos saltos.
Instrucciones tiene muchas mas, son casi que 3 hojas mas de instrucciones, incluso algunas cambian si es que se habilita el set extendido de instrucciones (solo conveniente para algunos casos en especial)

Todo lo que dije aca, esta explicado en el datasheet del PIC, en Memory Organization, explica todas las formas de acceso a memoria de datos y programas que posee el PIC.
Y uno de los ultimos capitulos es el Set de instrucciones, que aparece la tabla con todas las instrucciones + la explicacion de cada instruccion individual
« Última modificación: 19 de Septiembre de 2015, 23:52:56 por KILLERJC »

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: ayuda de comprension de programa muy avanzado
« Respuesta #4 en: 20 de Septiembre de 2015, 01:58:44 »
Hola yair_xiox

hola, necesito que me ayuden a entender un programa que hice en asm cuando era muy bueno para programar

Hay algo que no entiendo de este comentario que pones. Si eras muy bueno para programar? Por que ahora no entiendes el programa? Entonces en realidad nunca fuiste muy bueno para programar y es por eso que no lo entiendes. Y este conocimiento nunca se pierde por más tiempo que pase....

yair_xiox te pido amablemente leas muy atentamente las REGLAS DEL FORO, y trates de entenderlas y acatarlas, para mantener un orden dentro del propio foro es que fueron creadas, y todos debemos respetarlas. Recuerda que puntos, comas y signos de exclamación fueron creados para facilitar la lectura.

Más allá de lo anterior, y en este caso en particular, no creo sea necesario mentir a los foreros para recibir una ayuda, si el programa no es tuyo, pues no importa, igual si está en nuestra capacidad serás ayudado.

Desde ya agradezco tu colaboración.

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 yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda de comprension de programa muy avanzado
« Respuesta #5 en: 20 de Septiembre de 2015, 14:17:43 »
pero el programa si es mio lo hice yo pero cuando dejo de hacer algo como programar se me olvida

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda de comprension de programa muy avanzado
« Respuesta #6 en: 20 de Septiembre de 2015, 14:44:47 »
pero el programa si es mio lo hice yo pero cuando dejo de hacer algo como programar se me olvida

El tema es el siguiente yair, estamos para "ayudarte", como bien lo indican las reglas del foro:

Citar
-- Las probabilidades de conseguir en este foro que hagan tu trabajo son nulas
-- Las probabilidades de conseguir ayuda son muy altas
-- Las probabilidades de que aprendas lo suficiente para hacerlo tú mismo son del 100%

El programa que presentaste es demasiado simple (especialmente cuando declaraste que eras bueno programando en ASM) y no entenderle es como que realmente no lo viste, o no te pusiste a verlo.
Primero pense "ufff" que manera de haber codigo aca. Pero luego me di cuenta lo largo a propsito que era, 203 lineas vs 37 que me tomo ami si le saco cosas que le agregue y se compara al tuyo.
Las tablas es algo que ves en los primeros dias, creo que lo primero que te enfrentas es cuando queres encender un display 7 segmentos.
Y luego me pedis que te explique las instrucciones. Realmente no se por que lo hice. Pero no deberia haberlo hecho.

Te deberia haber dado el link y que lo revisaras vos mismo. Que eso es lo que voy a hacer desde ahora en adelante.
No se si hasta ahora te has dado cuenta, pero mirandolo desde el punto de vista de las personas del foro, estas pidiendo que te hagan todo. O que practicamente te digan:
"Compra esto esto esto y esto, aca tenes el programa, grabalo asi, y bueno luego te lo arreglas con MATLAB. Pero esto va en contra de la voluntad de la gente y de la primer regla del foro."

Lo demas voy a enviarte un privado, para no cortar con el tema del hilo o seguir desvirtuandolo.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: ayuda de comprension de programa muy avanzado
« Respuesta #7 en: 21 de Septiembre de 2015, 01:21:35 »
No puedo aportar nada, lo que si me llamo la atención es vos hiciste los programas y no entendes que hiciste ???? suena raro ....

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda de comprension de programa muy avanzado
« Respuesta #8 en: 22 de Septiembre de 2015, 18:52:47 »
hola, killer para seguir mejorando el programa me faltaría definir las direcciones derecha y las demas lo que no se es como ponerles esas diercciones de la tabla
Código: [Seleccionar]
#INCLUDE<P18F4550.INC>
 
__CONFIG .............
 
 
;Comienzo de Programa
 
 
ORG 0x00 ;Vector de Reset
GOTO CONFIGURACION
ORG 0x08 ;Vector de Interrupcion Baja prioridad
RETURN
ORG 0x18 ;Vector de Interrupcion Alta prioridad
RETURN
 
 
CONFIGURACION
 
BSF OSCCON,5, ACCESS ;Oscilador 4 Mhz
 
CLRF TRISB, ACCESS ;Configuracion Salidas/Entradas
CLRF TRISD, ACCESS
CLRF TRISC, ACCESS
MOVLW .255
MOVWF TRISA, ACCESS
MOVWF TRISE, ACCESS
 
MOVLW 0xF ;Todas digitales
MOVWF ADCON1, ACCESS
 
MOTORES_P
 
RLNCF PORTA, W, ACCESS
ANDLW B'00001110'
CALL TABLA_MOT
MOVWF LATB, ACCESS
GOTO MOTORES_P
 
TABLA_MOT
 
ADDWF PCL,F,ACCESS
RETLW 0x11 ;DER
RETLW 0x22 ;IZQ
RETLW 0x44 ;ADE
RETLW 0x88 ;ATR
RETLW 0x55 ;ADE_DER
RETLW 0x66 ;ADE_IZQ
RETLW 0x99 ;ATR_DER
RETLW 0xAA ;ATR_IZQ
 
END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda de comprension de programa muy avanzado
« Respuesta #9 en: 22 de Septiembre de 2015, 20:05:08 »
hola, killer para seguir mejorando el programa me faltaría definir las direcciones derecha y las demas lo que no se es como ponerles esas diercciones de la tabla

No entendi exactamente que me estas preguntando. Segun las entradas el codigo va a ir a esa tabla y va a tomar el valor y devolverlo. El tema es que esta muy lindo el programa. Pero hay muchos errores en la aplicacion. Que ya nombre, como que apenas arranca ya esta funcionando hacia la derecha, o que si no todas nada se queda "moviendose" hacia la derecha, la otra es que la entrada es en forma "binaria".

Empecemos por esto:

Tenes que decirme exactamente, como es que queres que funcione tu programa. Explicado con lujos y detalles. Como por ejemplo:

Código: [Seleccionar]
Quiero hacer un robot que se mueva segun lo que presione en un control, este control va a estar conectado al PIC directamente por cable.

Voy a tener 4 botones conectados al PIC, los cuales voy a llamar ATRAS , ADELANTE , IZQUIERDA y DERECHA, y que voy a conectar a el Puerto B 0, 1 ,2 ,3 y 4 respectivamente.
Quiero que cuando toque un boton el robot se empieze a mover para la direccion que deba ir, ademas si presiono 2 juntos (mientras que no sean opuestos) se muevan en diagonal.

Para que se muevan las salidas de los motores estan dados por
ATRAS: PORTE,0
ADELANTE: PORTE,1
DERECHA: PORTE,2
IZQUIERDA: PORTE,3

Es decir, si presiono adelante , se activa el PORTE,1 y esto haria moverlo para adelante. NUNCA deberia poder activarse ADELANTE y ATRAS juntos, asi como tambien IZQUIERDA y DERECHA juntos, por que se produciria un cortocircuito en mi puente H

Algo asi masomenos, bien explicado asi uno sabe realmente lo que queres hacer y te puedo decir que podes mejorar o realizar para que puedas lograrlo. ( Si es que no lo llegas a hacer por vos mismo obviamente )

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda de comprension de programa muy avanzado
« Respuesta #10 en: 23 de Septiembre de 2015, 10:30:25 »
hola, killerjc  el controlador no estará conectado  directamente al pic porque le  voy  a poner un  sensor bluethoot  para manejar a que dirección valla con el celular ya que es fácil de hacer lo puedo hacer con appinventor que es fácil de manejar o me puedo descargar otra aplicación donde solo se inserta el comando y listo  con eso no hay problema lo haré yo, pero en el programa quiero que se puedan seleccionar  las  8 direcciones  pero como ya se el error  que tenia  me gusta tu idea, quiero que cuando toque un botón el robot se empiece a mover para la dirección que deba ir, ademas si presiono 2 juntos (mientras que no sean opuestos) se muevan en diagonal, porque así solo necesitaría 4 botones y esto lo simplificaría muchísimo, también me gustaría hacer lo otro que dijiste de que no se  pueda mover en direcciones opuestas, con todos los motores conectados al puerto B     
 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda de comprension de programa muy avanzado
« Respuesta #11 en: 23 de Septiembre de 2015, 11:03:41 »
La primera pregunta es:

- Conviene o no hacerlo en ASM?

Si pensas hacerlo en ASM, yo creo que seria por un tema de aprendizaje, creo que te va a ayudar mucho con el tema de aprender como funciona el microcontrolador, pero por otra parte va a ser mas engorroso y va a necesitar muchas lineas como para que funcione algo masomenos simple.

Si no te importa demasiado el micro y queres evitar en parte eso. Entonces vas a tener que usar C. Aunque si o si vas a necesitar un poco de conocimiento de los modulos. Que compilador C elegir? El que mas te guste. Yo personalmente uso XC8 por que odio CCS y sus funciones, XC8 me siento mas como cerca del ASM. Pero no puedo negar que lo que tal ves tardo hacer en XC8 , los que usan CCS lo pueden hacer en la mitad de tiempo (algunas cosas nomas)


Ahora analizemos por parte:

Citar
le  voy  a poner un  sensor bluethoot  para manejar a que dirección valla con el celular ya que es fácil de hacer lo puedo hacer con appinventor que es fácil de manejar o me puedo descargar otra aplicación donde solo se inserta el comando y listo  con eso no hay problema lo haré yo,

Dejando de lado el tema del appinventor, el "sensor", en realidad es un modulo bluetooth, los que vi requieren que se conecten por la UART. Como si esto fuera poco luego se maneja con todos caracteres ASCII, asi que vas a enviar MUCHOS datos al bluetooth, algo que haces en C como:

printf(putc,"AT+RST")

En ASM te llevaria MUCHO MUCHO mas, algo asi de unas 3 instrucciones de ASM por cada letra, si entendes la cantidad de comandos a enviar para manejar el modulo vas a ver lo engorroso y sin sentido que es hacerlo.
Y todo esto sin que te metas con el appinventor. Que ese es otro tema mas.

Citar
ero en el programa quiero que se puedan seleccionar  las  8 direcciones  pero como ya se el error  que tenia  me gusta tu idea, quiero que cuando toque un botón el robot se empiece a mover para la dirección que deba ir, ademas si presiono 2 juntos (mientras que no sean opuestos) se muevan en diagonal, porque así solo necesitaría 4 botones y esto lo simplificaría muchísimo, también me gustaría hacer lo otro que dijiste de que no se  pueda mover en direcciones opuestas, con todos los motores conectados al puerto B

Esto no es lo complejo, primero vas a tener que definir cuales datos van a llegar, que cosas le van a llegar por el modulo.
Ejemplo si con el modulo tenes que llega un dato: 0000 abcd
diciendo que a es adelante, b es izquierda, c atras y d derecha. entonces es mas facil de realizar
Ademas las posiciones no estan elegidas al azar. ya que si desplazas 2 veces a la derecha y haces una AND

0000 abcd , desplazo a la izquierda 2 veces y guardo quedando 0000 00ab
Le hago una AND 0000 0011 al dato original quedando 0000 00cd

Hago una AND entre
0000 00ab
0000 00cd

si ambos estan en 1 , me refiero a los pares atras adelante o derecha-izquierda, entonces el resultado no va a dar 0 y vas a detectar el error.
Todo esto suponiendo que tu aplicacion pueda llegar a enviar mal los datos.

--------------------------------

En fin, si lo haces en ASM, te vas a enfrentar a :

UART, vas a tener que saber como funciona, como configurarla, ver todos los registros que se deban ver.
Bluetooth, vas a tener que aprender a configurarlo, a unirlo con tu celular, etc, algo grande para el que jamas toco.
Programa principal, lo mas simple.
Interrupciones para la UART, este es todo otro tema. Simple pero si no tenes claro la programacion o como funciona el microcontrolador es grande.

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda de comprension de programa muy avanzado
« Respuesta #12 en: 23 de Septiembre de 2015, 11:14:32 »
ok, pero en asm me gusta mas porque puedo tocar todos los registros y así la uart se configura mas fácil porque el datasheet siempre lo explica en asm, lo del XC8 me costaría mas porque tendría que aprender un nuevo lenguaje, mejor en asm, lo del modulo bluethoot  esa aplicación que menciono lo hace todo por ejemplo se puede ingresar en la aplicación un comando que este en el programa así como esta y el robot ejecutaría el comando así que eso puede que no sea tan difícil 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda de comprension de programa muy avanzado
« Respuesta #13 en: 23 de Septiembre de 2015, 11:26:24 »
ok, pero en asm me gusta mas porque puedo tocar todos los registros y así la uart se configura mas fácil porque el datasheet siempre lo explica en asm, lo del XC8 me costaría mas porque tendría que aprender un nuevo lenguaje

XC8 es C. No cambia de un CCS, la unica diferencia es que a pesar de tener funciones como.

spi_write(), etc

Y otras que no hay como

#use FAST_IO
#use SPI

Te permite modificar los registros sin mayores problemas y con los nombres exactos del datasheet.

Ejemplo para los bits:

    INTCONbits.PEIE = 1; //Activamos interrupcion de perifericos
    INTCONbits.GIE = 1;  //Activamos las interrupciones globales


O puedo hacerlo con todo el registro

    INTCON |= 0xC0 ; //Activamos interrupciones

Es lo mismo que antes nomas que lo hice en toda una linea , y como ves los registros y bits de cada uno tienen el mismo nombre que el datasheet


Citar
, mejor en asm, lo del modulo bluethoot esa aplicación que menciono lo hace todo por ejemplo se puede ingresar en la aplicación un comando que este en el programa así como esta y el robot ejecutaría el comando así que eso puede que no sea tan difícil

Nuevamente eso es desde el lado del "celular", es facil poner una libreria hecho para un sistema como Android,pero del lado del PIC es otra cosa totalmente distinta, ahi ya no hay mas "librerias" que lo hagan facil, y lo mas cerca de tener una libreria tal ves buscando un codigo por internet en C y que con SUERTE funcione, si no vas a tener que estudiarlo y adaptarlo. Por eso mismo te estoy advirtiendo desde ahora. Si vos queres seguir, entonces adelante. Yo te voy a intentar dar pistas sobre como tenes que seguir y vos vas a  tener que buscar para solucionar el problema que sea. Si hay cosas muy basicas te voy a decir que leas un tutorial o algo por el estilo. Va a ser tu deber informarte y tratar de sacar algo bueno de ahi, tratar de resolverlo, tratar de que la salida sea la correcta, etc.

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda de comprension de programa muy avanzado
« Respuesta #14 en: 23 de Septiembre de 2015, 11:48:18 »
ok, killer investigare lo que tenga que investigar para hacer lo que yo quiero y evitare causarles problemas y solo preguntare cuando tenga que hacerlo, pero definitivamente que quedo con asm aunque sea mas largo el programa porque XC8 eso de combinar asm con CCS no me agrada para nada porque si tiene algunas partes de CCS y otras no solo me confundiría aun mucho mas