¿Cómo hago el direccionamiento indirecto en PIC ASM?

En mi 16F628A, quiero iterar una secuencia de valores predefinida. ¿Cómo hago esto?

En C, haría algo como esto:

valores char = {22, 10, 34, 16};

identificación de carácter = 0;

puerto = valor[id]; identificación ++

Es el 'vals[id]' que no he descubierto.

No tengo tiempo para un poco de buscar esto, pero creo que la razón por la que comenzaron su propio soporte de compilador C con PIC18 es porque son la primera imagen que admite el direccionamiento indirecto y una serie de otras características que le gusta usar a C. .
@Kortuk: Lo siento, eso está mal. Todos los PIC tienen capacidad de direccionamiento indirecto. Incluso los más pequeños tienen un solo registro FSR. El PIC 18 tiene tres FSR, el PIC 16 mejorado dos, y cualquier registro puede usarse como puntero en las partes de 16 bits.
@OlinLathrop entonces alguien me dijo incorrectamente, puedo decir que nunca lo verifiqué yo mismo en el PIC16. Pensé que el PIC18 tenía soporte funcional completo. Me habían dicho en el PIC16 que tenía que cargar la dirección en un registro y extraer el valor de otro, lo que hacía que los punteros fueran bastante ineficientes más allá de usar uno/dos.
@Kortuk: Poner la dirección en un registro y luego leer otro es cómo funciona el direccionamiento indirecto en todos los PIC de 8 bits, incluido el PIC 18. La diferencia es que el PIC 18 tiene tres punteros indirectos de este tipo con algunos pre/post inc/dec capacidad. El PIC 16 mejorado tiene dos punteros indirectos con capacidad completa de aumento/desaceleración pre/post, y el PIC 16 y PIC 10 y 12 más antiguos tienen un solo puntero sin capacidad de aumento/desaceleración automática.
@OlinLathrop Bueno, agradecería una respuesta completa aquí, agradezco la información.
@mmccoo Si sangra su código C con 4 espacios, stackexchange formateará el código con una fuente monoespaciada. Agregué la etiqueta 'c' para que también se represente con resaltado de sintaxis C.

Respuestas (2)

No hay instrucciones indirectas de acceso a la memoria en las imágenes de rango medio, sino que coloca la dirección de la ubicación de la memoria a la que desea acceder en el registro FSR. Y luego se puede acceder al valor en el registro INDF.

Consulte la sección 4.4 de la hoja de datos de su chip. http://ww1.microchip.com/downloads/en/devicedoc/40044f.pdf

Si desea que un PIC16F628A haga algo como

char vals = {22, 10, 34, 16};
int main(void){
    char id = 0;
    while(1){
        PORTB = vals[id];
        id++;
        id = id & 3;
    };
}

una opción es compilar su código C con un compilador C. (Al compilar para tales chips, el compilador usará los registros FSR e INDF exactamente como explicó John Burton). Tengo entendido que SDCC es el único compilador C de código abierto que admite PIC16F628A y otros chips PICmicro de "14 bits".