Autor Tema: Preguntas sobre assembler  (Leído 11564 veces)

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

Desconectado syndu

  • PIC10
  • *
  • Mensajes: 12
Re: Preguntas sobre assembler
« Respuesta #30 en: 12 de Marzo de 2015, 22:02:25 »
No, vos recibis de a 1 byte.

Si vos de la PC mandas esto: "12"

recibirias 2 bytes, 0x31 y 0x32

Luego cuando recibas podes hacer que el primer numero vaya a Var_C o que ambos numeros los convertis en binario y alamacenas en Var_C

hola! gracias por tu constante ayuda! :) ya entiendo lo de enviar y recibir datos! el unico problemita que tengo es que al enviar algo atraves de una tabla DT no envio todo completo :( cuando lo hago "paso a paso" si funciona, y no entiendo porque! otra cosa, mi programa utiliza dos interrupciones las del periferico y el timer 0, lo que sucede es que se desborda el timer aunq no le cargo ningun valor, hasta donde entendido solo empieza a contar el timer cuando le cargo algo, pero a mi se me desborda antes de tiempo, les dejo mi configuracion inicial y el codigo de enviar datos



;------------------------------------------------------------------
;configuro inicio del programa con el vector reset/interrupcion
;*****************************************************************
        org 00H
        goto inicio

     org 04h
        goto Interrupcion
;-----------------------------------------------------------------------
; Inicia Programa
; CONFIGURO I/O
;**********************************************************************
inicio
;clrwdt

    ERRORLEVEL   -302
;*********************************************************************
;Configuro para envio y recepcion de datos
; Configuro puertos de entradas y salidas
;---------------------------------------------------------------------
   BANKSEL   ANSEL            ;I/O DIGITALES
   clrf   ANSEL
   clrf   ANSELH
    bcf     BAUDCTL,BRG16       ;BAUD DATA PARA 8BITS

    BANKSEL TRISC
   movlw   B'10000000'
   movwf   TRISC
    movlw   b'00000000'
    movwf   TRISB
    movwf   TRISE
    clrwdt
    BANKSEL TXSTA
    movlw   b'00100100'
    movwf   TXSTA
    bsf     PIE1,RCIE
    movlw   b'10000010'
    movwf   OPTION_REG
    movlw   .25
    movwf   SPBRG

    BANKSEL RCSTA
    bsf     RCSTA,CREN
    bsf     RCSTA,SPEN
    movlw   b'11000000'
    movwf   INTCON

    BANKSEL PORTB
    clrf    PORTB
    movlw   b'00000111'
    movwf   PORTE

cic1
    call    MENU                        ;MENU COLORES, HYPERTERMINAL
    movwf   dato                        ;lo guarda en dato
    sublw   "$"                         ;Compara con el signo "0"
    btfsc   STATUS,Z                    ;
    goto    rep                         ;si es, reinicia
    call    envia                       ;si no es "0" envía el dato
    incf    apun,f                     ;apunta al siguiente carácter
    goto    cic1

rep
   clrf    apun
    clrf    dato
cic2
    call    LISTO
    movwf   dato                        ;lo guarda en dato
    sublw   "$"                         ;Compara con el signo "0"
    btfsc   STATUS,Z                    ;
    goto    rep1                         ;si es, reinicia
    call    envia                       ;si no es "0" envía el dato
    incf    apun,f                      ;apunta al siguiente carácter
    goto    cic2

rep1
    clrf    apun1
    movlw   .16
    subwf   COLORES16,W
    btfss   STATUS,Z
    goto    Carga_duty
    movlw   "$"
    xorwf   MOVIMIENTO,W
    btfsc   STATUS,Z
    goto    Carga_duty
    goto    $-8

envia

    bsf     STATUS,RP0                  ;banco 1
esp
    btfss   TXSTA,TRMT                  ;checa si el buffer de transmisión
    goto    esp                         ;si está ocupado espera
    bcf     STATUS,RP0                  ;regresa al banco 0
    bcf     PIR1,TXIF
    movf    dato,W                      ;rescata dato a enviar
    movwf   TXREG                       ;lo envía
    btfss   PIR1,TXIF
    goto    $-1
    return

;----------RUTINA DE TRANSMISION DE DATOS-----------------
ENVIA                  ;SUBRUTINA DE ENVIO POR TRANSMISOR
   BCF      PIR1,TXIF
   MOVWF   TXREG
   BTFSS   PIR1,TXIF
   GOTO   $-1
   BANKSEL   TXSTA
ENVIANDO
   btfsc   TXSTA,TRMT
   GOTO   ENVIANDO
   BANKSEL   RCSTA
   RETURN

MENU
    movf    apun,W                      ;carga apuntador en W
    addwf   PCL,f
   DT     "Menu:",0x0D
    DT      "Rojo=1",0x0D
    DT      "Verde=2",0x0D
    DT      "Azul=3",0x0D
    DT      "Amarillo=4",0x0D
    DT      "Agua=5",0x0D
    DT      "Magente=6",0x0D
    DT      "Orange=7",0x0D
    DT      "Bonito=8",0x0D
    DT      "Morado=9",0x0D
    DT      "Marrón=10",0x0D
    DT      "Violeta=11",0x0D
    DT      "Oscuro=12",0x0D
    DT      "Verde1=13",0x0D
    DT      "Rosado=14",0x0D
    DT      "Verde2=15",0x0D
    DT      "Blanco=16",0x0D
    DT      0x0D,0x0D,"$"
LISTO
    movf    apun,W
    addwf   PCL,f
    DT      "Escoja Color",0x0D
   DT      0x0D,0x0D
   DT      "$"




Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Preguntas sobre assembler
« Respuesta #31 en: 12 de Marzo de 2015, 23:12:09 »
Citar
el unico problemita que tengo es que al enviar algo atraves de una tabla DT no envio todo completo Sad cuando lo hago "paso a paso" si funciona, y no entiendo porque! otra cosa, mi programa utiliza dos interrupciones las del periferico y el timer 0, lo que sucede es que se desborda el timer aunq no le cargo ningun valor, hasta donde entendido solo empieza a contar el timer cuando le cargo algo, pero a mi se me desborda antes de tiempo, les dejo mi configuracion inicial y el codigo de enviar datos

Empecemos por el TIMER1 que es lo mas facil. No veo que estes activando su interrupcion. Lo unico que veo activo es la de recepcion del UART.
Los timer por ahi difieren.. Ejemplo, el timer0 no puede ser parado. esta continuamente contando, el Timer1 es uno de los pocos que se puede parar su marcha con el bit TMR1ON. El Timer 2 tampoco puede ser detenido.
Ninguno comienza a contar cuando le cargas un valor.

Y a que te referis a que no recibis "todo completo" cual es el problema (o que te muestra en la salida)?

Tenes que tener cuidado que si tu tabla tiene mas de 256 caracteres con un solo apuntador no vas a poder hacerlo.
Tambien El addwf   PCL,f modifica solo el registro PCL, lo cual si por ejemplo tu tabla comienza en la direccion: 0x150
Solo podrias ir con esa instruccion de 0x150 a 0x1FF , solo unos 176 caracteres. En cambio un CALL/GOTO son 10bits de direccionamiento dentro del mismo OPCODE.

Lo mas seguro es que no llegues al limite de los 256 caracteres pero que tu tabla este a la mitad. Por las dudas trata de poner tu tabla al comienzo del programa, o de ultima hace un ORG 0x200/0x300 para ubicar las tablas ( y si es que tu programa no es tan largo )
Si ya pasas a 0x400+ deberias de modificar el PCLATH antes de cada call a la tabla ( mas engorroso, proba la posibilidad de ponerlo al comienzo del programa y listo.

Desconectado syndu

  • PIC10
  • *
  • Mensajes: 12
Re: Preguntas sobre assembler
« Respuesta #32 en: 12 de Marzo de 2015, 23:48:18 »
Citar
el unico problemita que tengo es que al enviar algo atraves de una tabla DT no envio todo completo Sad cuando lo hago "paso a paso" si funciona, y no entiendo porque! otra cosa, mi programa utiliza dos interrupciones las del periferico y el timer 0, lo que sucede es que se desborda el timer aunq no le cargo ningun valor, hasta donde entendido solo empieza a contar el timer cuando le cargo algo, pero a mi se me desborda antes de tiempo, les dejo mi configuracion inicial y el codigo de enviar datos

Empecemos por el TIMER1 que es lo mas facil. No veo que estes activando su interrupcion. Lo unico que veo activo es la de recepcion del UART.
Los timer por ahi difieren.. Ejemplo, el timer0 no puede ser parado. esta continuamente contando, el Timer1 es uno de los pocos que se puede parar su marcha con el bit TMR1ON. El Timer 2 tampoco puede ser detenido.
Ninguno comienza a contar cuando le cargas un valor.


MMM, espera, tenia entendido que el timer0 empezaba a contar cuando le caragba un valor, ejemplo
movlw .100
movwf TMR0

despues de ese momento es que el empezaba a contar no antes... y si lo activo, en el registro OPTION_REG

Y a que te referis a que no recibis "todo completo" cual es el problema (o que te muestra en la salida)?

Tenes que tener cuidado que si tu tabla tiene mas de 256 caracteres con un solo apuntador no vas a poder hacerlo.
Tambien El addwf   PCL,f modifica solo el registro PCL, lo cual si por ejemplo tu tabla comienza en la direccion: 0x150
Solo podrias ir con esa instruccion de 0x150 a 0x1FF , solo unos 176 caracteres. En cambio un CALL/GOTO son 10bits de direccionamiento dentro del mismo OPCODE.

Lo mas seguro es que no llegues al limite de los 256 caracteres pero que tu tabla este a la mitad. Por las dudas trata de poner tu tabla al comienzo del programa, o de ultima hace un ORG 0x200/0x300 para ubicar las tablas ( y si es que tu programa no es tan largo )
Si ya pasas a 0x400+ deberias de modificar el PCLATH antes de cada call a la tabla ( mas engorroso, proba la posibilidad de ponerlo al comienzo del programa y listo.

ya entendi lo de la tabla, el mensaje no se enviaba completo porque se pasaba la variable de 256, lo que hice fue dividirla, se envia un mensaje completo, pero sigo con el problema de desbordamiento del timer 0... aca lo que modifique


inicio
cic1
    call    MENU                        ;MENU COLORES, HYPERTERMINAL
    movwf   dato                        ;lo guarda en dato
    sublw   "#"                         ;Compara con el signo "0"
    btfsc   STATUS,Z                    ;
    goto    rep                         ;si es, reinicia
    call    ENVIA                       ;si no es "0" envía el dato
    incf    apun,f                     ;apunta al siguiente carácter
    goto    cic1

rep
   clrf    apun
    clrf    dato
cic2
    call    Menu1
    movwf   dato                        ;lo guarda en dato
    sublw   "#"                         ;Compara con el signo "0"
    btfsc   STATUS,Z                    ;
    goto    rep1                         ;si es, reinicia
    call    ENVIA                       ;si no es "0" envía el dato
    incf    apun,f                      ;apunta al siguiente carácter
    goto    cic2

rep1
    clrf    apun
    clrf    dato
 aqui
    goto    aqui
MENU
;    clrwdt
    movf    apun,W                      ;carga apuntador en W
    addwf   PCL,f
   DT     "Menu:",0x0D
    DT      "Rojo=0",0x0D
    DT      "Naranja=1",0x0D
    DT      "Amarillo=2",0x0D
    DT      "Amarillo oscuro=3",0x0D
    DT      "Amarillo Claro=4",0x0D
    DT      "Verde=5",0x0D
    DT      "Verde Claro=6",0x0D
    DT      "Cyan=7",0x0D
    DT      "Azul Claro=8",0x0D
    DT      "Azul Cielo=9",0x0D
    DT      "Azul=A",0x0D
    DT      "Azul Oscuro=B",0x0D
    DT      "Azul Lyon=C",0x0D
    DT      "Morado=D",0x0D
    DT      "Indigo=E",0x0D
    DT      "Blanco=F",0x0D
    DT      "#",0x0D

Menu1
    movf    apun,W                      ;carga apuntador en W
    addwf   PCL,f
    DT      "Blanco Leche=G",0x0D
    DT      "Blanco Rosa=H",0x0D
    DT      "Blanco Verde=I",0x0D
    DT      "Blanco Azul=J",0x0D
    DT      0x0D,0x0D,"#"

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Preguntas sobre assembler
« Respuesta #33 en: 13 de Marzo de 2015, 05:30:02 »
Citar
MMM, espera, tenia entendido que el timer0 empezaba a contar cuando le caragba un valor, ejemplo
movlw .100
movwf TMR0

despues de ese momento es que el empezaba a contar no antes... y si lo activo, en el registro OPTION_REG

No... Al hacer eso le cargas 100 al TMR0, pero si no le cargas nada, va a contar los pulsos de reloj con lo que tenga en los registros del TMR0, si por ejemplo inicia con 0x00, entonces va a seguir contando hasta que llegue a 0xFF y se produsca el overflow a 0x00, poniendo un 1 en T0IF. SI le cargas 100 como decis va a ocurrir lo mismo (nomas que al cargarle 100 sobrescribis el valor que tenia antes TMR0), va a comenzar con 100, hasta que llegue a 255 ( 0xFF ) se produce el overflow a 0x00 y sigue contando a no ser que vos nuevamente le pongas 100 volviendo a borrar el valor que tenia, suponete que te tardaste 10 ciclos para cargar el 100, entonces estarias sobrescribiendo un 0x05 que habia alli ( 5 por que tiene un prescaler minimo de 2).

el TMR va a activar el flag si o si... por que esta continuamente andando.. no lo podes parar. Ah no ser que a cada rato estes poniendolo a 0 al TMR0, pero no tiene sentido si no lo usas. ( Ya que si no lo usas no preguntarias por T0IF en la interrupcion o tendrias habilitado T0IE )
Si lo usas estarias cargando el nuevo valor en la interrupcion, asi que no tendrias problemas, si buscas algun timer que puedas parar entonces usas el TMR1
Mientras no tengas habilitada la interrupcion (T0IE) no va a haber problemas... es decir no va a entrar a la interrupcion por culpa del timer 0. Si preguntas por el flag obviamente vas a ver que puede estar en 1 (T0IF).

Una forma de parar al TMR0 seria sacrificando un pin, si pones a 0 el pin de T0CKl (dejando a 1 T0CS de OPTION_REG) y seleccionas que esa sea la entrada no contaria nunca por lo cual no activaria T0IF jamas. Podes ver lo que digo mirando el diagrama de TMR0 en el datasheet. Aunque como dije no tiene sentido ( o no te importa el T0IF si no usas el timer, ya que si lo usas seguro le estas cargando un valor  ). Con lo cual esto lleva a una leccion, antes de activar la interrupcion del TMR0, se necesitan 3 instrucciones, 1 para borrar el flag y 2 para cargar el nuevo valor, asi luego podes activar la interrupcion del mismo.
« Última modificación: 13 de Marzo de 2015, 06:32:05 por KILLERJC »

Desconectado syndu

  • PIC10
  • *
  • Mensajes: 12
Re: Preguntas sobre assembler
« Respuesta #34 en: 14 de Marzo de 2015, 14:38:05 »
mm ok! :/ desisti de usar ese timer.. no me servia.... otra pregunta.. yo tengo el archivo hex de un pograma... com puedo pasarlo a ASM??
este es el codigo..

:1000000000308A002D2C0000FF00030E8301A100A8
:100010000A08A0008A010408A2007708A300780853
:10002000A4007908A5007A08A6007B08A70083131E
:1000300083120B1E1D288B183028220884002308E9
:10004000F7002408F8002508F9002608FA00270818
:10005000FB0020088A00210E8300FF0E7F0E09009E
:100060008A110A12AA2A0A108A100A118207283451
:100070000C34013406340A108A100A1182070D3438
:1000800009340E34BA3415347134163431341A3418
:100090007A341B3473341C3461341D3477341E3489
:1000A00032342134633422347834233464342434B5
:1000B00065342534343426343334293420342A3416
:1000C00076342B3466342C3474342D3472342E341C
:1000D000353431346E343234623433346834343449
:1000E0006734353479343634363439342C343A3450
:1000F0006D343B346A343C3475343D3437343E34EB
:10010000383441342C3442346B344334693444340D
:100110006F34453430344634393449342E344A341B
:100120002D344B346C344C34F1344D3470344E3403
:1001300027345234B434543460345534A1345A34EE
:100140000D345B342B345D34E73461343C34663435
:100150000834693431346B3434346C3437347034AB
:10016000303471342E347234323473343534743460
:1001700036347534383479342B347A3433347B3430
:100180002D347C342A347D343934003400340A1060
:100190008A100A11CE3E03188A0A82000D340934EF
:1001A0000E34AA3415345134163421341A345A34E6
:1001B0001B3453341C3441341D3457341E34223420
:1001C00021344334223458342334443424344534E1
:1001D000253424342634B734293420342A34563490
:1001E0002B3446342C3454342D3452342E342534AC
:1001F00031344E3432344234333448343434473476
:10020000353459343634263439344C343A344D3458
:100210003B344A343C3455343D342F343E34283456
:1002200041343B3442344B344334493444344F3406
:1002300045343D344634293449343A344A345F3401
:100240004B344C344C34D1344D3450344E343F3430
:100250005234A83454345E345534BF345A340D34D7
:100260005B342A345D34C73461343E346634083438
:10027000693431346B3434346C3437347034303462
:1002800071342E3472343234733435347434363439
:100290007534383479342B347A3433347B342D3418
:1002A0007C342A347D343934003400340A148A1002
:1002B0000A1182070A340D34503443342034413457
:1002C000543420344B346534793462346F346134BF
:1002D00072346434203449346E3474346534723486
:1002E0006634613463346534203456346534723492
:1002F000203431342E343034203462347934203494
:1003000058345034383431343034303400340A14F2
:100310008A100A1182070A340D344134643470346F
:1003200061347034743465346434203466346F342A
:10033000723420343134363446343634323438343E
:100340004134203462347934203452346534643496
:1003500070346934633400340A148A100A11820735
:100360000A340D344434653463346F346434653492
:100370007234203461346E34643420344D346F343C
:100380006E34693474346F34723469346E34673463
:10039000203466346F347234203431343634463489
:1003A0003634323438344134203463346F346E346C
:1003B0006E346534633474346534643420340A3400
:1003C0000D340A340D3400340A148A100A118207DD
:1003D0005F3400340A148A100A1182072034003472
:1003E00083160611831206110830F800F729000061
:1003F000F817082AF813C50C03180615031C061174
:100400007817082A7813F80BFB29062A000006152E
:1004100050308400840B0A2A0D2AF81BFA29781B15
:10042000022A0034F0308316880083120815000079
:10043000081400000808080E0F39CD00081000004D
:100440000814222A232A00000808080E0F39CC00BD
:10045000081000308316880083124D0EF700F0302C
:10046000F70577084C04F80000344D0EF039F7001A
:100470000F30080577048800000008140330F700E7
:10048000F70B402A08100034881012227808CC009C
:10049000CC1B452A4A1C88104A18881400000811F1
:1004A000000008104B0ECC000F30CC054C08CD00DE
:1004B00035224B080F39CC00CD00352200344630B0
:1004C0008400831300080319722A0630F800F7012C
:1004D000F70B682AF80B672A7B30F700F70B6E2AB8
:1004E000800B652A0034470B762A792A4030C800F1
:1004F0007A2AC80101304602C80748088038C90076
:10050000CA014908CB004422003445080C3A0319BB
:10051000902A063A0319982A023A03199E2AA32A16
:10052000CA010130CB0044220230C6005F22A92A52
:100530000130C6000230C7007322A92ACA01103058
:10054000CB004422A92A0130CA004508CB0044222E
:10055000A92A00342D080A3C031CBD2A2D08023CA0
:100560000318BD2A0310C00C831686158312B00130
:100570008619B00A300BBD2AC017AD0B252C4008D8
:10058000C1005B30C500F0214108C3003730C40012
:10059000C41BDA2A0F30F700430EF7050A30770242
:1005A0000318D52A3030F707D72A4408F707770809
:1005B000C500F0210F30C3050A3043020318E22AB8
:1005C0003030E42AC4134408C3074308C500F021AF
:1005D0005D30C500F021B108031D132C4108F03A2D
:1005E0000319FC2AE23A0319FF2A4B3A0319022B9A
:1005F000033A0319052B0D2B0130B100122C0130E9
:10060000B200122C0130B200122CB2010A30C50027
:10061000F0210D30C500F021122CB208031D682B0B
:10062000C2010310420D3B2041020319202B03108D
:10063000420D3B20F800F8080319202BC20A112BA9
:100640000310420D3B204102031D672B0310420D96
:10065000013E3B20C4003C30C500F0214408C500E9
:10066000F0213E30C500F0210310420D013E3B2039
:10067000C400C50085220130A907831689108312A2
:10068000891083160910831209143230C6005F22C4
:1006900083168910831289143230C6005F228316B4
:1006A0000910831209103230C6005F2283168501BB
:1006B0008312290885000310420D013E3B20C4002F
:1006C0000030B40083168701831244088700112C80
:1006D000C2010310420DC72041020319782B0310F9
:1006E000420DC720F800F8080319782BC20A692BBD
:1006F0000310420DC7204102031D112C0310420DAF
:10070000013EC720C4003C30C500F0214408C500AC
:10071000F0213E30C500F0210310420D013EC720FC
:10072000C400C50085220310420D013EC720253CB0
:10073000031DE52B0130C600C7007322AA012A0859
:100740000F3C031CB02BC3014308EA2100380319F6
:10075000AD2BC30AC5008522A42B0130AA079F2B0D
:100760000130C600C70073228316891083128910D6
:1007700083160910831209148316091083120914B1
:10078000FF30A900AA012A080F3C031CE42B2B0808
:100790002E3C0319E42B0130A9078316850183122F
:1007A00029088500FF30B4008316870083120708EC
:1007B000AB002B08C50085220230C300FA30C6000A
:1007C0005F22C30BDE2BC32B112C0130A90783162C
:1007D000891083128910831609108312091432308C
:1007E000C6005F2283168910831289143230C60036
:1007F0005F2283160910831209103230C6005F226F
:10080000831685018312290885000310420D013EDD
:10081000C720C4000030B400831687018312440847
:100820008700122C202CB1014108123A03191C2C0C
:100830004B3A03191E2C202CB201202CB201202C83
:10084000C0010B30AD000130AE000130AE00AF0A88
:100850000B128B108A110A121D2803081F398300FE
:100860005730F7002030840083138001840AF70B8F
:10087000352CF801F901FA01FB01FC01FD01FE0133
:100880005030F700A030840083138001840AF70BF6
:10089000452C6030F7001030840083178001840AF3
:1008A000F70B4E2C83136030F700903084008317D1
:1008B0008001840AF70B582C8313A0018401831351
:1008C0001F308305831606118312061583161F1425
:1008D0009F141F159F1107309C00FF308312A90041
:1008E000AA01B101B201B301B4000430B500A801FE
:1008F0008B1BA8178B13C830C6005F22A81B8B1751
:10090000B50B772C0B30AD00B50135085621B50A73
:10091000F700A8018B1BA8178B137708C500F021DF
:10092000A81B8B172C303502031D852CB50135080B
:100930008721B50AF700A8018B1BA8178B1377082E
:10094000C500F021A81B8B1720303502031D972C02
:10095000B5013508AC21B50AF700A8018B1BA81713
:100960008B137708C500F021A81B8B172F30350299
:10097000031DA92C0330B6002E30A8018B1BA8172D
:100980008B13C500F021A81B8B17B60BBC2C2F3086
:10099000B7003708AC21B70AF700A8018B1BA817CE
:1009A0008B137708C500F021A81B8B173330370253
:1009B000031DC92C0030831688008312881008118B
:1009C0000810A8018B1BA8178B130F30C6005F22DD
:1009D000A81B8B170130B5003508033C031C042D00
:1009E000A8018B1BA8178B130330CD003522A81B41
:1009F0008B17A8018B1BA8178B130530C6005F222D
:100A0000A81B8B17B50AEC2CA8018B1BA8178B13FE
:100A10000230CD003522A81B8B17B5013508033CE9
:100A2000031C212D35083320B600A8018B1BA81705
:100A30008B13CA013608CB004422A81B8B17B50ABA
:100A40000E2DB5013508E42100380319312DB50A02
:100A5000A8018B1BA8178B13C5008522A81B8B1719
:100A6000222D83160614861581130830F700F70B24
:100A7000372D861283128612AF01AE01B0018316A4
:100A8000011383128B100B16C0308B042E0B4B2DD1
:0A0A9000AE018B100B16462D63001B
:02400E003A3F37
:00000001FF
;PIC16F877A

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Preguntas sobre assembler
« Respuesta #35 en: 14 de Marzo de 2015, 18:40:21 »
Aca hay un post explicando y debatiendo el tema:

http://www.todopic.com.ar/foros/index.php?topic=23342.0

10 0000 00 - 00 30 8A 00 2D 2C 00 00 FF 00 03 0E 83 01 A1 00 - A8

16 datos (0x10) desde la posicion (0x0000) tipo cadena: datos ( 0x00 ), checksum 0xA8

0000 - 3000
0002 - 008A
0004 - 2C2D
0006 - 0000
0008 - 00FF
000A - 0E03
000C - 0183
000E - 00A1

Te vas a el set de instrucciones del datasheet y comenzas a reemplazar, son 14 bits cada opcode

Código: ASM
  1. MOVLW 0x00
  2. MOVWF 0xA
  3. GOTO  0x42D
  4. NOP
  5. MOVWF 0x7F
  6. SWAPF  0x3,W
  7. CLRF     0x3
  8. MOVWF 0x21

Reemplazando las direcciones por sus registros ( excepto el GOTO que debe apuntar a alguna bandera )

Código: ASM
  1. MOVLW 0x00      ;Vector de reset
  2. MOVWF PCLATH
  3. GOTO  0x42D
  4. NOP               ;Vector de interrupcion
  5. MOVWF 0x7F   ; Ultimo registro de proposito general del banco 0
  6. SWAPF  STATUS,W
  7. CLRF     STATUS
  8. MOVWF 0x21  ; Registro de proposito general tambien

LLeva un buen tiempo :) , pero seguro que hay algun programa por ahi que te lo puede hacer mas simple

La misma info aca:
http://en.wikipedia.org/wiki/Intel_HEX

La otra es abrir el MPLAB X, crear un nuevo proyecto del tipo Prebuilt(hex) project.
Ahi agregas tu archivo .hex y seleccionas el PIC con el cual trabajas.
se crea el proyecto y luego te vas al menu Window -> PIC Memory View -> Program memory

Y ahi te aparece todo en ASM, si queres ponerlo en un archivo busca cual es la ultima linea. click derecho sobre esa ventana, Output to file, de linea 1 a XXXX o te podes manejar por direcciones y te queda algo como lo que voy a adjuntar

Se pierden los nombres de los registros creados por el usuario, y los nombres de las banderas.
« Última modificación: 15 de Marzo de 2015, 04:49:10 por KILLERJC »