Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

14/03/2011 #21


el programa que hice es independiente del SCI, lo podes usar con cualquier micro, por eso defini al bit RX y TX para que cuando defina las variables le asignes ese nombre a un bit, si quieres otro puerto diferente al b, vas a tener que cambiarlo manualmente. Creo que se puede usar cualquier cristal, los ciclos estan adaptados perfectamente. La distancia realmente no la se, pero si es una linea sin mucho ruido puede ser mayor que un metro, es cuestion de probar. Este programa yo lo utilizo para enviar datos por RF pero tengo muchas complicaciones con los circuitos.
14/03/2011 #22


yo pienso que no puede usar cualquier cristal permiteme explicate porque:

si te fijas el retardo de tiempo en milisegundos esta dado decrementando un registro y en caso que usaras un timer tambien te afectaria el variar el cristal
recuerda que al usar un cristal de mayor frecuencia incrementas la velocidad del micro asi como de sus perifericos y si lo bajas se hace mas lento

en cuanto a las distancias ponle 2 max232 y tendras un alcance mayor para que te alcance mas distancia y si quisieras 1 kilometro ponle entonces un convertidor de rs485 creo que era el 75ls176 este ultimo es altamente inmune al ruido recuerda usar 2 uno en un extremo atravez de un cable y el otro al final y podras comunicarte a distancia

aun cuando usaras los timers del micro al cambiarle el cristal su frecuencia base cambia por lo tanto el programa o te corre mas rapido o mas lento
saludos
14/03/2011 #23


ok gracias por la informacion , pero yo casi no se programar en ensamblador , nosotros trabajamos en lenguaje C, por que lo poco que vi de ensamblador se me complico mucho y gracias por la explicacion de la tabla.
saludos y que estes bien
15/03/2011 #24


en lenguaje c es mas facil entonces no hay mucho que explicar
16/03/2011 #25


curioso207 dijo: Ver Mensaje
yo pienso que no puede usar cualquier cristal permiteme explicate porque:

si te fijas el retardo de tiempo en milisegundos esta dado decrementando un registro y en caso que usaras un timer tambien te afectaria el variar el cristal
recuerda que al usar un cristal de mayor frecuencia incrementas la velocidad del micro asi como de sus perifericos y si lo bajas se hace mas lento

en cuanto a las distancias ponle 2 max232 y tendras un alcance mayor para que te alcance mas distancia y si quisieras 1 kilometro ponle entonces un convertidor de rs485 creo que era el 75ls176 este ultimo es altamente inmune al ruido recuerda usar 2 uno en un extremo atravez de un cable y el otro al final y podras comunicarte a distancia

aun cuando usaras los timers del micro al cambiarle el cristal su frecuencia base cambia por lo tanto el programa o te corre mas rapido o mas lento
saludos
Si te fijas bien no uso el timer en ningun momento, trabajo con los ciclos del micro. Obviamente que si cambias el cristal en uno lo tenes que cambiar en el otro. Los dos deben llevar cristales iguales, sino no funcionaria. Mientras cumplas la condicion de cristales iguales en los dos micros el programa funciona correctamente.
16/03/2011 #26


voy a tratar de utilizar el cristal que me recomeinda en la hoja de datos de motorola frescaler, que si mal no recuerdo es un cristal de 9.83 MHz o 9.083, o ago asi, no lo recuerdo bien ya me jijare en el manual.

de todas maneras aparte de hace correr este programa que puedo utilizar cualquier pin I/O, para TX/RX, me gustaria utilizar el modulo SCI que es el modulo que trae el micro porque yo lo tengo que comunicar con la PC, y con el cristal anteriormente mensionado y el modulo SCI en el manual dice que funciona bien, aparte me ahorro un poco de espacio de memoria.

porque el programa que me pasaste esta bueno, pero para comunicar micro con micro como tu bien lo aclaraste, como yo aparte de comunicar micro con micro tambien necesito comunicar a una PC se me lo complica, otra ventaja que tengo de trabajar con el modulio SCI es que si por algun motivo el programa principal se demora por algo o tiene algun llamado de interrupcion no me afectara en mi transmision, aparte yo lo pongo a correr al programa principal de trabajo y cuando llegue un dato realizo un pedido de interrupcion del sci y el programa en ese momento s va a atender al SCI, y luego continua, oprque tengo que hacerlo vastante extenso al programa principal por las aplicaciones que va a tener.

me gustaria mucho si alguien tienne algun programita de ejemplo del modulito SCI que este probado, para que me lo pase, porque algo estoy haciendo mal no funca.
por ahora pruebo en comunicar micro con micro para descartar las configuraciones y problemas de la PC.

mientras voy trabajando con el programita que me paso el colega.

despues tengo otro pequeño inconveniente que es parte del mismo programa principal:

tego ue manejar tablas.
tengo un concepto de ello pero no lo tengo en claro, segun eleido, las tablas vienne a ser como una especia de subrrutina, en donde se setean los datos a escribir.
y que cada ves que se la llama carga el dato al ACC, (acumulador) e incrementa algo en algo, eje y luego sale, es coo una subrrutina que buelve con un dato especifico, cuando se la llma de nuevo esta debido al incremento vuelve con el dato siguiente.
mis dudas son:
siempre con el dato que vuelve es con el suiguiente? no puede volver con cualquiera que yo necesite? por ejemplo yo tengo una tabla en odne tengo los daos para generar desde el 0 al 9, pero en un momento necesito el 3 y en otro el 1 y en otro el 8 por ejemplo, se utiliza la tabla para eso tmbien.
otra duda: como son las instrucciones para que funcione una tabla? yo trabajo con WinIde y en assembler. se que tengo que hacer algo en la ram pero no lo tengo en claro como reservar el lugar en la ram para la tabla.
busco buco estudio pero no me cierran las cosas, en algo me enrredo, si alguien me puede dar una mano en estas dos cositas, seria genial. desde ya gracias
17/03/2011 #27


Las tablas yo las entiendo como un lugar donde vos pones datos y despues los vas a buscar segun la posicion. Por ejemplo en una entrada tenes un sensor de temperatura, convertis esa temperatura en el registo ADR te va a quedar el valor binario de la temperatura, entonces vos vas a la tabla buscas ese valor y lo mostras si queres o haces otra cosa.

Para usar las tablas debes definir el lugar de la memoria flash en la que empiezan (pones ORG $F800 por ejemplo). En la fila siguiente le pones un nombre si queres. le das tab y pones la instruccion FCB otra vez tab y empezas a escirbir los datos ($ si es hexadecimal,%si esbinario, ' ' si es codigo ASCII). Por cada fila solo puede haber ocho columnas, el compilador no te permite mas.

Para usar las tablas desde el programa. Primero debes cargar el registro H y X con el valor del comienzo de tabla (LDHX #$F800 por el ejemplo anterior). Luego te tenes que mover al registro X la posicion que deseas buscar (LDX POSICION por ejemplo). Por ultimo cargas al Acumulador el valor contenido en la posicion del X (LDA ,X). Despues pones el valor en la memoria que quieras con la instruccion STA.

Te dejo las instrucciones y una tabla de ejemplo. Cualquier duda consultame.

LDHX #$F800
LDX POSICION
LDA ,X
STA MEMORIA

ORG $F900

PWMH FCB $00,$00,$00,$01,$01,$01,$02,$02
FCB $03,$03,$03,$04,$04,$05,$05,$05
FCB $06,$06,$07,$07,$07,$08,$08,$08
FCB $09,$09,$0A,$0A,$0A,$0B,$0B,$0C
FCB $0C,$0C,$0D,$0D,$0E,$0E,$0E,$0F
FCB $0F,$10,$10,$10,$11,$11,$11,$12
FCB $12,$13,$13,$13,$14,$14,$15,$15
FCB $15,$16,$16,$17,$17,$17,$18,$18
FCB $19,$19,$19,$1A,$1A,$1A,$1B,$1B
FCB $1C,$1C,$1C,$1D,$1D,$1E,$1E,$1E
FCB $1F,$1F,$20,$20,$20,$21,$21,$21
FCB $22,$22,$23,$23,$23,$24,$24,$25
FCB $25,$25,$26,$26,$27
17/03/2011 #28


hace tiempo publique un ejemplo de comunicacion a 9600 con ese cristal.
checalo en el foro
saludos
17/03/2011 #29


maritenz muy buena tu explicacion sobre las tablas y muy bueno tu ejemplo, tengo unas dudas nomas. de tdas maneras ya me estoy poniendo a programam r para empezar a meterle mano a las tablas, gracias.


osea que la la tabla mas grande que yo puedo hacer es de 128 bytes, cierto?
porque en el registro X solo puedo direccionar con 8 bits. no es asi?
a la tabla solamente la puedo hacer en la ram? no en la flash?
o sea que solamente puedo utilizar el espacio disponble que el micro tiene reservado como la memoria ram, o sea que no le puedo asignar una direccion que pertenezca a la flash.

se puede cargar una tabla en la memoria flash?


*********
curioso ya me voy a fijar en dodne esta lo que me dices ese rog que anda a 9600 b.
muchas gracias muy buenos los aportes.

JAJA ME RETARCTO LUEGO DE UN RATO QUE ME PUSE A EXPERIMENTAR Y ANALIZAR LE COMPRENDI MEJOR. lo que si quisiera saber para qu sirve ponerle el nombre? que puedo hacer varias tablas y llamar a cualquiera? no verdad? solo una yu llamo las direcciones.
gracias la verdad muy buena tu explicacion.
17/03/2011 #30


Las tablas van en memoria flash, poner la direccion es para vos estar seguro del origen de la tabla para poderlo cargar en el registro H y X. La verdad que no se la cantidad de valores maximos que podes trabajar con las tablas, pero supongo que seran 256 datos, es el maximo valor que podes obtener con 8 bits. Espero haber aclarado tus dudas. Ah, el nombre es para que se vea bonito nada mas! jaja no es necesario. Consulta si tienes mas dudas.
19/03/2011 #31


MARITENZ ya pude hacer correr la tabla muy buena tu enseñanza, mas claro que eso imposible. gracias ahora ya puedo hacer una tabla y poner los datos que quiera, esta muy bueno, gracias.

ahora lo unico que me queda es aprendr a manejar el modulo SCI.

saludos gracias
19/03/2011 #32


Que bueno haber podido ayudar a alguien en una de las cosas que mas me gusta, que son los micros y la programación. Todos los dias son de aprender con los micros, siempre hay algo que te hace falta y tenes que arreglartelas como puedes porque en internet hay poca info de micros motorola. Me alegra que hayas creado el post este para ayudarnos entre nosotros.

Yo estoy con un proyecto en el cual necesito escribir en la memoria flash mientras corre el programa. Si tienes alguna idea de eso te agradeceria. Porque en el manual sale el diagrama de flujo de como hacerlo, pero hay una nota importantisima que dice que no se puede grabar en flash mientras se esta corriendo un programa desde la flash. Por lo que se hay dos formas: copiar el algoritmo a la ram ( no se como hacerlo); y la otra manipular la rom, pero no hay mucha info de eso. Le voy a estar muy agradecido a cualquiera que pueda ayudarme.
19/03/2011 #33


mira yo casi no lo vi a eso, pero tengo entendido que al programa lo escribes normalmente en la flash como de costumbre, pero hay que reservar un espacio de memoria flash destinada para escribirla durnte el trabajo del micro.
y para escribir en la flash hay que hacerlo utilizando el modulo ROM, que es el modulo ROm Monitor, este es el modulo destinado a la programa cion en el micro, es mas cuando gabamos el micro o lo borramos normalmente es este modulo el que maneja todo la escritura y borrado de la flash.
ya me voy a poner a verlo mas en profundidad asi te doy una mano con eso.
se que tiene un registro el modulo ROM en dodne esos datos escritos en ese registro se guardan en un espacio reservado ya por el usuario de flash. ya me voy a fijar bien
19/03/2011 #34


jorge aca hay un ejemplo y en otros lados tambien, pero el problema que tengo es que no puedo hacerlo correr en el simulador, porque cuando voy a las subrrutinas de la ROM se resetea el micro. Me gustaria probarlo antes de hacerlo funcionar en la realidad. te dejo el link para que veas

http://www3.fi.mdp.edu.ar/electronic..._Flash_JLK.pdf
20/03/2011 #35


hola maritenz, vos me decis que todavia no lo haces correr al programa en el micro? si no que solamente lo simulas? yo te diria que pruebes hacer un programita chico de prueba y lo hagas correr directamente desde tu micro.
por ejemplo pones ocho leds que esten conectados todos al puerto B y un pulsador y haces un programa que por ejemplo tu tienes un dato en el programa, ej. 10011011 y a eso lo haces que lo guarde en la flash y luego puede ser que cuando pulses el pulsador el pc usque en una direccion de flash y te lo escriba en el puerto b, si se te prenden los leds correspondientes a tu dato significa que la transferencia se hace bien, de lo contrario tendras otro dato o nada.

porque es complicado que un programador te simule si es que tiene que afectar registros de flash, me parece que este programa esta bien pero prob asi, ya voy a tratar de hacer lo mismo yo. saludos
21/03/2011 #36


Ya hice mi prube, lo hice correr en el micro al programa. Hice que guardara unos datos que yo define en las 4 primeras posiciones de la tabla. Logro borrar bien, pero el problema aparece cuando quiero escribir. Hasta ahora logre escibir un dato en la primera posicion de la tabla. Cuando quiero escribir otro dato en la siguente posicion no se escribe ahi sino 32 lugares despues del inicio de la tabla. Para ver los resultados obtenidos coloco el micro en la placa programadora y hago como que lo voy a grabar, pero entre todas las opciones que tiene el programa para grabar te permite ver lo que hay en la flash.
22/03/2011 #37


por las dudas te fijaste bien si no estas poniendo mal alguna instruccion en el incremento de (X),
o tal vez te este quedando basura en el registro (X) luego de guardar los priemros datos? digo por el tipo de problema que me dices, porque es quien le dice al pc adonde va a escribir, por lo menos ahora no se te lo resetea cierto? solo que se te corre 32 lugares la segunda escritura cierto?
vos lo podes subir al programa que vos hiciste? o es tal cual al que me pasaste primero? al del ejemplo?

otra pregunta por las dudas: que micro estas utilizando? podrias escribirle el nombre completo?
22/03/2011 #38


Ahi te dejo el programa que yo hice a partir de dos ejemplos que encontre al X lo incremento con in INCX, pero en el ejemplo del link que te pase lo hace con un AIX a lo mejor sea eso. El microcontrolador que uso es MC68HC908JK3. Con este programa logre borrar perfectamente toda la tabla, segun dice el manual se borra de a 64 bytes y se debe grabar de a 32 bytes, yo pienso que por eso el otro dato que escribo se graba 32 lugares mas adelante de la tabla.

Código:
******************************************************************************************
******************************************************************************************
*************************** PROGRAMA PARA GRABAR EN FLASH JK3 ****************************
******************************************************************************************
******************************************************************************************
************************** ASIGNACION DE VARIABLES Y POSICIONES **************************
******************************************************************************************
B            EQU            $01
D            EQU            $03
DDRB         EQU            $05
DDRD         EQU            $07
CONFIG1      EQU            $1F
FLCR         EQU            $FE08               ;REGISTRO DE CONTROL FLASH
FLSPR        EQU            $FE09               ;REGISTRO DE PROTECCION DEL BLOQUE DE FLASH
FLTCR        EQU            $FE0A
CLAVE0       EQU            $A0
CLAVE1       EQU            $A1
CLAVE2       EQU            $A2
CLAVE3       EQU            $A3
AUX0         EQU            $A4
AUX1         EQU            $A5
AUX2         EQU            $A6
AUX3         EQU            $A7
DATOG        EQU            $A8
******************************************************************************************
************************* RUTINAS ROM PARA EL MANEJO DE LA FLASH *************************
******************************************************************************************
GETBYTE      EQU           $FC00               ;Sub-Rutina en ROM TX/RX un Byte x port
RDVRRNG      EQU           $FC03               ;Sub-Rutina en ROM lectura y verif. de un rango
ERARNGE      EQU           $FC06               ;Sub-Rutina en ROM borrado row / mass Flash
PRGRNGE      EQU           $FC09               ;Sub-Rutina en ROM escritura datos en FLASH
DELNUS       EQU           $FC0C               ;Sub-Rutina en ROM DELAY "N" microsegundos
PAGINA       EQU           $EC00               ;Primera dir de la primera página de Flash
RAM          EQU           $0080               ;Dirección de inicio de la RAM
Rutinas_Rom  EQU           RAM+8               ;RAM para uso del "MONITOR ROM"


******************************************************************************************
;RAM p/uso en prog/erase flash, Rutinas ROM.
;Estas variables deben estar en estas direcciones NO CAMBIAR!!!!!!!
             ORG           Rutinas_Rom
CTRLBYT      RMB           1                    ;BIT 6 -> MASS FLAG, 1 -> mass er
CPUSPD       RMB           1                    ;CPU speed -> 4 x Fop aprox.
LADDR        RMB           2                    ;Dirección de FLASH
DATA         RMB           1                    ;Dato a escribir en la Flash ($008C)
TEMPORAL     RMB           1                    ;Buffer temporal para guardar datos por ejemplo el X
******************************************************************************************
             ORG           PAGINA              ;TABLA PARA GRABADO DE DATOS
             FCB           $01,$03,$07,$08,$03,$01,$07,$06
             FCB           $01,$03,$07,$08,$03,$01,$07,$06
             FCB           $01,$03,$07,$08,$03,$01,$07,$06
             FCB           $01,$03,$07,$08,$03,$01,$07,$06
             FCB           $01,$03,$07,$08,$03,$01,$07,$06
             FCB           $01,$03,$07,$08,$03,$01,$07,$06
             FCB           $01,$03,$07,$08,$03,$01,$07,$06
             FCB           $01,$03,$07,$08,$03,$01,$07,$06
******************************************************************************************
             ORG           $ED00                ;ORIGEN DEL PROGRAMA
******************************************************************************************
INICIO       MOV           #$01,CONFIG1         ;DESACTIVO PERRO GUARDIAN
             RSP                                ;Reset del STACK
             LDA           #$FF
             STA           FLSPR               ;Se quita la protección de la FLASH toda
             SEI                               ;ELIMINO INTERRUPCIONES
             CLR           DATOG

             NOP
             JSR           borrar_pagina
             MOV           #$54,DATOG
             JSR           ESCRIBO_FLASH
         INCX
         MOV           #$54,DATOG
         JSR           ESCRIBO_FLASH    
I2           BRA           I2



******************************************************************************************
************************************** SUBRRUTINAS ***************************************
******************************************************************************************
Borrar_Pagina:
             MOV           #00,CTRLBYT           ; CTRLBYT = 0 -> MASS ERASE -> P.E
             MOV           #10,CPUSPD            ; CPUSPD=10 -> 4xFop -> 4x 2,45
             LDHX          #PAGINA               ;H:X = A la primera dir de la Pagina ($EC00)
             JSR           ERARNGE               ;Rutina ROM que borra un rango de la Flash
             NOP                                 ;Debo estar seguro de que X=0 cuando entre en
             NOP                                 ;la rutina de escribir en la FLASH para que el dato
             NOP                                 ;se guarde en el vector 0 al inicio del array.
             CLRX
             RTS                                 ;Retorno de Subrutina
******************************************************************************************
Escribo_Flash:
             STX           TEMPORAL              ;GUARDO EL INDICE DEL X EN EL TEMPORAL
             MOV           #00,CTRLBYT           ;CTRLBYT = 0 -> MASS ERASE = 0
             MOV           #10,CPUSPD            ;CPUSPD=10 -> 4xFop -> 4x 2,45
             LDHX          #PAGINA               ;H:X = $EC00 (Primer vector de la Pagina)
             LDX           TEMPORAL              ;RECUPERO EL INDICE DEL X EN EL TEMPORAL
             STHX          LADDR                 ;completa a la rutina ROM PRGRNGE (H=$EC y X=offset)
             LDA           DATOG
             STA           DATA
             LDA           #$FF                  ;Debo escribir cualquier cosa
             STA           FLSPR                 ;en el registro "FLBPR" antes...JSR           PRGRNGE               ;Rutina ROM, DATA contiene lo que se escribirá en la Flash
             NOP
             NOP
             RTS                                 ;Retorno de Subrutina
******************************************************************************************

             ORG           $FFFE                 ;VECTORES DE RESET
RESET        DW            INICIO
             END
23/03/2011 #39


pandacba dijo: Ver Mensaje
y si de investigar se trata y te falta un montón, te falta Motorola,
Motorola es Freescale
23/03/2011 #40


Jorge ya logre solucionar el problema, como te decia en el comentario anterior para grabar se hace de a 32 bloques, por lo tanto el X salta 32 lugares, lo que hice fue puse la instruccion AIX #-1F para grabar en la segunda posicion y luego un AIX #-1E para la tercera y asi suscesivamente le vas restando uno al valor que pones en AIX. Para mi caso es suficiente con guardar 4 valores por lo cual no es mucho problema, la cuestion seria si quieres grabar 64 valores. Hay que encontrar una forma mas eficiente de hacerlo. Se me ocurren algunas, pero con este programa asi estoy satisfecho, si en algun momento me hace falta guardar mas datos lo optimizare. Te dejo el programa ya funcionando asi si lo quieres lo guardas. Otra cosa los datos que grabe son aleatorios son para probar el funcionamiento.

Código:
******************************************************************************************
******************************************************************************************
*************************** PROGRAMA PARA GRABAR EN FLASH JK3 ****************************
******************************************************************************************
******************************************************************************************
************************** ASIGNACION DE VARIABLES Y POSICIONES **************************
******************************************************************************************
B            EQU            $01
D            EQU            $03
DDRB         EQU            $05
DDRD         EQU            $07
CONFIG1      EQU            $1F
FLCR         EQU            $FE08               ;REGISTRO DE CONTROL FLASH
FLSPR        EQU            $FE09               ;REGISTRO DE PROTECCION DEL BLOQUE DE FLASH
FLTCR        EQU            $FE0A
CLAVE0       EQU            $A0
CLAVE1       EQU            $A1
CLAVE2       EQU            $A2
CLAVE3       EQU            $A3
AUX0         EQU            $A4
AUX1         EQU            $A5
AUX2         EQU            $A6
AUX3         EQU            $A7
DATOG        EQU            $A8
******************************************************************************************
************************* RUTINAS ROM PARA EL MANEJO DE LA FLASH *************************
******************************************************************************************
GETBYTE      EQU           $FC00               ;Sub-Rutina en ROM TX/RX un Byte x port
RDVRRNG      EQU           $FC03               ;Sub-Rutina en ROM lectura y verif. de un rango
ERARNGE      EQU           $FC06               ;Sub-Rutina en ROM borrado row / mass Flash
PRGRNGE      EQU           $FC09               ;Sub-Rutina en ROM escritura datos en FLASH
DELNUS       EQU           $FC0C               ;Sub-Rutina en ROM DELAY "N" microsegundos
PAGINA       EQU           $EC00               ;Primera dir de la primera página de Flash
RAM          EQU           $0080               ;Dirección de inicio de la RAM
Rutinas_Rom  EQU           RAM+8               ;RAM para uso del "MONITOR ROM"


******************************************************************************************
;RAM p/uso en prog/erase flash, Rutinas ROM.
;Estas variables deben estar en estas direcciones NO CAMBIAR!!!!!!!
             ORG           Rutinas_Rom
CTRLBYT      RMB           1                    ;BIT 6 -> MASS FLAG, 1 -> mass er
CPUSPD       RMB           1                    ;CPU speed -> 4 x Fop aprox.
LADDR        RMB           2                    ;Dirección de FLASH
DATA         RMB           1                    ;Dato a escribir en la Flash ($008C)
TEMPORAL     RMB           1                    ;Buffer temporal para guardar datos por ejemplo el X
******************************************************************************************
             ORG           PAGINA              ;TABLA PARA GRABADO DE DATOS
             FCB           $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
             FCB           $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
             FCB           $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
             FCB           $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
             FCB           $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
             FCB           $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
             FCB           $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
             FCB           $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
******************************************************************************************
             ORG           $ED00                ;ORIGEN DEL PROGRAMA
******************************************************************************************
INICIO       MOV           #$01,CONFIG1         ;DESACTIVO PERRO GUARDIAN
             RSP                                ;Reset del STACK
             LDA           #$FF
             STA           FLSPR               ;Se quita la protección de la FLASH toda
             MOV           #$00,CTRLBYT
             MOV           #$0A,CPUSPD         ;Frecuencia para la rutina DELNUS (9.8304MHz 10Mhz ($0A)
             SEI                               ;ELIMINO INTERRUPCIONES
             CLR           DATOG

             NOP
             JSR           borrar_pagina
             MOV           #$15,DATOG
             JSR           ESCRIBO_FLASH
             AIX           #-1F                 ;POSICIONO AL X EN EL SEGUNDO LUGAR DE LA TABLA
         MOV           #$26,DATOG
         JSR           ESCRIBO_FLASH
             AIX           #-1E                 ;POSICIONO AL X EN EL SEGUNDO LUGAR DE LA TABLA
             MOV           #$59,DATOG
         JSR           ESCRIBO_FLASH
             AIX           #-1D                 ;POSICIONO AL X EN EL SEGUNDO LUGAR DE LA TABLA
             MOV           #$DC,DATOG
         JSR           ESCRIBO_FLASH
             
I2           BRA           I2                   ;LAZO INFINITO 



******************************************************************************************
************************************** SUBRRUTINAS ***************************************
******************************************************************************************
Borrar_Pagina:
             MOV           #00,CTRLBYT           ; CTRLBYT = 0 -> MASS ERASE -> P.E
             MOV           #10,CPUSPD            ; CPUSPD=10 -> 4xFop -> 4x 2,45
             LDHX          #PAGINA               ;H:X = A la primera dir de la Pagina ($EC00)
             JSR           ERARNGE               ;Rutina ROM que borra un rango de la Flash
             NOP                                 ;Debo estar seguro de que X=0 cuando entre en
             NOP                                 ;la rutina de escribir en la FLASH para que el dato
             NOP                                 ;se guarde en el vector 0 al inicio del array.
             CLRX
             RTS                                 ;Retorno de Subrutina
******************************************************************************************
Escribo_Flash:
             STX           TEMPORAL              ;GUARDO EL INDICE DEL X EN EL TEMPORAL
             MOV           #00,CTRLBYT           ;CTRLBYT = 0 -> MASS ERASE = 0
             MOV           #10,CPUSPD            ;CPUSPD=10 -> 4xFop -> 4x 2,45
             LDHX          #PAGINA               ;H:X = $EC00 (Primer vector de la Pagina)
             LDX           TEMPORAL              ;RECUPERO EL INDICE DEL X EN EL TEMPORAL
             STHX          LADDR                 ;completa a la rutina ROM PRGRNGE (H=$EC y X=posicion)
             LDA           DATOG
             STA           DATA
             LDA           #$FF                  ;Debo escribir cualquier cosa
             STA           FLSPR                 ;en el registro "FLBPR" antes...
             JSR           PRGRNGE               ;Rutina ROM, DATA contiene lo que se escribirá en la Flash
             NOP
             NOP
             RTS                                 ;Retorno de Subrutina
******************************************************************************************

             ORG           $FFFE                 ;VECTORES DE RESET
RESET        DW            INICIO
             END
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.