|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Pegasux
76
« en: Domingo 23 de Septiembre de 2007, 22:51 »
Yo los hacia con el paint, mucho mas rápido y mejor presentados que los programas que he utilizado (hace unos años, ahora no se...). Saludos.
77
« en: Domingo 23 de Septiembre de 2007, 19:35 »
Muy buenas. Estoy realizando un programilla para un 16F876 que hace lo siguiente: Programamos el timer0 para producir unas 15 interrupciones por segundo. Cuando salta la interrupción, mira el valor analogico de AN0, lo pasa a BCD y lo saca por el LCD. El asunto es que a la hora de compilar, me da un montón de errores, imagino que por el uso de las librerias, pero no lo tengo nada claro, en el primer error indica la direccion 0, osea, a inicio. ¿Alguien puede echarme un cable? Gracias y un saludo.
78
« en: Viernes 20 de Julio de 2007, 14:53 »
Muy buenas. Quiero usar un pic 12f509, pero me encuentro por ahí que es OTP, osea, solo programable una vez. Me llama la atención que en la web de microchip indican que la memoria es del tipo "Standard Flash", por lo que no entiendo a que se debe que solo sea programable una sola vez. Otra cosilla. He encontrado el 12c508 en smd, pero tiene poca ram y necesito usar por lo menos el 509, pero no lo encuentro en smd. ¿alguien sabe de algun sitio para comprarlo? Un saludo.
79
« en: Martes 27 de Marzo de 2007, 00:08 »
Hola. El WDT es usado para provocar un reset si el sistema entra en un mal funcinamiento, se le va poniendo a 0 cada poco tiempo en el desarrollo normal del programa para evitar que salte y te haga un reset. Lo que tu necesitas es programar un timer cada X tiempo y habilitar la interrupcion asociada a ese timer, asi cuando pase X tiempo y salte a la rutina de interrupcion, esta hara lo del LCD o lo que tu quieras. Un saludo.
80
« en: Sábado 24 de Marzo de 2007, 00:46 »
Hola. Tengo un libro sobre el 16F84 en el que viene un montaje completo con el DS1307, y creo que son unas 16 paginas de codigo ASM (si no he contado mal). Viendo el codigo del enlace aqui puesto creo que la diferencia es muy grande, es posible que el codigo al ser tan reducido no sea muy bueno. Un saludo.
81
« en: Martes 20 de Marzo de 2007, 15:52 »
Con el MPLAB (gratuito) puedes depurar el codigo y al ensamblarlo te genera el .hex Un saludo.
82
« en: Lunes 19 de Marzo de 2007, 17:44 »
Muy buenas. Te van a alegrar las paginas que he encontrado: http://homepages.mty.itesm.mx/al778081/http://www.tolaemon.com/otros/mmcard.htmHablan en detalle de manejar una tarjeta SD con un micro 8051, de como inicializar el modo spi, de los comandos, del manejo de datos... Esta muy bien, no me he hecho todavia una idea clara de como manejarla, pero ayuda bastante. Un saludo.
83
« en: Domingo 18 de Marzo de 2007, 21:46 »
Hola de nuevo. Pues el proyecto esta un poco verde. El principal problema que veo es lo del formato FAT16, solo va a haber un fichero de texto, asi que unicamente necesito saber la direccion en la que comienzan los datos y a partir de ahi incrementar o decrementar las posiciones de memoria. Me pregunto una cosilla ¿funcionan igual que las compactflash, stick duo y demas o estas no valen? También estoy considerando la posibilidad de tomar la tarjeta SD como una memoria sin formatear, y en vez de meterla un "texto.txt" en formato FAT16, utilizar el pic para introducir la información a la tarjeta en codigo ascii, aunque por ahora no tengo ni idea de como hacerlo, no se si se podrán meter en la tarjeta varios megas a la hora de programar el pic y la memoria. He encontrado un documento muy bueno sobre el modulo SPI: http://www2.ate.uniovi.es/fernando/Doc2003...P_SPI_BREVE.pdfOtra duda que tengo es sobre el acceso a memoria en posiciones de mas de 8 bits de direccionamiento, si la tarjeta por si sola incrementase la direccion no habria problema, pero hasta ahora no he averiguado como hacerlo. Un saludo.
85
« en: Miércoles 14 de Marzo de 2007, 13:46 »
No hacian falta las disculpas hombre (seguro que por mis ultimos posts parezco un poco pardillo). Muchas gracias por el enlace, he encontrado esto, aunque sea en C: http://www.microchipc.com/sourcecode/#mmcSaludos.
86
« en: Martes 13 de Marzo de 2007, 21:47 »
Hola Hugen. En realidad no soy nuevo con los micros, sino con los pics, los ví hace unos 10 años y estoy empezando con ellos de nuevo. De micros he manejado unos cuantos, actualmente estoy con el Mips R6000 (32 bits), pero me gustan mas los microcontroladores, y no conozco mas que un poco de los pics. I2C tambien he manejado y 80C51 (atmel ahora, creo) aunque no me acuerdo bien. Pensaba que el 16F84 tenia I2C, en el libro que tengo hablan de la libreria para este micro y lo conectan a una 24LC256 por I2C. Puedo usar sino el 16F876, que tiene modulo SPI e I2C. Ahora sabiendo que se puede hacer voy a ver si encuentro como hacerlo. Un saludo y gracias.
87
« en: Martes 13 de Marzo de 2007, 19:36 »
Muy buenas. Quiero realizar un proyecto en el que se mete en una memoria gran cantidad de informacion (unos pocos megas) concretamente de texto, para despues sacarlo por un lcd. La duda que no he conseguido aclarar hasta ahora es si hay un limite de memoria manejable para los pics de 8 bits. En el libro que tengo del 16f84 viene la 24lc256 (32kB) como la más grande, no se si es porque en el momento de editar el libro efectivamente era la de mayor tamaño, o si es la mayor con la que puede trabajar el pic al ser de 8 bits. He visto hasta 24LC2048 integradas en tarjetas de plastico (con micro atmel) y 24LC1024 en encapsulado SOP, que es el formato que mas me interesa. Estaba pensando tambien si se podria utilizar una tarjeta SD de 16Mb que tengo, si tengo que pasarme a otro tipo de microcontroladores o si he de usar uno de 16 bits o los DSP. Como soy novato en pics no acabo de aclararme con estas cosillas. ¿Alguien puede iluminarme un poco? Saludos.
88
« en: Sábado 3 de Marzo de 2007, 11:46 »
Ejejejje, que buena!! Muchas gracias!! Ahora ya he visto que te refieres a los registros de proposito general del banco 0. Yujuuuuuuu!!!!!! Ahroa si que funciona, tenia mal puestas unas cosillas pa que funcionase bien, pero ya está solucionado. Muchas gracias y saludos!!
89
« en: Sábado 3 de Marzo de 2007, 07:37 »
Hola de nuevo. Si, uso estimulos, no se otra forma de meter valores en los pines. Tenia la version 7.2 y he actualizado a la 7.5, pero sigue pasando lo mismo o peor, he seguido simulando a pesar de que funciona mal esa zona de codigo, y el codigo restante tambien funciona mal, hace lo que le da la gana cuando le da la gana. El paso de valores de W a registros y eso funciona bien, pero en cuanto se usan las variables se descontrola. ¿Empiezo a pensar en otro simulador? He colgado el codigo tal y como lo tengo ahora: http://www.alumnos.unican.es/uc12909/func1.asmSaludos.
90
« en: Viernes 2 de Marzo de 2007, 14:43 »
Aqui en España hay puntos de reciclaje donde puedes encontrar impresoras, no se lo que habrá por alli. En mercadillos puedes encontrarlas tambien muy baratas. Lo bueno de las impresoras es que vienen con los motores y los drivers, aunque sean smd. Si los encuentras en alguna tienda seguramente te va a costar más el motor PAP que una impresora nueva, no te lo recomiendo. Como bien han dicho antes, si el motor tiene 4 cables es bipolar, si tiene 6 es unipolar y si tiene 2 no es paso a paso. Es posible encontrar motores de 2 cables en impresora, aunque no sean PAP con sensores, cintas magneticas y demas historias logran averiguar la posicion, pero eso ya es mas complicado, mejor usar un PAP. Como ejemplo de driver tienes el hct244 o el LM239B, se conecta entre el micropic y el motor, solamente es un amplificador para las señales del pic, que no tienen suficiente fuerza, las 4 salidas del pic se conectan a las 4 entradas del driver, tiene 2 entradas extra de habilitacion que las puedes dejar a Vcc, cuanto mayor sea la Vcc con que alimentes al driver (dentro de sus limites), más rapido se podra mover el motor y menores seran los retardos que puedas usar. Las 4 salidas del driver van al motor, en el caso de los bipolares va directamente identificando cada cable, y en caso de los unipolares tienes que descubrir los 4 cables a los cuales van las salidas del driver, y los 2 cables sobrantes se hace una especie de conexion a la alimentacion, nada complicado. Tambien puedes sacar el motor de disqueteras viejas. Saludos.
91
« en: Viernes 2 de Marzo de 2007, 13:33 »
Hola! en tu programa veo que declaras SENF como byte, y usas una instruccion de manejo de bits. Deberia ser:
btfss SENF.x
donde x es el bit que quieres verificar
saludos Hola de nuevo. SENF al principio lo declaraba como byte, pero ahora esta como me ha dicho Jonathan: #DEFINE SENF PORTC,1 por eso utilizo btfss. Me pasa otra cosa, con las siguientes instrucciones: movlw b'01100000' movwf PASOF el valor de PASOF deberia ser 60 (96 en decimal), pero se me pone a 20!! (32'd) El contenido del W es 60, y si cambio PASOF por PASOA funciona bien. ¿Alguien sabe el porque? Saludos. P.D: No habia virus!!
92
« en: Viernes 2 de Marzo de 2007, 09:34 »
Algo esta fallando, en el siguiente codigo, tanto si senf esta a 0 como si esta a 1, se salta la linea del goto.
btfss SENF ; SENF = 1 -> esta abajo, evita goto goto FRENADO ; el pedal de freno esta
Las lineas del puerto C cambian correctamente con los estimulos. ¿Hay que hacer algo para que la variable SENF se actualice al valor de su correspondiente bit del puerto C cuando cambio un estimulo?
Estoy pasando el antivirus por si acaso, a ver si encuentra algo.
Saludos.
93
« en: Viernes 2 de Marzo de 2007, 08:33 »
Gracias Huguen, queda claro, voy a dejar el cambio de bancos como lo tenia:
CBLOCK 0x0C ; La zona de memoria APOS ; dirección de memoria FPOS ; Posición 0x0D de RAM. ERRORR ; 0x0E PASOA ; 0x0F posicion de paso de los motores PASOF ; 0x10 DIRECCION ; 0x11 ENDC
#DEFINE ABAJO DIRECCION,0 ; abajo es el bit 0 del byte "direccion" #DEFINE SENA PORTC,0 ; sena es el bit 0 del puerto C #DEFINE SENB PORTC,1
y mas abajo...
bcf STATUS,RP0 ; portc esta en el banco 0 ; movlw b'00000010' ; mira SENF (frenado) que ; andwf PORTC,0 ; nos quedamos el bit 1 en W ; movwf SENF ; guardamos en senF 1 o 0 ; clrw ; W = 0 ; subwf SENF,0 ; W = SENF - 0 btfsc SENF ; SENF = 1 -> esta abajo goto FRENADO ; el pedal de freno esta pisado, va a frenar
Tienes razon con lo de ahorrar memoria, como hice un cortar y pegar ni me di cuenta, ya lo he cambiado. Saludos.
94
« en: Viernes 2 de Marzo de 2007, 07:57 »
Muchas gracias por la aclaracion. En realidad son sena, senb y abajo las boleanas, las demas han de ser por lo menos de 4 bits. Voy a modificar el codigo tal y como me has explicado para que quede mas correcto. Otra cosilla. He visto por ahi que puedo declarar de la misma forma un bit del puerto C por ejemplo que es de entrada (sena y senb) y comprobar directamente si esta a 0 o a 1 sin tener que hacer la operacion and con W para seleccionar ese bit del puerto C. También voy a intentar implementarlo, y me pregunto si he de poner RP0 a 0 para seleccionar el banco antes de leer SENA y SENF (ahora declarados como bits) o si se encarga el compilador solo de gestionarlo. Saludos.
95
« en: Jueves 1 de Marzo de 2007, 11:29 »
Bueno, dado que la secuencia la hago para que salte si ABAJO es 1 o 0, ¿se puede hacer directamente con btfss y btfsc? No se como hacerlo. Saludos.
96
« en: Jueves 1 de Marzo de 2007, 11:06 »
Hola compañeros. La verdad es que sigo igual de confuso que antes. Yo estaba buscando una variable de tipo boolean (true/false), pero no las hay, asi que pense en coger una de un byte y usar solamente un bit. Lo que no entiendo es porque me ha de modificar el byte si el simulador no sabe que yo solo quiero usar un bit, es decir, si yo quisiera usar todo el byte, me lo seguiria modificando. Da la casualidad de que me modifica esta pero todas las demas variables tambien las defino como byte ¿podria modificarme otra? ¿Se ha guardado en una posicion de memoria que es utilizada por el simulador o por el micro?
Por otro lado, de esta nueva forma que me dices, la secuencia: FMOVER:
movlw b'00000000' ; W = 0 subwf ABAJO,0 ; W = ABAJO - W btfsc STATUS,Z ; si Z=0, ABAJO = 1 -> bajar goto J20 ; Z=1, ABAJO = 0 -> subir
me da un error de compilacion, creo que al ser de distinto tipo la operacion no se realiza correctamente.
Muchas gracias y un saludo.
97
« en: Miércoles 28 de Febrero de 2007, 23:25 »
El codigo todavia no esta grabado, lo estoy simulando para depurarlo porque hay algunas cosillas que modificar, el problema es que no puedo simularlo bien si me hace estas cosas raras. Ahi va el codigo que hay por ahora, me recortado muchos comentarios para que no haya lineas sueltas.
LIST P=16F876 INCLUDE <P16F876.INC> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C ; La zona de memoria de usuario APOS ; dirección de memoria FPOS ; Posición 0x0D de RAM. ABAJO ; Posición 0x0E de RAM. SENA SENF ERRORR ; fallo posicion de motor PAP acelerador PASOA ; 0x13 posicion de paso de los motores PASOF ; 0x14 ENDC
MAXA equ b'00001111' MAXF equ b'00001111'
org 0x00 ;Vector de reset goto Inicio ; org 0x05 ;Salvar el vector de interrupción ; goto ServicioInterrupcion ; Por desbordamiento del WDT ;--------------------------------------------------------------------------------------------
Inicio clrf PORTA ; limpia salidas clrf PORTB clrf PORTC clrf PASOA clrf PASOF clrf SENA clrf SENF clrf ERRORR clrf ABAJO clrf APOS clrf FPOS
bsf STATUS,RP0 movlw b'00001101' movwf OPTION_REG movlw b'10001000' movwf INTCON
bcf STATUS,RP0 movlw b'00000110' movwf PASOA movlw b'01100000' movwf PASOF
clrw ; Puerto B bsf STATUS, RP0 ; banco 1 para movwf TRISB movlw b'11111111' ; movwf TRISC
J10: ; comprueba freno pisado bcf STATUS,RP0 ; portc esta en el banco 0 movlw b'00000010' ; mira SENF (frenado) que andwf PORTC,0 ; nos quedamos el bit 1 en W movwf SENF ; guardamos en senB 1 o 0 movlw b'00000000' ; W = 0 subwf SENF,0 ; W = SENF - W btfss STATUS,Z ; si Z=0, SENF = 1 -> esta abajo goto J9 ; comprueba acelerador
; el freno esta pisado, hay que soltarlo para ponerlo a 0
movlw b'00000001' ; pone ABAJO a '1' movwf ABAJO call FMOVER goto J10 ; vuelve a comprobar el
J9: ; comprueba acelerador pisado
bcf STATUS,RP0 ; portc esta en el banco 0 movlw b'00000001' ; mira SENA (acelerado) andwf PORTC,0 ; nos quedamos el bit 0 en W movwf SENA ; guardamos en senA 1 o 0 clrw ; W = 0 subwf SENA,0 btfss STATUS,Z ; si Z=0, SENA = 1 -> esta abajo goto principal ; sigue con la inicializacion
; el acelerador esta pisado, hay que soltarlo
movlw b'00000001' ; pone ABAJO a '1' movwf ABAJO call AMOVER goto J9 ; vuelve a comprobar el
;-------------------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------------------- ; ; PROGRAMA PRINCIPAL: ;
principal: ; mira si hay error y reinicia el sistema
clrf W ; W = 0 subwf ERRORR,0 ; W = ERRORR - W btfsc STATUS,Z ; si Z=0, ERROR > 0 -> hay error goto Inicio ; comprueba acelerador pisado
; si no hay error continua
movlw b'00000101' ; movwf ADCON1
bcf STATUS,RP0 ; portc esta en el banco 0 movlw b'00000010' ; mira SENF (frenado) que andwf PORTC,0 ; nos quedamos el bit 1 en W movwf SENF ; guardamos en senF 1 o 0 movlw b'00000000' ; W = 0 subwf SENF,0 btfsc STATUS,Z ; si Z=0, SENF = 1 -> esta abajo goto FRENADO ; el pedal de freno esta
; no esta frenando -> lee valor acelerador -> acelerado
bcf STATUS,RP0 ; portc esta en el banco 0 movlw b'00000001' ; mira SENA (acelerado) andwf PORTC,0 ; nos quedamos el bit 0 en W movwf SENA ; guardamos en senA 1 o 0 movlw b'00000000' ; W = 0 subwf SENA,0 ; si senA=0 -> Z=1 ->salta linea btfss STATUS,Z ; si Z=0, SENA = 1 ->siguiente linea goto principal ; como no hay nada pisado va a ; acelerador pisado
bcf STATUS,RP0 ; movlw b'10000001' ; movwf ADCON0 bsf ADCON0,GO ; ; tiempo de conversion de los 10 bits 64us? btfsc ADCON0,GO ; mira si ha goto $ - 1
; cuando termina la conversion sigue en acelerado ;-------------------------------------------------------------------------------------------- ; ; ACELERADO: decide la posicion del acelerador. ; ; llega aqui si el freno no esta pisado y el acelerador si
; empieza a acelerar
J5: bcf STATUS,RP0 ; adresh esta en el banco 0 movf ADRESH,0 ; mete en W el valor de la conversion. subwf APOS,0 ; W = APOS - W btfss STATUS,C ; miro el carry, si esta a 1 mira bit Z goto J7 ; carry a 0 -> acelerar mas btfss STATUS,Z ; si esta a 1 son iguales goto principal ; son iguales, no hacer nada y volver goto J8 ; si esta a 0 el bit Z
J7: ; acelerar mas movlw b'00000000' ; pone ABAJO a '0' para movwf ABAJO call AMOVER incf APOS, 1 ; incrementar APOS goto principal ; vuelve a mirar todo
J8: ; acelerar menos movlw b'00000001' ; pone ABAJO a '1' para movwf ABAJO call AMOVER decf APOS, 1 ; decrementar APOS goto principal ; vuelve a mirar todo
; ; FRENADO: mueve el motor del freno arriba o abajo. ;
FRENADO: ; llega aqui porque el freno esta pisado
bcf STATUS,RP0 ; movlw b'10000011' ; movwf ADCON0 bsf ADCON0,GO ; ; tiempo de conversion de los 10 bits 64us? btfsc ADCON0,GO ; mira si ha goto $ - 1
; comprueba acelerador pisado J2: bcf STATUS,RP0 ; portc esta en el banco 0 movlw b'00000001' ; mira SENA (acelerado) andwf PORTC,0 ; nos quedamos el bit 0 en W movwf SENA ; guardamos en senA 1 o 0 movlw b'00000000' ; W = 0 subwf SENA,0 ; si SENA=0 -> acelerador pisado -> btfss STATUS,Z ; si Z=0, SENA = 1 -> acelerador no goto J1 ; empieza a frenar
; el acelerador esta pisado, hay que soltarlo
movlw b'00000001' ; pone ABAJO a '1' movwf ABAJO call AMOVER goto J2 ; vuelve a comprobar el
J1: ; empieza a frenar bcf STATUS,RP0 ; adresh esta en el banco 0 movf ADRESH,0 ; mete en W el valor de la conversion. subwf FPOS,0 ; W = FPOS - W btfss STATUS,C ; miro el carry, si esta a 1 mira bit Z goto J3 ; carry a 0 -> frenar mas btfss STATUS,Z ; si esta a 1 son iguales goto principal ; son iguales, no hacer nada y volver goto J4 ; si esta a 0 el bit Z frenar J3: ; frenar mas movlw b'00000000' ; pone ABAJO a '0' para movwf ABAJO call FMOVER incf FPOS, 1 ; incrementa fpos goto principal ; vuelve a mirar todo
J4: ; frenar menos movlw b'00000001' ; pone ABAJO a '1' para movwf ABAJO call FMOVER decf FPOS, 1 ; decrementa fpos goto principal ; vuelve a mirar todo
AMOVER:
movlw b'00000000' ; W = 0 subwf ABAJO,0 ; W = ABAJO - W btfsc STATUS,Z ; si Z=0, ABAJO = 1 -> bajar goto J12 ; Z=1, ABAJO = 0
; Bajar amotor
; si la posicion es 0110, damos un paso atras a 0101
movlw b'00000110' subwf PASOA,0 ; W = PASOA - 0110 btfsc STATUS,Z ; si Z=0, estamos en 0110 -> paso a goto J111 ; no es 0110, mira el movlw b'00000101' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOA ; nueva posicion del motor movwf PORTB return ; si la posicion es 0101, damos un paso atras a 1001 J111: movlw b'00000101' subwf PASOA,0 ; W = PASOA - 0101 btfsc STATUS,Z ; si Z=0, estamos en 0101 -> paso a goto J112 ; no es 0101, mira el
movlw b'00001001' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOA ; nueva posicion del motor movwf PORTB return
; si la posicion es 1001, damos un paso atras a 1010 J112: movlw b'00001001' subwf PASOA,0 ; W = PASOA - 1001 btfsc STATUS,Z ; si Z=0, estamos en 1001 -> paso a goto J113 ; no es 1001, mira el
movlw b'00001010' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOA ; nueva posicion del motor movwf PORTB return
; si la posicion es 1010, damos un paso atras a 0110 J113: movlw b'00001010' subwf PASOA,0 ; W = PASOA - 1010 btfsc STATUS,Z ; si Z=0, estamos en 1010 -> paso a goto J114 ; no es ninguno -> ERROR movlw b'00000110' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOA ; nueva posicion del motor movwf PORTB return
J114: ; ponemos una variable de error a 1 movlw b'00000001' movwf ERRORR return
J12: ; subir amotor ; si la posicion es 0110, damos un paso alante a 1010 movlw b'00000110' subwf PASOA,0 ; W = PASOA - 0110 btfsc STATUS,Z ; si Z=0, estamos en 0110 -> paso a goto J121 ; no es 0110, mira el
movlw b'00001010' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOA ; nueva posicion del motor movwf PORTB return
; si la posicion es 0101, damos un paso alante a 0110 J121: movlw b'00000101' subwf PASOA,0 ; W = PASOA - 0101 btfsc STATUS,Z ; si Z=0, estamos en 0101 -> paso a goto J122 ; no es 0101, mira el
movlw b'00000110' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOA ; nueva posicion del motor movwf PORTB return
; si la posicion es 1001, damos un paso alante a 0101 J122: movlw b'00001001' subwf PASOA,0 ; W = PASOA - 1001 btfsc STATUS,Z ; si Z=0, estamos en 1001 -> paso a goto J123 ; no es 1001, mira el
movlw b'00000101' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOA ; nueva posicion del motor movwf PORTB return ; si la posicion es 1010, damos un paso alante a 1001 J123: movlw b'00001010' subwf PASOA,0 ; W = PASOA - 1010 btfsc STATUS,Z ; si Z=0, estamos en 1010 -> paso a goto J124 ; no es ninguno -> ERROR movlw b'00001001' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOA ; nueva posicion del motor movwf PORTB return
J124: movlw b'00000010' movwf ERRORR return ;-------------------------------------------------------------------------------------------- ; ; FMOVER: mueve el motor del freno arriba o abajo.
FMOVER:
movlw b'00000000' ; W = 0 subwf ABAJO,0 ; W = ABAJO - W btfsc STATUS,Z ; si Z=0, ABAJO = 1 -> bajar goto J20 ; Z=1, ABAJO = 0 -> subir
; Bajar fmotor
; si la posicion es 0110, damos un paso atras a 0101
movlw b'01100000' subwf PASOF,0 ; W = PASOF - 0110 btfss STATUS,Z ; si Z=0, estamos en 0110 -> paso a goto J210 ; no es 0110, mira el
movlw b'01010000' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOF ; nueva posicion del motor ; bsf STATUS,RP0 ; banco 1 para portb? movwf PORTB return ; si la posicion es 0101, damos un paso atras a 1001 J210: movlw b'01010000' subwf PASOF,0 ; W = PASOA - 0101 btfss STATUS,Z ; si Z=0, estamos en 0101 -> paso a goto J220 ; no es 0101, mira el
movlw b'10010000' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOF ; nueva posicion del motor movwf PORTB return
; si la posicion es 1001, damos un paso atras a 1010 J220: movlw b'10010000' subwf PASOF,0 ; W = PASOA - 1001 btfss STATUS,Z ; si Z=0, estamos en 1001 -> paso a goto J230 ; no es 1001, mira el
movlw b'10100000' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOF ; nueva posicion del motor movwf PORTB return
; si la posicion es 1010, damos un paso atras a 0110 J230: movlw b'10100000' subwf PASOF,0 ; W = PASOA - 1010 btfss STATUS,Z ; si Z=0, estamos en 1010 -> paso a goto J240 ; no es ninguno -> ERROR movlw b'01100000' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOF ; nueva posicion del motor movwf PORTB return
J240: ; ponemos una variable de error a 1 movlw b'00000100' movwf ERRORR return
J20: ; subir fmotor ; si la posicion es 0110, damos un paso alante a 1010 movlw b'01100000' subwf PASOF,0 ; W = PASOA - 0110 btfsc STATUS,Z ; si Z=0, estamos en 0110 -> paso a goto J250 ; no es 0110, mira el
movlw b'10100000' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOF ; nueva posicion del motor movwf PORTB return
; si la posicion es 0101, damos un paso alante a 0110 J250: movlw b'01010000' subwf PASOF,0 ; W = PASOA - 0101 btfsc STATUS,Z ; si Z=0, estamos en 0101 -> paso a goto J260 ; no es 0101, mira el
movlw b'01100000' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOF ; nueva posicion del motor movwf PORTB return
; si la posicion es 1001, damos un paso alante a 0101 J260: movlw b'10010000' subwf PASOF,0 ; W = PASOA - 1001 btfsc STATUS,Z ; si Z=0, estamos en 1001 -> paso a goto J270 ; no es 1001, mira el
movlw b'01010000' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOF ; nueva posicion del motor movwf PORTB return ; si la posicion es 1010, damos un paso alante a 1001 J270: movlw b'10100000' subwf PASOF,0 ; W = PASOA - 1010 btfsc STATUS,Z ; si Z=0, estamos en 1010 -> paso a goto J280 ; no es ninguno -> ERROR movlw b'10010000' bcf STATUS,RP0 ; PORTB esta en el banco 0 movwf PASOF ; nueva posicion del motor movwf PORTB return
J280: movlw b'00001000' movwf ERRORR return
END
98
« en: Miércoles 28 de Febrero de 2007, 15:14 »
Muy buenas de nuevo. He declarado una variable "ABAJO" cuyo valor puede ser '0' o '1', para indicarle a la rutina de giro de un motor que gire en un sentido o en el otro. La curiosidad, es que a partir de una posicion del programa, en cada paso que doy en el simulador, esta variable se me incrementa inexplicablemete, lo que hace que el programa funcione mal. Las demas estan bien, es solamente esta la que se incrementa. ¿Es cosa del MPASM?¿virus?¿cachondeo? Saludos.
99
« en: Miércoles 28 de Febrero de 2007, 13:53 »
Gracias, hare pruebas a ver lo que aguanta. Saludos.
100
« en: Domingo 25 de Febrero de 2007, 22:36 »
Muy buenas. Al compilar mi codigo me da el error de que el registro al que intento acceder (option_reg) no esta en el banco 0, cuando yo acabo de configurar RP0 a 1 y RP1 a 0 (banco 1). Estoy mirando programas de ejemplo y veo que accede a PORTB que esta en el banco 0 cuando el banco actual es el 1:
bsf STATUS,RP0 ; Acceso al Banco 1. clrf PORTB ; Puerto B como salida. bcf STATUS,RP0 ; Acceso al Banco 0.
y al compilar este ejemplo no da ningun error. La unica diferencia es que mi programa es para el 16f876 y el ejemplo es para el 16f84. No entiendo nada. ¿Alguien me lo puede explicar? Saludos.
|
|
|