Lenguaje ensamblador para pic ?

La verdad que lo tuyo es mas logico Joaquin. Me lo voy a estudiar y quizas se lo comente al profe.

Y..sobre mi segunda parte del mensaje, sabrias deducir el código.Te lo pego.

---------------------------------------------------------------------------------------------------------------------------
Ya que estamos a ver si puedes ayudarme con el direccionamiento indirecto, que esto es un autentico lio.

Primeramente , no se que quiere decir/ o para que sirve.
Lo unico que encuentro es que es para mover cosas de sitios y no hacerlo directamente pero sigo sin entenderlo.


En este ejemplo,que es un subrutina que inicializa las posiciones de memoria.No consigo entender el direccionamiento.

Código:
inicializa:
            movlw  0x30 //
             movwf  FSR // el valor 48 -> al acumulador -> y lo paso al registro FSR
             
repite:
            clrf   INDF,F //  limpio INDF es un registro, pero ese F , creo que sobra
            incf  INDF,F//Incrementa el contenido de INDF en una unidad.
 El resultado se almacena de nuevo en INDF si F=1 y en W si F=0(en este caso INDF no varía) 

¡¡PERO NO SABEMOS EL VALOR DE F!!!



             incf   FSR,F // lo mismo de antes 
             btfss  FSR,6 // aqui ya me pierdo
             goto   repite
             return

Joaquin a ver si me ayudas a saber como tira esto de direccionamiento indirecto, ya que lo veo ilógico .

Gracias por todo.

Con todo lo que se ahora creo que el examen del jueves me irá bien :)
 
6.3.4 Direccionamiento indirecto, registros INDF y FSR

El direccionamiento indirecto es un modo de direccionamiento de la memoria de datos, donde la dirección de la memoria de datos en la instrucción, no es fija. El registro FSR se usa como puntero a la posición de la memoria de datos que va a ser leída o escrita. Ya que es un puntero en RAM, los contenidos se pueden modificar por programa. Esto puede ser útil para tablas de datos, en la memoria de datos. La figura 6-7 muestra la operación del direccionamiento indirecto. Muestra el movimiento del valor a la dirección de la memoria de datos especificada por el valor del registro FSR.

El direccionamiento indirecto es posible usando el registro INDF. Cualquier instrucción que use el registro INDF, lo que realmente hace es acceder al registro apuntado por el File Select Register (FSR). Leyendo indirectamente (FSR = '0') el propio registro INDF, se leerá 00h. Escribiendo indirectamente al registro INDF resultará en una no-operación (aunque afectará a los bits de estado). Una dirección de efectiva de 9 bit se genera por la concatenación del bit IRP (STATUS<7>) con los 8 bit del registro FSR, como se muestra en la figura 6-8.

PHP:
inicializa:
            movlw  0x30    ; inicializamos FSR = 0x30
            movwf  FSR

repite:
            clrf   INDF    ; pone a 0 el valor apuntado por FSR
            incf   INDF,f  ; pone a 1 el valor apuntado por FSR

            incf   FSR,f   ; incrementamos el puntero FSR

            btfss  FSR,6   ; ¿Hemos llegado a 0x40? (salta si FSR<6> = 1)

            goto   repite  ; no, repetimos el bucle

            return         ; sí, salimos
Lo que hace este código es poner a 1 todos los bytes que van de la dirección 0x30 a la 0x3F (suponiendo que bit IRP = 0, claro).
 
Última edición por un moderador:
Una duda rápida.

tabla:
addwf PCL,F ;
retlw b'11000000' ; regresa con 0
retlw b'11111001' ; regresa con 1
retlw b'10100100' ; regresa con 2
retlw b'10110000' ; regresa con 3
retlw b'10011001' ; regresa con 4
retlw b'10010010' ; regresa con 5
retlw b'10000010' ; regresa con 6
retlw b'11111000' ; regresa con 7
retlw b'10000000' ; regresa con 8
retlw b'10010000' ; regresa con 9


Si por ejemplo:
-el contador del programa esta en la posicion 5
-hacemos de molvw 2
-entonces addwf PCL = 6(posicion siguiente) + 2 = 8
-vamos al `regresa 2´, volvemos al programa y metemos en W= 10100100

Mi duda es :
La cosa se queda aquí o automaticamente vuelve ha sumar el PCL + W , siendo W ahora = 10100100


Gracias.
 
No, la instrucción retlw hace regresar inmediatamente, con el valor de W puesto al literal indicado.

retlw (retorno con un literal en W)
 
Última edición por un moderador:
Muchas gracias Joaquin, ya entiendo el programa.Lo que he puesto era solo un trozo.
Lo explico por si alguien tiene interés.

Cuando copilamos todo el código en el programa ,escribimos en memoria, y activamos uno o mas interruptores de nuestro PIC, este interruptor o esta combinacion de interruptores, hace dar un valor a W .Consecuentemente , esto nos hace ir una posición de la tabla y recoger el valor que tenemos dentro,el cual activará una serie de displays en la pantalla. (El numero al lado de `regreso´
 
El examen me fue bastante bien, aunque hubo alguna pregunta casi imposible, pero por lo demas todo bien.

No me tengo que relajar y , tengo que seguir trabajando y estudiando!!

Muchas gracias por la ayuda!!!
 
Fue una pregunta que no tenia nada que ver con lo que había estudiado y me pilló en esa.
Te la adjunto en imagen.

Pero bueno, ya ha pasado.
 

Adjuntos

  • ej examen.jpg
    ej examen.jpg
    47.3 KB · Visitas: 12
Madre mía... ¡Y con faltas de ortografía!

Pongo aquí el texto corregido:

«La velocidad de giro de un disco compacto se puede medir a partir de la lectura del código de barras situado en la pista interior._La lectura de las barras generan un pulso por cada avance de 2_°, que se utiliza como señal de interrupción a un PIC._Asumiendo un lector de velocidad 24x, que equivale a un máximo de velocidad de giro de 7200 revoluciones por minuto. ¿Cuál es el valor máximo de la RSI en el peor de los casos?. Asuma una frecuencia de trabajo de 4 MHz».

No estoy muy seguro, pero sería algo así:

Si la velocidad más alta de giro es 7200 rev./m, tenemos

7200 rev./m / 60 s/m = 120 rev./s

Si cada rev./s son 360°,

120 rev./s * 360 °/rev. = 43 200 °/s

Si hay un pulso cada 2 °, tenemos que la velocidad más alta de pulsos es

43 200 °/s / 2 °/pulso = 21 600 pulsos/s

A partir de ahí hay que calcular la RSI, que, a propósito, no sé qué significa :)
 
Hola a todos!! :) ;)
Estoy de vuelta con esta asignatura.Me fue bien el examen y la he dejado un poco abandonada y me tengo que poner de vuelta con ella ya que tengo que entregar en un par de semanas un proyecto y tengo un examen y necesito aprender temario.

Vale, pues estamos ahora en el temario de :
Interficie de circuitos externos y comunicaciones.

Hemos dado la explicación de lo:"Maestro y esclavo"
Lo de llamar a un periférico para darle una información y este te conteste o te haga algo.Lo del : SCLK,SS,MOSI y MISO.
Pues bien, en clase solo hemos dado teoria y por eso os pedia si teneis algún código "sencillo" de principiante para entender esto de maestro y esclavo para ver como funciona, ya que no tengo ejemplos

Muchas gracias !!!
 
Bueno, recién estudiando ensamblador con PIC quise probar manejar un poco las operaciones por condición.
Quiero dividir cierto numero entre 2 ó 4 dependiendo de si es mayor a otro.
Me parece que dividir corriendo los bits, con la instrucción RRF, sería más fácil.
Código:
    __CONFIG    0X1F39
    INCLUDE <P16F877A.INC>
    LIST P=16F877A

    CBLOCK  0X50
NUMBER1
NUMBER2
TOTAL
MP
NP
    ENDC   

NUMB3    EQU 0X58

    ORG   0
    BSF   STATUS,5
    MOVLW B'11111111'
    MOVWF TRISB
    MOVLW B'11111111'
    MOVWF TRISC
    MOVLW B'00000000'
    MOVWF TRISD
    MOVLW D'6'
    MOVWF ADCON1
    BCF   STATUS,5
    CLRF  PORTB
    CLRF  PORTC
    CLRF  PORTD
    MOVLW D'20'
    MOVWF NUMB3

  
PRINCIPAL
    MOVF  PORTB,0
    MOVWF NUMBER1
    MOVF  PORTC,0
    MOVWF NUMBER2
    MOVF  NUMBER1,0
    ADDWF NUMBER2,0 ;SUMA NUM2 CON W-->Y LO PASA A W
    MOVWF TOTAL
;;;;;;;CONDICION;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;     
    MOVF     NUMB3,0
    SUBWF    TOTAL,W ;COMPARO NUMB3 CON TOTAL
    BTFSC    STATUS,Z
    GOTO     IGUALES
    BTFSC    STATUS,C
    GOTO     MAYOR
    GOTO     MENOR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

IGUALES
    MOVF  TOTAL,0
    MOVWF PORTD
    GOTO  PRINCIPAL

MAYOR
    MOVF TOTAL,0
    MOVWF MP       
    RRF   MP,1      ;DIVIDO MP ENTRE 2
    MOVF  MP,0
    MOVWF PORTD
    GOTO  PRINCIPAL

MENOR
    MOVF TOTAL,0
    MOVWF NP
    RRF   NP,1        ;DIVIDO NP ENTRE 4
    RRF   NP,1
    MOVF  NP,0
    MOVWF PORTD
    GOTO  PRINCIPAL

    END
Pero sucede que el PIC parece saltar nada mas a la parte de si el numero es menor.
¿Qué estoy implementando mal, la parte de la condición o uso mal la instrucción RRF?
Gracias.
 
Atrás
Arriba