TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Goodfrey en 28 de Mayo de 2010, 00:06:52
-
Buenas noches señores, gracias por tomarse su tiempo para ver este post... bueno esta es la cosa necesito que me ayuden a hacer un contador digital bueno no se si esta bien dicho pero realmente lo que necesito es esto... por el puertb en 8 bit tiene que salir la combinacion de 0 y 1 que vallan desde 00000000 hasta 11111111 pero sin hacer una tabla... es decir lo que necesito es que por codigo me valla incrementando la secuencia binaria hasta que llegue a 255...
es algo asi como el conteo que utiliza el 4040 que todos sabemos usar.... por que la manera como la estaba pensando era hacer como una tabla....asi
00000000
00000001
00000010
00000011
00000100
.
.
.
11111111
esta es la secuencia que tiene que salir por el puerto b pero en vez de crear esa tabla la quiero hacer programando... para ver si me pueden ayudar a crear ese codigo gracias por su respuesta...
-
Simplemente cuentas y cuando quieres sacar por el puerto lo envias tal cual al dato al puerto, eso lo saca en binario... :mrgreen:
-
exacto como dice marcos, ahora si no quieres tablas y solo sacar el numero eso lo puede arreglar con un INCF, F
-
ok es lo que estaba pensando de hacer un incf,f pero eso no solo incrementaria en 1 un solo bit... es decir mas o menos asi...
00000000
10000000
01000000
00100000
00010000
.
.
.
00000001
tipo escalera y lo necesito que se hagan los cambios como un codigo binario asi como lo habia explicado antes...
-
.
Mm.. en realidad la instrucción que hace lo que pusiste es RRF (rotate right register F).
INCF suma 1 al registro en cuestión y logra la secuencia binaria que estás buscando. Cabe aclarar que una vez que llega a 0xFF (al tope), vuelve a 0x00.
Saludos.
-
Saludos
Hay varias opciones para visualizar el valor del contaje, una es incrementar la variable y hacer una conversión a BCD me parece una forma elegante, la otra es utilizar comparadores utilizando la instrucción xorlw y el bit c del registro status, y la otra es realizar la tabla pero creo que es una forma poco elegante. Pero al final de cuentas sin funciona no importa cual camino se utilizó. Espero twe sirvan la opciones.
-
Bueno amigo lo que pasa es que necesito generar una onda senoidal con pic 16f84 y ese tipo de onda como tal no me va a salir si no mas bien como una escalera...
ahorita con este codigo que les estoy mostrando me sale una diente de cierra pero al reves... empieza desde el ultimo digito 00111111 y termina en el primero 00000000
pero no se por que, e revisado las variables y a salido bien... por lo menos en el codigo pero a la hora de mostrarlo por el puerto b me sale alreves de lo que aparece en el pcl, revisenlo y digamen que hice mal... xfa
aaa y si alguien sabe como generar la honda senoidal que me eche una mano xfa ...
LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>
CUENTA EQU 20H
FACTOR EQU 21H
ORG 0
BSF STATUS,5 ; activa la pagina 1
MOVLW B'01111' ; carga 01111 en W
MOVWF TRISA ; puerto A, RA0 a RA3 entradas
MOVLW B'00000000' ; carga 11111111 en W
MOVWF TRISB ; puerto B todas salidas
BCF STATUS,5 ; volvemos a la pagina 0
CLRF PORTA ; ponemos a cero el puerto A
CLRF PORTB ; ponemos a cero el puerto B
CLRF CUENTA
MOVLW B'00111111'
MOVWF FACTOR
GOTO INICIO ; va a inicio
TABLA
ADDWF PCL,1
RETLW B'00000000'
RETLW B'00000001'
RETLW B'00000010'
RETLW B'00000011'
RETLW B'00000100'
RETLW B'00000101'
RETLW B'00000110'
RETLW B'00000111'
RETLW B'00001000'
RETLW B'00001001'
RETLW B'00001010'
RETLW B'00001011'
RETLW B'00001100'
RETLW B'00001101'
RETLW B'00001110'
RETLW B'00001111'
RETLW B'00010000'
RETLW B'00010001'
RETLW B'00010010'
RETLW B'00010011'
RETLW B'00010100'
RETLW B'00010101'
RETLW B'00010110'
RETLW B'00010111'
RETLW B'00011000'
RETLW B'00011001'
RETLW B'00011010'
RETLW B'00011011'
RETLW B'00011100'
RETLW B'00011101'
RETLW B'00011110'
RETLW B'00011111'
RETLW B'00100000'
RETLW B'00100001'
RETLW B'00100010'
RETLW B'00100011'
RETLW B'00100100'
RETLW B'00100101'
RETLW B'00100110'
RETLW B'00100111'
RETLW B'00101000'
RETLW B'00101001'
RETLW B'00101010'
RETLW B'00101011'
RETLW B'00101100'
RETLW B'00101101'
RETLW B'00101110'
RETLW B'00101111'
RETLW B'00110000'
RETLW B'00110001'
RETLW B'00110010'
RETLW B'00110011'
RETLW B'00110100'
RETLW B'00110101'
RETLW B'00110110'
RETLW B'00110111'
RETLW B'00111000'
RETLW B'00111001'
RETLW B'00111010'
RETLW B'00111011'
RETLW B'00111100'
RETLW B'00111101'
RETLW B'00111110'
RETLW B'00111111'
INICIO
MOVF CUENTA,W
CALL TABLA ; llamamos a TABLA
XORWF FACTOR,0
BTFSC STATUS,Z
GOTO FIN
MOVWF PORTB ; cargamos W en el puerto B
INCF CUENTA,F
GOTO INICIO ; va a INICIO
FIN
END ; fin de programa
-
Saludos
Como obtuvistes la valores de la señal porque yo lo he hecho en matlab y funciona muy bien.
-
amigos necesito que me ayuden a resolver un problema que tengo que no me deja avanzar en la practica.... estoy haciendo una onda triangular on un pic 628 y tengo que utilizar un dac de 5 bit para generar la onda la cual no es problema, la cosa es la siguiente
cuando hago el conteo ascendente de 0 a 31 en el watch windows me muestra que lo hace correctamente pero a la hora de poner el dato en el puerto lo hace de forma inversa es decir... si en el watch windows muestra que tengo 00000010 en el puerto b me sale 00011101 es decir inverso al dato que quiero poner pero es solo cuando es ascendente
cuando el conteo es desde 31 hasta 0 si lo hace correctamente pero no se que puede ser estoy cansado de revisar ese codigo y varios compañeros de clases lo hemos revisado y nada simplemente no sabemos cual es el error
en el codigo que les dare acontinuacion la variable cuenta la utilizo para hacer un contador para el pcl que me permite de forma ascendente incrementar desde 0 hasta 31 para obtener el valor de la tabla y de forma descendente desde 31 hasta 0 en eso no hay problema, es a la hora de mostrar el dato de forma ascenente que me da ese error
acontinuacion adjunto el codigo para ver si uds analizandolo me ayudan a dar con el problema y tambien adjuntare unas imagenes para ilustrar mejor lo que quiero dar a entender....
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ENCABEZADO \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
LIST P=16F628 ; Microcontrolador utilizado.-
#INCLUDE P16F628.INC ; Definicion de registros SFR.-
__CONFIG 0x3F18
;0x3F61
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ DEF. DE VARIABLES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
CBLOCK 0x20 ; En esta posicion se declaran los registros de usuario (GPR)
CUENTA
FACTOR
PDel0
PDel1
FACTOR2
AUX
AUX2
ENDC
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ RESET \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
RESET
ORG 00H
GOTO INICIO ; Salto a inicio del programa.-
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ CONFIG. DE PUERTOS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ORG 05H
INICIO
MOVLW 0x07
MOVWF CMCON ; DESHABILITA LOS COMPARADORES ANALOGICOS
BSF STATUS,5
MOVLW B'00011111'
MOVWF TRISA
MOVLW B'11000000'
MOVWF TRISB
BCF STATUS,5
CLRF PORTA ; ponemos a cero el puerto A
CLRF PORTB ; ponemos a cero el puerto B
CLRF CUENTA
CLRF AUX
CLRF AUX2
MOVLW B'00011111'
MOVWF FACTOR
MOVLW B'00000000'
MOVWF FACTOR2
GOTO COMPA
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ COMPARACION DE SEÑALES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
COMPA
BTFSC PORTA,0 ;PREGUNTA POR EL BIT DE ENTRADA
GOTO TRIANG1 ;VA A LA ONDA TRIANGULAR
GOTO COMPA ;VUELVE A PREGUNTAR POR EL BOTON
TRIANG1
MOVF CUENTA,W ;MUEVO A W EL VALOR DE CUENTA (0 INICIALMENTE)
CALL TABLA ;Llamamos a TABLA
MOVWF AUX ;MUEVO EL VALOR DE W A AUX
XORWF FACTOR,0 ;COMPARO CON FACTOR EL VALOR DE W
BTFSC STATUS,Z ;PREGUNTO POR LA BANDERA Z
GOTO TRIANG2 ;SI SE LEVANTO VOY A TRIANG2
MOVF AUX ;MUEVO LO QUE TIENE AUX A W
MOVWF PORTB ; cargamos W en el puerto B
INCF CUENTA,F ;SUMO 1 A CUENTA PARA INCREMENTAR EL VALOR DE LA TABLA
CALL DEMORA ;LLAMO AL RETARDO
GOTO TRIANG1 ;va a TRIANG1
TRIANG2
;AHORA CUENTA TIENE EL VALOR 1F QUE ES EL MAXIMO QUE SE CARGO EN EL PASO ANTERIOR
MOVF CUENTA,W ;IGUAL QUE LO ANTERIOR SOLO QUE AHORA DECIENDE EL VALOR DE CUENTA
CALL TABLA ; llamamos a TABLA
MOVWF AUX2
XORWF FACTOR2,0
BTFSC STATUS,Z
GOTO FIN
MOVF AUX2
MOVWF PORTB ; cargamos W en el puerto B
DECF CUENTA,F ; DECREMENTO EL VALOR DE CUENTA Y POR ESO LA GRAFICA DEFIENDE
CALL DEMORA
GOTO TRIANG2
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ TABLA \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
TABLA
ADDWF PCL,1
RETLW .0
RETLW .1
RETLW .2
RETLW .3
RETLW .4
RETLW .5
RETLW .6
RETLW .7
RETLW .8
RETLW .9
RETLW .10
RETLW .11
RETLW .12
RETLW .13
RETLW .14
RETLW .15
RETLW .16
RETLW .17
RETLW .18
RETLW .19
RETLW .20
RETLW .21
RETLW .22
RETLW .23
RETLW .24
RETLW .25
RETLW .26
RETLW .27
RETLW .28
RETLW .29
RETLW .30
RETLW .31
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ RUTINA DE RETARDO \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
DEMORA
MOVLW .6
MOVWF PDel0
PLoop1
MOVLW .207
MOVWF PDel1
PLoop2
CLRWDT
DECFSZ PDel1,1
GOTO PLoop2
DECFSZ PDel0,1
GOTO PLoop1
PDe1L1
GOTO PDe1L2
PDe1L2
CLRWDT
RETURN
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ FIN DE PROGRAMA \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FIN
END
Espero puedan dar con el problema de mi codigo gracias por su tiempo....
-
Si aqui le pones que se quede en W en el movf creo que ya te va. Asi "MOVF AUX,0" sino te pone lo que hay anteriormente en W que es factor menos AUX que es lo contrario, en el segundo triangulo tampoco pones ese 0 pero te funciona por suerte :lol:
MOVF AUX ;MUEVO LO QUE TIENE AUX A W
MOVWF PORTB ; cargamos W en el puerto B
A ver si acerte. Saludos
-
Si aqui le pones que se quede en W en el movf creo que ya te va. Asi "MOVF AUX,0" sino te pone lo que hay anteriormente en W que es factor menos AUX que es lo contrario, en el segundo triangulo tampoco pones ese 0 pero te funciona por suerte :lol:
MOVF AUX ;MUEVO LO QUE TIENE AUX A W
MOVWF PORTB ; cargamos W en el puerto B
A ver si acerte. Saludos
gracias mi pana sinceramente soluciono el problema que tenia te lo agradesco ahora voy a arreglar el problema del dac con resistencias que no me esta mostrando el dato como es... cualquier cosa posteo por aqui... saludos xD
-
Amigos ahora me surge otra cosa, con la solucion que me dio el amigo tapi8 me dio la onda trinangular sin problema alguno, pero ahorita me surge otro inconveniente con la onda senoidal... estoy tratando de hacerla pero cuando llega la hora de hacer la compraracion de los datos casi igual al codigo anterior que les mostre, me surge un problema por que el pcl de la tabla se me pierde.... y no se como solucionarlo...
CBLOCK 0x20 ; En esta posicion se declaran los registros de usuario (GPR)
CUENTA
CUENTA2
FACTOR
PDel0
PDel1
FACTOR2
FACTOR3
AUX
AUX2
AUX3
AUX4
ENDC
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ RESET \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
RESET
ORG 00H
GOTO INICIO ; Salto a inicio del programa.-
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ CONFIG. DE PUERTOS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ORG 05H
INICIO
MOVLW 0x07
MOVWF CMCON ; DESHABILITA LOS COMPARADORES ANALOGICOS
BSF STATUS,5
MOVLW B'00011111'
MOVWF TRISA
MOVLW B'11000000'
MOVWF TRISB
BCF STATUS,5
CLRF PORTA ; ponemos a cero el puerto A
CLRF PORTB ; ponemos a cero el puerto B
CLRF CUENTA
MOVLW B'00011111'
MOVWF FACTOR
MOVLW B'00000000'
MOVWF FACTOR2
MOVLW B'00001001'
MOVWF FACTOR3
GOTO COMPA
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ COMPARACION DE SEÑALES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
COMPA
BTFSC PORTA,0 ;PREGUNTA POR EL BIT DE ENTRADA
GOTO TRIANG1 ;VA A LA ONDA TRIANGULAR
BTFSC PORTA,1
GOTO SENOI1
GOTO COMPA ;VUELVE A PREGUNTAR POR EL BOTON
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ SENOIDAL \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
SENOI1
MOVF CUENTA2,W ;MUEVO A W EL VALOR DE CUENTA (0 INICIALMENTE)
CALL TABLA1 ;Llamamos a TABLA
MOVWF AUX3 ;MUEVO EL VALOR DE W A AUX
XORWF FACTOR3,0 ;COMPARO CON FACTOR EL VALOR DE W
BTFSC STATUS,Z ;PREGUNTO POR LA BANDERA Z
GOTO SENOI2 ;SI SE LEVANTO VOY A TRIANG2
MOVF AUX3,0 ;MUEVO LO QUE TIENE AUX A W
MOVWF PORTB ; cargamos W en el puerto B
INCF CUENTA2,F ;SUMO 1 A CUENTA PARA INCREMENTAR EL VALOR DE LA TABLA
CALL DEMORA ;LLAMO AL RETARDO
GOTO SENOI1 ;va a TRIANG1
SENOI2
;AHORA CUENTA TIENE EL VALOR 1F QUE ES EL MAXIMO QUE SE CARGO EN EL PASO ANTERIOR
MOVF CUENTA2,W ;IGUAL QUE LO ANTERIOR SOLO QUE AHORA DECIENDE EL VALOR DE CUENTA
CALL TABLA1 ; llamamos a TABLA
MOVWF AUX4
XORWF FACTOR2,0
BTFSC STATUS,Z
GOTO FIN
MOVF AUX4,0
MOVWF PORTB ; cargamos W en el puerto B
DECF CUENTA2,F ; DECREMENTO EL VALOR DE CUENTA Y POR ESO LA GRAFICA DEFIENDE
CALL DEMORA
GOTO SENOI2
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ TABLA SENOIDAL \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
TABLA1
ADDWF PCL,1
RETLW .16
RETLW .18
RETLW .21
RETLW .23
RETLW .25
RETLW .27
RETLW .28
RETLW .30
RETLW .31
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ RUTINA DE RETARDO \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
DEMORA
MOVLW .6
MOVWF PDel0
PLoop1
MOVLW .207
MOVWF PDel1
PLoop2
CLRWDT
DECFSZ PDel1,1
GOTO PLoop2
DECFSZ PDel0,1
GOTO PLoop1
PDe1L1
GOTO PDe1L2
PDe1L2
CLRWDT
RETURN
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ FIN DE PROGRAMA \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FIN
END
Basicamente es igual al codigo anterior que les di, solo que ahorita la tabla la puse para que mas o menos haga como una curva parecida a la de la onda senoidal, pero a la hora de graficarla simplemente el pcl se va... y no me grafica nada si no que empieza a darme los errores de se espera call o excesive no se que....
me gustaria que me orientaran sobre esto ya que es mi primera vez que manejo tantas tablas... (tengo que manejar como 5) y no quiero tener mas inconvenientes de este tipo para no molestarlo mas....
PD: anteriormente esta la tabla de la onda triangular solo que aqui en este codigo no se las puse....
gracias de antemano por su respuesta y espero entiendan la duda que tengo...
-
Las tablas casi siempre se desbordan por dos motivos:
El valor que llevan en W es mayor que el mayor de la tabla.
La tabla esta por encima de la posicion FF (255) del PCL.
Las tablas se deben poner siempre al principio del programa, creo que tu caso es este segundo, mira donde esta ubicada, porque supongo que este programa es continuacion del otro, y es posible que este por encima de esa posicion.
Suerte.
-
Las tablas casi siempre se desbordan por dos motivos:
El valor que llevan en W es mayor que el mayor de la tabla.
La tabla esta por encima de la posicion FF (255) del PCL.
Las tablas se deben poner siempre al principio del programa, creo que tu caso es este segundo, mira donde esta ubicada, porque supongo que este programa es continuacion del otro, y es posible que este por encima de esa posicion.
Suerte.
Pana corri las tablas para el inicio del programa y nada, me sigue el mismo problema que se desbora a la hora de ejecutar el pcl, creo que el motivo seria el que dijiste que depende del valor que lleva W xq no se como borrar el valor del pcl para que en esa segunda grafica pueda empezar el conteo desde 0 si me puedes ayudar te lo agradeceria... aqui coloco el codigo completo para que le eches una ojeada a ver que dices...
-
Claro que se desborda por el valor en W, la tabla tiene 9 posiciones de 0 a 8 y tu lo comparas con 9 y despues lo incrementas y se desborda, en las tablas se suma el PCL+W+1, el 1 es porque el programa para que corra el PIC internamente hace esta operacion PCL+1 para pasar a la siguiente instruccion, fijate cuando haces la primera suma, lleva en W el 0, seria PCL+0=PCL se quedaria ahi, sin embargo no se queda te da el primer valor de la tabla. Tambien tienes otros problemas, comparas con el valor que te devuelve la tabla y no con CUENTA2 que es el que se va incrementando, es CUENTA2 el que no debe exceder de 8. Esta comparacion la debes de hacer despues de INCF CUENTA2,1 ya que si miras que CUENTA2 no sea mayor de 8 y despues lo incremantas tambien se desbordara.
Prueba con este que modifique para SENOI1, pon en INICIO "CLRF CUENTA2" para que cada vez que empieza empiece de 0, asi te deberia funcionar.
SENOI1
MOVF CUENTA2,W ;MUEVO A W EL VALOR DE CUENTA (0 INICIALMENTE)
CALL TABLA1 ;Llamamos a TABLA
MOVWF AUX3
INCF CUENTA2,1 ;SUMO 1 A CUENTA PARA INCREME
MOVF CUENTA2,W ;MUEVO CUENTA2 A W Y LO DEJO EN W
XORWF FACTOR3,0 ;COMPARO CON FACTOR EL VALOR DE CUENTA2
BTFSC STATUS,Z ;PREGUNTO POR LA BANDERA Z
GOTO SENOI2 ;SI SE LEVANTO VOY A TRIANG2
MOVF AUX3,0 ;MUEVO LO QUE TIENE AUX A W
MOVWF PORTB ; cargamos W en el puerto B
CALL DEMORA ;LLAMO AL RETARDO
GOTO SENOI1 ;va a TRIANG1
-
Claro que se desborda por el valor en W, la tabla tiene 9 posiciones de 0 a 8 y tu lo comparas con 9 y despues lo incrementas y se desborda, en las tablas se suma el PCL+W+1, el 1 es porque el programa para que corra el PIC internamente hace esta operacion PCL+1 para pasar a la siguiente instruccion, fijate cuando haces la primera suma, lleva en W el 0, seria PCL+0=PCL se quedaria ahi, sin embargo no se queda te da el primer valor de la tabla. Tambien tienes otros problemas, comparas con el valor que te devuelve la tabla y no con CUENTA2 que es el que se va incrementando, es CUENTA2 el que no debe exceder de 8. Esta comparacion la debes de hacer despues de INCF CUENTA2,1 ya que si miras que CUENTA2 no sea mayor de 8 y despues lo incremantas tambien se desbordara.
Prueba con este que modifique para SENOI1, pon en INICIO "CLRF CUENTA2" para que cada vez que empieza empiece de 0, asi te deberia funcionar.
SENOI1
MOVF CUENTA2,W ;MUEVO A W EL VALOR DE CUENTA (0 INICIALMENTE)
CALL TABLA1 ;Llamamos a TABLA
MOVWF AUX3
INCF CUENTA2,1 ;SUMO 1 A CUENTA PARA INCREME
MOVF CUENTA2,W ;MUEVO CUENTA2 A W Y LO DEJO EN W
XORWF FACTOR3,0 ;COMPARO CON FACTOR EL VALOR DE CUENTA2
BTFSC STATUS,Z ;PREGUNTO POR LA BANDERA Z
GOTO SENOI2 ;SI SE LEVANTO VOY A TRIANG2
MOVF AUX3,0 ;MUEVO LO QUE TIENE AUX A W
MOVWF PORTB ; cargamos W en el puerto B
CALL DEMORA ;LLAMO AL RETARDO
GOTO SENOI1 ;va a TRIANG1
Gracias por tu respuesta amigo, sinceramente ya no se que pasa xq no logro hacer funcionar eso, simplemente se sigue desbordando la tabla... la secuencia esta bien los registros esta bien pero a la hora de hacer la comparacion con la xor y con el registro de la bandera z simplemente se sigue de largo y hay es cuando empieza el problema, no sabria decir si es que tengo que borrar la bandera z o algo asi... xq sinceramente ya no se que hacer el problema reca en estas lineas de codigo...
XORWF FACTOR3,0 ;COMPARO CON FACTOR EL VALOR DE CUENTA2
BTFSC STATUS,Z ;PREGUNTO POR LA BANDERA Z
simplemente no se levanta la bandera y por eso se desborda la tabla si alguien me puede ayudar con eso se lo agradeceria...
-
Ahora no se desborda en SENOI1 ahi va perfecto, se desborda la primera vez que llama a la tabla desde SENOI2 porque tiene un 9 en CUENTA2, te hice un arreglo de urgencia decrementandolo antes de entrar en SENOI2, Y YA TE VA, PRUEBALO, tuve que cambiar el GOTO SENOI2 por GOTO $+5, sino hacia dos decrementos, y se saltaba uno si uno no en la tabla, ahora creo que va.
SENOI1
MOVF CUENTA2,W ;MUEVO A W EL VALOR DE CUENTA (0 INICIALMENTE)
CALL TABLA1 ;Llamamos a TABLA
MOVWF AUX3
INCF CUENTA2,1 ;SUMO 1 A CUENTA PARA INCREME
MOVF CUENTA2,W ;MUEVO EL VALOR DE W A AUX
XORWF FACTOR3,0 ;COMPARO CON FACTOR EL VALOR DE W
BTFSC STATUS,Z ;PREGUNTO POR LA BANDERA Z
GOTO $+5 ;SI SE LEVANTO VOY A TRIANG2
MOVF AUX3,0 ;MUEVO LO QUE TIENE AUX A W
MOVWF PORTB ; cargamos W en el puerto BCUENTA2,F
CALL DEMORA ;LLAMO AL RETARDO
GOTO SENOI1 ;va a TRIANG1
DECF CUENTA2,1
SENOI2
;AHORA CUENTA TIENE EL VALOR 1F QUE ES EL MAXIMO QUE SE CARGO EN EL PASO ANTERIOR
MOVF CUENTA2,W ;IGUAL QUE LO ANTERIOR SOLO QUE AHORA DECIENDE EL VALOR DE CUENTA
CALL TABLA1 ; llamamos a TABLA
MOVWF AUX4
XORWF FACTOR2,0
BTFSC STATUS,Z
GOTO FIN
MOVF AUX4,0
MOVWF PORTB ; cargamos W en el puerto B
DECF CUENTA2,F ; DECREMENTO EL VALOR DE CUENTA Y POR ESO LA GRAFICA DEFIENDE
CALL DEMORA
GOTO SENOI2
-
Ahora no se desborda en SENOI1 ahi va perfecto, se desborda la primera vez que llama a la tabla desde SENOI2 porque tiene un 9 en CUENTA2, te hice un arreglo de urgencia decrementandolo antes de entrar en SENOI2, Y YA TE VA, PRUEBALO, tuve que cambiar el GOTO SENOI2 por GOTO $+5, sino hacia dos decrementos, y se saltaba uno si uno no en la tabla, ahora creo que va.
SENOI1
MOVF CUENTA2,W ;MUEVO A W EL VALOR DE CUENTA (0 INICIALMENTE)
CALL TABLA1 ;Llamamos a TABLA
MOVWF AUX3
INCF CUENTA2,1 ;SUMO 1 A CUENTA PARA INCREME
MOVF CUENTA2,W ;MUEVO EL VALOR DE W A AUX
XORWF FACTOR3,0 ;COMPARO CON FACTOR EL VALOR DE W
BTFSC STATUS,Z ;PREGUNTO POR LA BANDERA Z
GOTO $+5 ;SI SE LEVANTO VOY A TRIANG2
MOVF AUX3,0 ;MUEVO LO QUE TIENE AUX A W
MOVWF PORTB ; cargamos W en el puerto BCUENTA2,F
CALL DEMORA ;LLAMO AL RETARDO
GOTO SENOI1 ;va a TRIANG1
DECF CUENTA2,1
SENOI2
;AHORA CUENTA TIENE EL VALOR 1F QUE ES EL MAXIMO QUE SE CARGO EN EL PASO ANTERIOR
MOVF CUENTA2,W ;IGUAL QUE LO ANTERIOR SOLO QUE AHORA DECIENDE EL VALOR DE CUENTA
CALL TABLA1 ; llamamos a TABLA
MOVWF AUX4
XORWF FACTOR2,0
BTFSC STATUS,Z
GOTO FIN
MOVF AUX4,0
MOVWF PORTB ; cargamos W en el puerto B
DECF CUENTA2,F ; DECREMENTO EL VALOR DE CUENTA Y POR ESO LA GRAFICA DEFIENDE
CALL DEMORA
GOTO SENOI2
gracias mi pana por tu ayuda, me a servido demasiado aqui te pongo las imagenes del resultado de las ondas...
(http://img256.imagevenue.com/loc147/th_59674_TRIANGULAR_122_147lo.JPG) (http://img256.imagevenue.com/img.php?image=59674_TRIANGULAR_122_147lo.JPG)(http://img248.imagevenue.com/loc381/th_59676_SENOIDAL_122_381lo.JPG) (http://img248.imagevenue.com/img.php?image=59676_SENOIDAL_122_381lo.JPG)
-
Me alegro que te haya servido. :-/ :-/
Las ondas es posible que se puedan mejorar cambiando algunos valores, aunque estan bastante bien.
-
Me alegro que te haya servido. :-/ :-/
Las ondas es posible que se puedan mejorar cambiando algunos valores, aunque estan bastante bien.
si por eso ya termine de hacer lo facil... ahora viene lo dificil es algo complicado de decir.. xq tengo que modificar las frecuencias de las señales pero la cosa es que tengo que tomar en cuenta todo los otros pasos para sacar los retardos entre pasos y paso de la tabla... algo de explicar por aqui...
pero gracias por la ayuda de todas maneras cualquier cosa te consulto ok