Vamos a ir por parte.
me puedes explicar mejor lo de los vectores de interrupcion para que sirven
Los vectores de reset e interrupcion son fijos, estos ocupan las posiciones 0x00 y 0x04 en esos PIC, cuadno el micro arranca ( reset, por que recien lo alimentas, BOR) la primera instruccion que ejecuta se encuentra en 0x00 , es decir el vector de reset. Si usas una interrupcion ( obviamente la tenes habilitada ) como por ejemplo tener un timer que cada 100ms active una interrupcion. Apenas se activa comienza a ejecutar la instruccion que se encuentra en 0x04.
Ahi los puse por que si por casualidad vos activas la interrupcion, se produce el RETURN sin ningun problema, pero en tu primer programa si hubiera ocurrido una interrupcion por que la habilitaste erroneamente, hubiera ido al CLRF TRISC y seguiria ejecutandose desde ahi, ( condigurando nuevamente los puertos, modificando nuevamente las salidas etc )
para que sirve el banksel
El BANKSEL es una instruccion del compilador MPASM (es que genera el codigo maquina desde el ASM ), el MPASM cuando encuentra el BANKSEL lo reemplaza por su correspondiente BSF/BCF STATUS,RPx de los bits de los bancos. Es como hiciste vos pero nomas que este te permite una mejor portabilidad entre micros, ya que si cambia el registro entre un micro y otro es el MPASM quien se encarga de generar ese codigo.
hola, me puedes explicar bien como cambiarle la frecuencia y el periodo a esa onda ya me sale una onda cuadrada gracias
En el datasheet estan las formulas
PWM period = [(PR2) + 1] * 4 * TOSC * (TMR2 prescale value)
La frecuencia va a depender de lo que cargues en el registro PR2 , el cristal que tengas y el valor del preescaler del TMR2, ya que el PWM usa el Timer2
El duty que la idea es que sea del 50% en tu caso asi generar la onda cuadrada
PWM duty cycle = (CCPR1L:CCP1CON<5:4>) * TOSC * (TMR2 prescale value)
Se carga 10 bits, 8 en el registro CCPR1L y 2 en el registro CCP1CON, esa formula te va a dar el tiempo y deberia ser la mitad del periodo del PWM.
Algo que te puede ayudar para no hacer tantos calculos es utilizar una calculadora online como esta:
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.htmlEjemplo si tengo un cristal de 8Mhz + una frecuencia de 1Khz y un duty del 50%. Estos valores tengo que cargarle
PR2 = 0b01111100 ; // Me indica la frecuencia
T2CON = 0b00000111 ; // Selecciona el periodo
CCPR1L = 0b00111110 ; // Duty
CCP1CON = 0b00011100 ; // Duty y modo PWM
Pero es para que te des un ejemplo, si necesitas una frecuencia mucho mas lenta, entonces vas a tener que usar un PWM por software, es decir por programa y no por el modulo.
ES posible suporpener los siguientes datos en la señal cuadrada que sale del pwm datos
Que intentas hacer con esos datos. Con el PWM vas a generar una señal cuadrada, por lo que veo parece que intentas cambiarle la frecuencia a tu PWM, es decir los primeros 11 que sea 1 0 y luego sean 11 00 , o que seria lo mismo que aumentar el periodo por 2. Si te explicas mejor como es que queres que salgan los datos seria mas facil llegar a una solucion.
Una cosa mas que me molesta un poco de tus programas, sera a mi pero no utilices los #define para eso. Se vuelve MUY complicado leer el programa, el archivo P16F73.INC posee todos los nombres de los registros y de los pines. Y por ejemplo leer:
es mas complejo saber de que se trata que poner (especialmente por que lees el codigo y tenes que ir arriba a cada rato para saber de que se trata, lo que ahorras escribiendo lo perdes al momento de leerlo y entenderlo ):
BSF PIR2,CCP2IF ; Es lo mismo que hacer PIR2,0
los bits tienen los mismos nombres que los bits del datasheet, y es mas claro llegado a ese punto que se trata de CCP2 I F ( Flag de Interrupcion del modulo CCP2 ), Por eso mismo cuando pase mi programa evite todo esos #define que tenes.
Volviendo al tema del PWM
Y siguiendo el ejemplo de arriba ( cristal 8Mhz, 1Khz, 50% duty )
PWM
; Frecuencia 1Khz
MOVLW 0x7C
MOVWF PR2
; Duty Cicle = 50% y selecciono modo PWM
MOVLW 0x2E
MOVWF CCPR1L
MOVLW 0x1C
MOVWF CCP1CON
; Preescaler 1:16 del TMR2 (para 1Khz) y activo TMR2
MOVLW 0x07
MOVWF T2CON
RETURN
Observa que no uso interrupciones. ni nada por el estilo, al menos no por ahora.
Tambien otra cosa, no uso muchos BSF/BCF sino un MOVLW/MOVWF se hace mas compacto el programa y en el caso de los puertos puede solucionar algunos errores que pueden ocurrir.
-------------------------------------------------
Para tu otro mensaje con respecto a los delays.
en el codigo de la libreria esa
CBLOCK
R_ContA ; Contadores para los retardos.
R_ContB
R_ContC
ENDC
Observas que no tienen ningun numero al lado de CBLOCK asi que es igual a 0x00, el mismo error que tenias antes. Pero cual es la solucion ?
Una es quitarla de ahi y pasarla a tu programa principal:
CBLOCK 0x20
CONTA_1 ;0x20
CONTA_2 ;0x21
CONTA_3 ;0x22
CONTA_4 ;0x23
R_ContA ;0x24
R_ContB ;0x25
R_ContC ;0x26
ENDC
Ventajas: Esta todo en un solo CBLOCK lo cual no hay posibilidad de superposicion
Desventaja: Tenes que escribir los R_Contx En cada programa
La otra es definirle un comienzo
CBLOCK 0x40
R_ContA ;0x40
R_ContB ;0x41
R_ContC ;0x42
ENDC
Ventajas: es mas portable, solamente definir un comienzo ( en mi caso 0x40)
Desventaja: Hay posibilidades que si es muy grande el otro CBLOCK que se superpongan, si yo hubiera puesto 0x20 en este ultimo, R_ContA se dirigiria a 0x20 y si tu programa intenta acceder a CONTA_1 tambien accederia al registro hubicado en 0x20, es decir ambos nombres accederian a un mismo registro y seguro que van a ocurrir problemas. Asi que ojo con eso, por eso puse 0x40 como para alejarme lo mas posible