Autor Tema: ayuda con una libreria  (Leído 3294 veces)

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

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
ayuda con una libreria
« en: 21 de Agosto de 2015, 18:30:31 »
hola en el siguiente programa no me lee la libreria de retardos que estoy utilizando y esta solo se puede incluir al final del programa porque al principio no se se puede poner y lo raro  es que cuando llama al primer retardo en vez de ir a la libreria le manda un uno la pin a4 y no se porque y luego en los siguientes retardos tampoco llama la libreria

Código: [Seleccionar]
#INCLUDE<P16F73.INC>
#DEFINE LED     PORTA,0
#DEFINE SERIALENABLE SSPCON,5
#DEFINE SSP3 SSPCON,3
#DEFINE SSP2 SSPCON,2
#DEFINE SSP1 SSPCON,1
#DEFINE SSP0 SSPCON,0
#DEFINE OVERFLOW SSPCON,6
#DEFINE CLOCKS SSPCON,4
#DEFINE STA5      STATUS,5
#DEFINE STA6      STATUS,6
#DEFINE BUFFER SSPSTAT,0
#DEFINE READ SSPSTAT,2
#DEFINE CK SSPSTAT,6
#DEFINE SM SSPSTAT,7
#DEFINE INFLAG PIR1,3
#DEFINE VAR PORTA,4
#DEFINE LED_2 PORTB,0
#DEFINE LED_3 PORTB,1
#DEFINE LED_4 PORTB,2
#DEFINE LED_5 PORTB,3
#DEFINE LED_6 PORTB,4
#DEFINE LED_7 PORTB,5
#DEFINE LED_8 PORTB,6
#DEFINE datos PORTC,1

CBLOCK       0x00
CONTA_1
CONTA_2
CONTA_3
CONTA_4


ENDC
   


PUERTOS


  BSF STA5
BCF STA6
CLRF TRISB
CLRF TRISA
CLRF  TRISC
BCF STA5
BCF STA6







BTFSC VAR
CALL RUT
BTFSS VAR
CALL RUT_2


CALL ENVIO
CALL I2CSLAVEMODE7


GOTO  LED_1


RUT
BCF LED_2
BCF LED_3
BCF LED_4
BCF LED_5
RETURN

RUT_2
BSF LED_2
BSF LED_3
BSF LED_4
BSF LED_5
RETURN



LED_1
BSF   LED
GOTO LED_1




I2CSLAVEMODE7
BCF SSP0
BSF SSP1
BSF SSP2
BCF SSP3
MOVLW   0x18
    MOVWF   TRISC
BSF SERIALENABLE
BCF BUFFER
BCF OVERFLOW
BSF INFLAG
BSF BUFFER
BSF CLOCKS
BSF READ
BCF CLOCKS
BCF INFLAG
BSF INFLAG
BSF CLOCKS
BCF READ
BCF INFLAG
BCF BUFFER
BSF OVERFLOW
RETURN

ENVIO
BSF datos
CALL Retardo_100micros
BSF datos
CALL Retardo_2ms
BCF datos
CALL Retardo_1ms
BSF datos
CALL Retardo_2ms
BCF datos
CALL Retardo_1ms
BSF datos
CALL Retardo_2ms
BSF datos
CALL Retardo_1ms
BCF datos
CALL Retardo_2ms
BSF datos
CALL Retardo_1ms
BCF datos
CALL Retardo_2ms
BSF datos
CALL Retardo_1ms
BCF datos
CALL Retardo_2ms
BCF datos
CALL Retardo_1ms
BSF datos
CALL Retardo_2ms
BSF datos
CALL Retardo_1ms
BCF datos
RETURN

 

#INCLUDE <C:\Users\ciel\Desktop\archivos mplab\RETARDOS.INC>
end

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda con una libreria
« Respuesta #1 en: 21 de Agosto de 2015, 22:37:28 »
Bueno hay varias cosas para decirte de tu programa, espero que no lo tomes a mal y cualquier pregunta que hagas sera respondida.

Intente acomodar un poco el programa simplificando algunas cosas, lamentablemente, lo del I2C no se para que esta, hay algo que esta enviandote un valor en I2C? Por que lo tenes en esclavo. Ademas pones a 1 luego a 0 luego a 1 algunos bits del mismo. Asi que esa parte la voy a omitir en el analisis.

Este es tu programa:

Código: ASM
  1. #INCLUDE <P16F73.INC>
  2.  
  3.  
  4.         CBLOCK       0x00       ; ERROR: Primer error, tal ves por eso tiene problemas
  5.         CONTA_1
  6.         CONTA_2
  7.         CONTA_3
  8.         CONTA_4
  9.         ENDC
  10.    
  11.         ORG 0x00                ;vectores de reset e interrupcion
  12.         GOTO    PUERTOS
  13.         ORG 0X04
  14.         RETURN
  15.  
  16. PUERTOS
  17.  
  18.         BANKSEL TRISB
  19.         CLRF    TRISB           ; Todos como salidas
  20.         CLRF    TRISA
  21.         CLRF    TRISC
  22.         BANKSEL PORTA
  23.         CLRF    PORTB           ; A pesar que inician todos en 0 los pongo en 0 por las dudas
  24.         CLRW                    ; Pongo a 0 W por si es que tiene algun valor, aunque deberia estar en 0. PEEERO mejor asegurarse
  25.  
  26.         BTFSS   PORTA,4         ; ERROR: Esto es 0 si o si, si esta puesto como salida
  27.         MOVLW   0x0F            ; Si PORTA,4 es 0 entonces RB3:0 = 1,  si es 1 PORTA,4 entocnes RB3:0 = 0;
  28.         MOVWF   PORTB
  29.  
  30.         CALL    ENVIO
  31.        
  32. LED_1
  33.         BSF   PORTA,0
  34.         GOTO LED_1
  35.  
  36. ENVIO
  37.         BSF     PORTC,1
  38.         CALL    Retardo_100micros
  39.         BSF     PORTC,1                 ; Redundante, ya esta en 1 ese pin.
  40.         CALL    Retardo_2ms
  41.         BCF     PORTC,1
  42.         CALL    Retardo_1ms
  43.         BSF     PORTC,1
  44.         CALL    Retardo_2ms
  45.         BCF     PORTC,1
  46.         CALL    Retardo_1ms
  47.         BSF     PORTC,1
  48.         CALL    Retardo_2ms
  49.         BSF     PORTC,1
  50.         CALL    Retardo_1ms
  51.         BCF     PORTC,1
  52.         CALL    Retardo_2ms
  53.         BSF     PORTC,1
  54.         CALL    Retardo_1ms
  55.         BCF     PORTC,1
  56.         CALL    Retardo_2ms
  57.         BSF     PORTC,1
  58.         CALL    Retardo_1ms
  59.         BCF     PORTC,1
  60.         CALL    Retardo_2ms
  61.         BCF     PORTC,1
  62.         CALL    Retardo_1ms
  63.         BSF     PORTC,1
  64.         CALL    Retardo_2ms
  65.         BSF     PORTC,1
  66.         CALL    Retardo_1ms
  67.         BCF     PORTC,1
  68.         RETURN
  69.  
  70.  
  71. #INCLUDE <C:\Users\ciel\Desktop\archivos mplab\RETARDOS.INC>
  72.  
  73.         end

Le agregue los vectores de reset / interrupcion, no estaban y no implica nada pero considero una buena practica hacerlo.

Funcionamiento de tu programa:
Pones como SALIDA a todos los puertos, PORTA,B y C.
Luego preguntas por PORTA,4 . Pero esto estaba como salida, no como entrada asi que no tiene sentido preguntar, deberia tener un 0 si es que el registro PORTx se pone a 0 cuando cambias el TRISx. E ir siempre al mismo lugar. A no ser que realmente te equivocaste y era una entrada. Y espero que no estes haciendo un cortocircuito.
Eso modifica el puerto B, o pone a 0 todas las salidas o pone a RB3:0 a 1.
Luego llamas a "Envio"  Esa funcion, lo unico que hace es encender y apagar varias veces el pin RC1 (Generando una onda cuadrada con un duty de 66% y 3ms de periodo), todo eso dura 21.1ms si los delays estan bien. Creo que ni lo verias.
Finalmente pone a 0 el RA0 (que ya estaba en 0 por que jamas se puso a 1) y se queda para siempre ahi. Es decir no hace mas nada el micro.
Todo tu programa se ejecuto en unos 22ms como maximo y se termino, quedo fijo no hay cambios en las salidas ni nada por el estilo.

Ahora mi pregunta: ¿Es eso es lo que intentas hacer?

Errores que encontre:

- Imagino que lo del CBLOCK son los registros que te pide las demoras. Entonces no puede comenzar en 0x00 , sino que deberia comenzar en 0x20 ( observa el datasheet en Memory Organization, ahi tenes los registros de proposito general GPRs )
- Esta leyendo salidas.. no le veo mucho sentido a esto ( no al comienzo del programa ).
- Hay mejores formas de hacer una onda cuadrada. ( Usando el PWM, si es que esto es lo que queres hacer )
- El tema del I2C como esclavo es como para ser un receptor, parece que no tenes muy en claro como funciona, Tampoco se para que pusiste a 1 y 0 algunos bits. Aqui tambien accedes a un TRISC el cual se encuentra en el banco 1. Pero vos estas en el banco 0.

Si aclaras exactamente que queres realizar es mas facil ayudarte, no encuentro razones para creer que esta mal la libreria. Tampoco tengo el codigo de la libreria asi que no se lo que hace, pero si son retardos realmente, entonces no deberia modificarse ningun pin Excepto tu problema del CBLOCK.

Con respecto a tu otro tema de generar una onda cuadrada con el I2C, te habia dicho que es mejor el PWM, Si observas el datasheet en las curvas de la figura 9-7 es lo que verias si usas el I2C. es decir no es lo que queres, tendrias una onda cuadrada cortada cada 9 bits aproximadamente. ademas de estar mandando a cada rato un valor al I2C, mientras que con el PWM lo configuras y te olvidas. Tambien con I2C tiene una velocidad definida. Asi que no te va a permitir hacer cualquier frecuencia/periodo de onda. En fin, no es algo para eso.
« Última modificación: 24 de Agosto de 2015, 01:28:16 por KILLERJC »

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con una libreria
« Respuesta #2 en: 24 de Agosto de 2015, 12:56:26 »
hola, gracias, me puedes explicar mejor lo de los vectores de interrupcion para que sirven y para que sirve el banksel, tienes razon ya quite lo del i2c y estoy intentando generar una señal cuadrada usando el pwm porque pin del micro saldria la onda cuadrada, en el siguiente codigo esta bien o no la onda cudrada por pwm
Código: [Seleccionar]
#INCLUDE<P16F73.INC>
#DEFINE LED     PORTA,0
#DEFINE CCP3 CCP1CON,3
#DEFINE CCP2 CCP1CON,2
#DEFINE CCP1 CCP1CON,1
#DEFINE CCP0 CCP1CON,0
#DEFINE CCP5 CCP1CON,5
#DEFINE CCP4 CCP1CON,4
#DEFINE TR2 T2CON,2
#DEFINE T2K0 T2CON,1
#DEFINE T2K1 T2CON,0
#DEFINE INT1 PIR1,1
#DEFINE INT3 PIR2,0
#DEFINE INT2 PIE1,1
#DEFINE VAR PORTA,4
#DEFINE LED_2 PORTB,0
#DEFINE LED_3 PORTB,1
#DEFINE LED_4 PORTB,2
#DEFINE LED_5 PORTB,3
#DEFINE LED_6 PORTB,4
#DEFINE LED_7 PORTB,5
#DEFINE LED_8 PORTB,6
#DEFINE datos PORTC,1

CBLOCK       0x20
CONTA_1
CONTA_2
CONTA_3
CONTA_4


ENDC
   



ORG 0x00 ;vectores de reset e interrupcion
GOTO PUERTOS
ORG 0X04
RETURN

PUERTOS
  BANKSEL TRISB
CLRF TRISB ; Todos como salidas
CLRF TRISA
CLRF  TRISC
BANKSEL PORTA
CLRF PORTA
CLRF PORTC
CLRF PORTB ; A pesar que inician todos en 0 los pongo en 0 por las dudas
CLRW







BTFSC VAR
CALL RUT
BTFSS VAR
CALL RUT_2


CALL PWM



GOTO  LED_1


RUT
BCF LED_2
BCF LED_3
BCF LED_4
BCF LED_5
RETURN

RUT_2
BSF LED_2
BSF LED_3
BSF LED_4
BSF LED_5
RETURN



LED_1
BSF   LED
GOTO LED_1

PWM
BSF INT3
BSF CCP4
BSF CCP5
CLRF TRISC
BSF TR2
BSF CCP0
BSF CCP1
BSF CCP2
BSF CCP3
BCF T2K1
BCF T2K0
MOVLW 0xFF
MOVWF PR2
RETURN




 

#INCLUDE <C:\Users\ciel\Desktop\archivos mplab\RETARDOS.INC>
end

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con una libreria
« Respuesta #3 en: 24 de Agosto de 2015, 13:11:13 »
hola, me puedes explicar bien como cambiarle la frecuencia y el periodo a esa onda ya me sale una onda cuadrada gracias

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con una libreria
« Respuesta #4 en: 24 de Agosto de 2015, 17:48:52 »
ES posible suporpener los siguientes datos en la señal cuadrada que sale del pwm
datos
  • =1;

datos [1]=1;
datos [2]=0;
datos [3]=1;
datos [4]=0;
datos [5]=1;
datos [6]=1;
datos [7]=0;
datos [8]=1;
datos [9]=0;
datos [10]=1;
datos [11]=0;
datos [12]=0;
datos [13]=1;
datos [14]=1;
datos [15]=0;

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con una libreria
« Respuesta #5 en: 24 de Agosto de 2015, 18:27:29 »
Código: [Seleccionar]
;
; ===================================================================
;   Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;   E. Palacios, F. Remiro y L. López.
;   Editorial Ra-Ma.  www.ra-ma.es
; ===================================================================
;
; Librería con múltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos.
; Además se pueden implementar otras subrutinas muy fácilmente.
;
; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal
; de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada
; ciclo máquina tarda 4 x 1/4MHz = 1 µs.
;
; En los comentarios, "cm" significa "ciclos máquina".
;
; ZONA DE DATOS *********************************************************************

CBLOCK
R_ContA ; Contadores para los retardos.
R_ContB
R_ContC
ENDC
;
; RETARDOS de 4 hasta 10 microsegundos ---------------------------------------------------
;
; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ,
; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina
; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina.
;
Retardo_10micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
nop ; Aporta 1 ciclo máquina.
Retardo_5micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
Retardo_4micros ; La llamada "call" aporta 2 ciclos máquina.
goto RetardoMicros ; El salto del retorno aporta 2 ciclos máquina.
;
; RETARDOS de 20 hasta 500 microsegundos ------------------------------------------------
;
Retardo_500micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'164' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_200micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'64' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_100micros ; La llamada "call" aporta 2 ciclos máquina.
movlw d'31' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_50micros ; La llamada "call" aporta 2 ciclos máquina.
nop ; Aporta 1 ciclo máquina.
movlw d'14' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros ; Aporta 2 ciclos máquina.
Retardo_20micros ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "K".
goto RetardoMicros
;
; El próximo bloque "RetardoMicros" tarda:
; 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos máquina.
;
RetardoMicros
movwf R_ContA ; Aporta 1 ciclo máquina.
Rmicros_Bucle
decfsz R_ContA,F ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
; goto Rmicros_Bucle ; Aporta (K-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_500micros: 2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz).
; - Retardo_200micros: 2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz).
; - Retardo_100micros: 2     + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz).
; - Retardo_50micros : 2 + 1 + 1 + 2 + (2 + 3K) =  50 cm =  50 µs. (para K= 14 y 4 MHz).
; - Retardo_20micros : 2     + 1     + (2 + 3K) =  20 cm =  20 µs. (para K=  5 y 4 MHz).
;
; RETARDOS de 1 ms hasta 200 ms. --------------------------------------------------------
;
Retardo_200ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'200' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'100' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_50ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'50' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_20ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'20' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_10ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_5ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_2ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'2' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_1ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'1' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
movwf R_ContB ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d'249' ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
;goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
; goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_50ms : 2 + 1 + 2 + (2 + 4M + 4KM) =  50007 cm =  50 ms. (M= 50 y K=249).
; - Retardo_20ms : 2 + 1 + 2 + (2 + 4M + 4KM) =  20007 cm =  20 ms. (M= 20 y K=249).
; - Retardo_10ms : 2 + 1 + 2 + (2 + 4M + 4KM) =  10007 cm =  10 ms. (M= 10 y K=249).
; - Retardo_5ms  : 2 + 1 + 2 + (2 + 4M + 4KM) =   5007 cm =   5 ms. (M=  5 y K=249).
; - Retardo_2ms  : 2 + 1 + 2 + (2 + 4M + 4KM) =   2007 cm =   2 ms. (M=  2 y K=249).
; - Retardo_1ms  : 2 + 1     + (2 + 4M + 4KM) =   1005 cm =   1 ms. (M=  1 y K=249).
;
; RETARDOS de 0.5 hasta 20 segundos ---------------------------------------------------
;
Retardo_20s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'200' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_10s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'100' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_5s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'50' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_2s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'20' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_1s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_500ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "N".
;
; El próximo bloque "Retardo_1Decima" tarda:
; 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 +
;   + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 =
; = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone 100011
; ciclos máquina que a 4 MHz son 100011 µs = 100 ms = 0,1 s = 1 décima de segundo.
;
Retardo_1Decima
movwf R_ContC ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
movlw d'100' ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
movwf R_ContB ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
movlw d'249' ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno         
nop ; Aporta KxMxNx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
; goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
; goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina.
decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
; goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_20s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s.
; (N=200, M=100 y K=249).
; - Retardo_10s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s.
; (N=100, M=100 y K=249).
; - Retardo_5s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  5000207 cm =  5 s.
; (N= 50, M=100 y K=249).
; - Retardo_2s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  2000087 cm =  2 s.
; (N= 20, M=100 y K=249).
; - Retardo_1s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  1000047 cm =  1 s.
; (N= 10, M=100 y K=249).
; - Retardo_500ms: 2 + 1     + (2 + 4N + 4MN + 4KMN) =   500025 cm = 0,5 s.
; (N=  5, M=100 y K=249).
; ===================================================================
;   Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;   E. Palacios, F. Remiro y L. López.
;   Editorial Ra-Ma.  www.ra-ma.es
; ===================================================================




ese es el codigo de la libreria enserio no se porque no la esta leyendo y a continuacion el ultimo codigo que estoy usando
Código: [Seleccionar]
#INCLUDE<P16F73.INC>
#DEFINE LED     PORTA,0
#DEFINE CCP3 CCP1CON,3
#DEFINE CCP2 CCP1CON,2
#DEFINE CCP1 CCP1CON,1
#DEFINE CCP0 CCP1CON,0
#DEFINE CCP5 CCP1CON,5
#DEFINE CCP4 CCP1CON,4
#DEFINE TR2 T2CON,2
#DEFINE T2K0 T2CON,1
#DEFINE T2K1 T2CON,0
#DEFINE INT1 PIR1,1
#DEFINE INT3 PIR2,0
#DEFINE INT2 PIE1,1
#DEFINE VAR PORTA,4
#DEFINE LED_2 PORTB,0
#DEFINE LED_3 PORTB,1
#DEFINE LED_4 PORTB,2
#DEFINE LED_5 PORTB,3
#DEFINE LED_6 PORTB,4
#DEFINE LED_7 PORTB,5
#DEFINE LED_8 PORTB,6
#DEFINE datos PORTC,3

CBLOCK       0x20
CONTA_1
CONTA_2
CONTA_3
CONTA_4


ENDC
   






ORG 0x00 ;vectores de reset e interrupcion
GOTO PUERTOS
ORG 0X04
RETURN

PUERTOS
  BANKSEL TRISB
CLRF TRISB ; Todos como salidas
CLRF TRISA
CLRF  TRISC
BANKSEL PORTA
CLRF PORTA
CLRF PORTC
CLRF PORTB ; A pesar que inician todos en 0 los pongo en 0 por las dudas
CLRW







BTFSC VAR
CALL RUT
BTFSS VAR
CALL RUT_2


; CALL PWM
CALL ENVIO


GOTO  LED_1


RUT
BCF LED_2
BCF LED_3
BCF LED_4
BCF LED_5
RETURN

RUT_2
BSF LED_2
BSF LED_3
BSF LED_4
BSF LED_5
RETURN



LED_1
BSF   LED
GOTO LED_1

PWM
BSF INT3
BCF TRISC,2
BSF TR2
BSF CCP0
BSF CCP1
BSF CCP2
BSF CCP3
BCF T2K1
BCF T2K0
MOVLW   D'255'
MOVWF PR2
MOVLW   D'166'
MOVWF CCPR1L
BCF CCP4
BSF CCP5
RETURN

ENVIO
BSF datos
CALL Retardo_1s
CALL Retardo_2s
BCF datos
CALL Retardo_1s
BSF datos
CALL Retardo_2s
BCF datos
CALL Retardo_1s
BSF datos
CALL Retardo_2s
CALL Retardo_1s
BCF datos
CALL Retardo_2s
BSF datos
CALL Retardo_1s
BCF datos
CALL Retardo_2s
BSF datos
CALL Retardo_1s
BCF datos
CALL Retardo_2s
CALL Retardo_1s
BSF datos
CALL Retardo_2s
CALL Retardo_1s
BCF datos
RETURN



 

#INCLUDE <C:\Users\ciel\Desktop\archivos mplab\RETARDOS.INC>
end

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda con una libreria
« Respuesta #6 en: 24 de Agosto de 2015, 18:49:10 »
Vamos a ir por parte.

Citar
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 )

Citar
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.

Citar
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.html

Ejemplo 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.

Citar
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:

Código: ASM
  1. BSF             INT3

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 ):

Código: ASM
  1. 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 )

Código: ASM
  1. PWM
  2.         ; Frecuencia 1Khz
  3.         MOVLW   0x7C
  4.         MOVWF   PR2
  5.         ; Duty Cicle = 50% y selecciono modo PWM
  6.         MOVLW   0x2E
  7.         MOVWF   CCPR1L
  8.         MOVLW   0x1C
  9.         MOVWF   CCP1CON
  10.         ; Preescaler 1:16 del TMR2 (para 1Khz) y activo TMR2
  11.         MOVLW   0x07
  12.         MOVWF   T2CON
  13.        
  14.         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

Código: ASM
  1. CBLOCK
  2.         R_ContA                         ; Contadores para los retardos.
  3.         R_ContB
  4.         R_ContC
  5.         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:

Código: ASM
  1. CBLOCK       0x20
  2.         CONTA_1      ;0x20
  3.         CONTA_2      ;0x21
  4.         CONTA_3      ;0x22
  5.         CONTA_4      ;0x23
  6.         R_ContA      ;0x24
  7.         R_ContB      ;0x25
  8.         R_ContC      ;0x26
  9.         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

Código: ASM
  1. CBLOCK 0x40
  2.         R_ContA ;0x40
  3.         R_ContB ;0x41
  4.         R_ContC ;0x42
  5.         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

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con una libreria
« Respuesta #7 en: 24 de Agosto de 2015, 19:26:34 »
y si tengo los siguientes datos para la señal cuadrada cristal 4Mhz, 1Khz, 50% duty, y necesito que la salida de esa señal cuadrada se la siguiente
11 01 01 10 10 10 01 10, es posible hacer eso,y como quedaria el codigo del pwm





Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda con una libreria
« Respuesta #8 en: 24 de Agosto de 2015, 19:49:27 »
y si tengo los siguientes datos para la señal cuadrada cristal 4Mhz, 1Khz, 50% duty, y necesito que la salida de esa señal cuadrada se la siguiente
11 01 01 10 10 10 01 10, es posible hacer eso,y como quedaria el codigo del pwm

Eso ya no seria una onda cuadrada, sino mas una señal aletoria. Si solo vas a hacer eso entonces te conviene hacerlos con delays y no te complicas la vida. Si es que solo necesitas esa onda. tambien me vas a tener que decir cuanto dura cada bit.

Si suponemos que dura 1ms cada bit, con que tu programa principal sea asi bastaria:

Código: ASM
  1. ENVIO
  2.         BSF PORTA,0          
  3.         CALL Retardo_1ms   ;1
  4.         CALL Retardo_1ms   ;1   --- 11
  5.         BCF PORTA,0          
  6.         CALL Retardo_1ms   ;0
  7.         BSF PORTA,0
  8.         CALL Retardo_1ms   ;1   --- 01
  9.         BCF PORTA,0
  10.         CALL Retardo_1ms   ;0
  11.         BSF PORTA,0
  12.         CALL Retardo_1ms   ;1   --- 01
  13.         CALL Retardo_1ms
  14.         BCF PORTA,0
  15.         CALL Retardo_1ms   ;0   --- 10
  16.         BSF PORTA,0
  17.         CALL Retardo_1ms   ;1
  18.         BCF PORTA,0
  19.         CALL Retardo_1ms   ;0   --- 10
  20.         BSF PORTA,0
  21.         CALL Retardo_1ms   ;1
  22.         BCF PORTA,0
  23.         CALL Retardo_1ms   ;0   --- 10
  24.         CALL Retardo_1ms   ;0
  25.         BSF PORTA,0
  26.         CALL Retardo_1ms   ;1   --- 01
  27.         BSF PORTA,0
  28.         CALL Retardo_1ms   ;1
  29.         BCF PORTA,0
  30.         CALL Retardo_1ms   ;0   --- 10
  31.         GOTO ENVIO

Si tu micro necesita hacer otra cosa ademas de eso, entonces se va a tener que implementar una interrupcion. Y se comienza a complicar las cosas. Ademas no se para que estas sacando esa señal, una comunicacion asi que no es sincrona ( con reloj ) no tiene mucho sentido. Si necesitara una comunicacion sincrona utilizaria el SPI, si fuera una asincrona la UART. Pero sigo sin saber que necesitas hacer con eso. si solamente es sacar esos datos como lo estamos haciendo entonces no hay problema.

La salida del PIN seria una onda asi:



Si usaras SPI seria algo mas asi:

« Última modificación: 24 de Agosto de 2015, 20:04:41 por KILLERJC »

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con una libreria
« Respuesta #9 en: 24 de Agosto de 2015, 19:56:14 »
Código: [Seleccionar]
#INCLUDE<P16F73.INC>

CBLOCK       0x20
CONTA_1
CONTA_2
CONTA_3
CONTA_4
R_ContA
R_ContB
R_ContC
ENDC
   






ORG 0x00 ;vectores de reset e interrupcion
GOTO PUERTOS
ORG 0X04
RETURN

PUERTOS
  BANKSEL TRISB
CLRF TRISB ; Todos como salidas
CLRF TRISA
CLRF  TRISC
BANKSEL PORTA
CLRF PORTA
CLRF PORTC
CLRF PORTB ; A pesar que inician todos en 0 los pongo en 0 por las dudas
CLRW







BTFSC PORTA,4
CALL RUT
BTFSS PORTA,4
CALL RUT_2

CALL ENVIO


GOTO  LED_1


RUT
BCF PORTB,0
BCF PORTB,1
BCF PORTB,2
BCF PORTB,3
RETURN

RUT_2
BSF PORTB,0
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
RETURN



LED_1
BSF   PORTA,0
GOTO LED_1


ENVIO
BSF PORTA,0         
CALL Retardo_1ms   ;1
CALL Retardo_1ms   ;1   --- 11
BCF PORTA,0         
CALL Retardo_1ms   ;0
BSF PORTA,0
CALL Retardo_1ms   ;1   --- 01
BCF PORTA,0
CALL Retardo_1ms   ;0
BSF PORTA,0
CALL Retardo_1ms   ;1   --- 01
CALL Retardo_1ms
BCF PORTA,0
CALL Retardo_1ms   ;0   --- 10
BSF PORTA,0
CALL Retardo_1ms   ;1
BCF PORTA,0
CALL Retardo_1ms   ;0   --- 10
BSF PORTA,0
CALL Retardo_1ms   ;1
BCF PORTA,0
CALL Retardo_1ms   ;0   --- 10
CALL Retardo_1ms   ;0
BSF PORTA,0
CALL Retardo_1ms   ;1   --- 01
BSF PORTA,0
CALL Retardo_1ms   ;1
BCF PORTA,0
CALL Retardo_1ms   ;0   --- 10
RETURN


 

#INCLUDE <C:\Users\ciel\Desktop\archivos mplab\RETARDOS.INC>
end
con esto codigo deberia funcionar o deberia cambiarle alguna instruccion

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ayuda con una libreria
« Respuesta #10 en: 24 de Agosto de 2015, 20:07:00 »
Código: ASM
  1. #INCLUDE<P16F73.INC>
  2.        
  3.         CBLOCK       0x20
  4.         R_ContA                
  5.         R_ContB
  6.         R_ContC
  7.         ENDC
  8.  
  9.         ORG 0x00                 ;vectores de reset e interrupcion
  10.         GOTO    PUERTOS
  11.         ORG 0X04
  12.         RETURN
  13.  
  14.         PUERTOS
  15.         BANKSEL TRISB
  16.         CLRF    TRISB           ; Todos como salidas
  17.         CLRF    TRISA
  18.         CLRF    TRISC
  19.         BANKSEL PORTA
  20.         CLRF    PORTA
  21.         CLRF    PORTC
  22.         CLRF    PORTB           ; A pesar que inician todos en 0 los pongo en 0 por las dudas
  23.  
  24.         BTFSC   PORTA,4
  25.         CALL    RUT
  26.         BTFSS   PORTA,4
  27.         CALL    RUT_2
  28.        
  29.         GOTO    ENVIO
  30.                
  31.  
  32.         RUT
  33.         BCF     PORTB,0
  34.         BCF     PORTB,1
  35.         BCF     PORTB,2
  36.         BCF     PORTB,3
  37.         RETURN
  38.        
  39.         RUT_2
  40.         BSF     PORTB,0
  41.         BSF     PORTB,1
  42.         BSF     PORTB,2
  43.         BSF     PORTB,3
  44.         RETURN
  45.  
  46. ENVIO
  47.         BSF PORTC,3          
  48.         CALL Retardo_1ms   ;1
  49.         CALL Retardo_1ms   ;1   --- 11
  50.         BCF PORTC,3          
  51.         CALL Retardo_1ms   ;0
  52.         BSF PORTC,3
  53.         CALL Retardo_1ms   ;1   --- 01
  54.         BCF PORTC,3
  55.         CALL Retardo_1ms   ;0
  56.         BSF PORTC,3
  57.         CALL Retardo_1ms   ;1   --- 01
  58.         CALL Retardo_1ms
  59.         BCF PORTC,3
  60.         CALL Retardo_1ms   ;0   --- 10
  61.         BSF PORTC,3
  62.         CALL Retardo_1ms   ;1
  63.         BCF PORTC,3
  64.         CALL Retardo_1ms   ;0   --- 10
  65.         BSF PORTC,3
  66.         CALL Retardo_1ms   ;1
  67.         BCF PORTC,3
  68.         CALL Retardo_1ms   ;0   --- 10
  69.         CALL Retardo_1ms   ;0
  70.         BSF PORTC,3
  71.         CALL Retardo_1ms   ;1   --- 01
  72.         BSF PORTC,3
  73.         CALL Retardo_1ms   ;1
  74.         BCF PORTC,3
  75.         CALL Retardo_1ms   ;0   --- 10
  76.         GOTO ENVIO
  77.  
  78.  
  79.          
  80.        
  81. #INCLUDE <C:\Users\ciel\Desktop\archivos mplab\RETARDOS.INC>
  82.         end

Ahi estaria. Asi esta continuamente ejecutandose "Envio" de esa forma nunca deja de enviar
Cambie a PORTC,3 como tenias en tu codigo
Y elimine CONTA_x que no los usabas.
« Última modificación: 24 de Agosto de 2015, 20:09:25 por KILLERJC »

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con una libreria
« Respuesta #11 en: 25 de Agosto de 2015, 11:46:16 »
la salida de esa señal no se parece a la imagen que pusiste arriba y lo raro es que sale en milivoltios como en 0.03mv  y parece que la señal fuera solo ruido no se porque usando los retardos de la bilioteca o en otra pagina generando solo un retardo individual la salida del circuito sigue asi
Código: [Seleccionar]
#INCLUDE<P16F73.INC>

CBLOCK       0x20
R_ContA
R_ContB
R_ContC
ENDC
   






ORG 0x00 ;vectores de reset e interrupcion
GOTO PUERTOS
ORG 0X04
RETURN

PUERTOS
  BANKSEL TRISB
CLRF TRISB ; Todos como salidas
CLRF TRISA
CLRF  TRISC
BANKSEL PORTA
CLRF PORTA
CLRF PORTC
CLRF PORTB ; A pesar que inician todos en 0 los pongo en 0 por las dudas
CLRW







BTFSC PORTA,4
CALL RUT
BTFSS PORTA,4
CALL RUT_2




CALL ENVIO

GOTO LED_1


RUT
BCF PORTB,0
BCF PORTB,1
BCF PORTB,2
BCF PORTB,3
RETURN

RUT_2
BSF PORTB,0
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
RETURN



LED_1
BSF   PORTA,0
GOTO LED_1


ENVIO
BSF PORTA,1         
CALL Delay_0   ;1
CALL Delay_0   ;1   --- 11
BCF PORTA,1         
CALL Delay_0  ;0
BSF PORTA,1
CALL Delay_0  ;1   --- 01
BCF PORTA,1
CALL Delay_0   ;0
BSF PORTA,1
CALL Delay_0   ;1   --- 01
CALL Delay_0
BCF PORTA,1
CALL Delay_0   ;0   --- 10
BSF PORTA,1
CALL Delay_0   ;1
BCF PORTA,1
CALL Delay_0   ;0   --- 10
BSF PORTA,1
CALL Delay_0   ;1
BCF PORTA,1
CALL Delay_0   ;0   --- 10
CALL Delay_0   ;0
BSF PORTA,1
CALL Delay_0   ;1   --- 01
BSF PORTA,1
CALL Delay_0   ;1
BCF PORTA,1
CALL Delay_0  ;0   --- 10
RETURN




;499994 cycles
movlw 0x03
movwf R_ContA
movlw 0x18
movwf R_ContB
movlw 0x02
movwf R_ContC
Delay_0
decfsz R_ContA, f
goto $+2
decfsz R_ContB , f
goto $+2
decfsz R_ContC, f
; goto Delay_0
return
;6 cycles
goto $+1
goto $+1
goto $+1

#INCLUDE <C:\Users\ciel\Desktop\archivos mplab\RETARDOS.INC>
end

ahi uso el retardo individual pero no se porque manda una señal tan pequeña parece solo ruido

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con una libreria
« Respuesta #12 en: 25 de Agosto de 2015, 13:18:56 »
Código: [Seleccionar]
#INCLUDE<P16F73.INC>

CBLOCK       0x20
R_ContA
R_ContB
R_ContC
ENDC
   






ORG 0x00 ;vectores de reset e interrupcion
GOTO PUERTOS
ORG 0X04
RETURN

PUERTOS
  BANKSEL TRISB
CLRF TRISB ; Todos como salidas
CLRF TRISA
CLRF  TRISC
BANKSEL PORTB
CLRF PORTA
CLRF PORTC
CLRF PORTB ; A pesar que inician todos en 0 los pongo en 0 por las dudas
CLRW







BTFSC PORTA,4
CALL RUT
BTFSS PORTA,4
CALL RUT_2




CALL MINIENVIO
CALL ENVIO

GOTO LED_1


RUT
BCF PORTB,0
BCF PORTB,1
BCF PORTB,2
BCF PORTB,3
RETURN

RUT_2
BSF PORTB,0
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
RETURN



LED_1
BSF   PORTC,0
GOTO LED_1


ENVIO
BSF PORTA,2         
CALL Retardo_05s    ;1
CALL Retardo_05s    ;1   --- 11
BCF PORTA,2         
CALL Retardo_05s   ;0
BSF PORTA,2
CALL Retardo_05s   ;1   --- 01
BCF PORTA,2
CALL Retardo_05s    ;0
BSF PORTA,2
CALL Retardo_05s    ;1   --- 01
CALL Retardo_05s
BCF PORTA,2
CALL Retardo_05s    ;0   --- 10
BSF PORTA,2
CALL Retardo_05s    ;1
BCF PORTA,2
CALL Retardo_05s    ;0   --- 10
BSF PORTA,2
CALL Retardo_05s    ;1
BCF PORTA,2
CALL Retardo_05s    ;0   --- 10
CALL Retardo_05s    ;0
BSF PORTA,2
CALL Retardo_05s    ;1   --- 01
BSF PORTA,2
CALL Retardo_05s    ;1
BCF PORTA,2
CALL Retardo_05s   ;0   --- 10
RETURN

MINIENVIO
BSF PORTA,2       
RETURN         

Retardo_05s ;499994 cycles
movlw 0x08
movwf R_ContA
movlw 0x2F
movwf R_ContB
movlw 0x03
movwf R_ContC
goto Delay_0
Delay_0
decfsz R_ContA, f
goto $+2
decfsz R_ContB , f
goto $+2
decfsz R_ContC, f
; goto Delay_0
return
;6 cycles
goto $+1
nop

#INCLUDE <C:\Users\ciel\Desktop\archivos mplab\RETARDOS.INC>
end
hola, no se porque al simular el programa no manda nada al puertoA ni tampoco al trisA, pero al b y c funciona bien no se porque

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con una libreria
« Respuesta #13 en: 25 de Agosto de 2015, 13:21:46 »
Program Memory Errors


Address    Good     Bad          Voltage
000011     002017     002016     5.000000
000013     00201c     002018     5.000000
000014     002041     002040     5.000000
000015     002023     002020     5.000000
000016     002821     000000     5.000000
000018     001086     001006     5.000000
00001a     001186     000000     5.000000
00001b     000008     000000     5.000000
00001d     001486     001406     5.000000
00001f     001586     000000     5.000000
000020     000008     000000     5.000000
 y sale este error al programar con el PM3 no se porque sale este error deberia salir program suceded y  no esto

Desconectado yair_xiox

  • PIC16
  • ***
  • Mensajes: 210
Re: ayuda con una libreria
« Respuesta #14 en: 25 de Agosto de 2015, 14:15:18 »
ya programa bien era el micro que estaba dañado y lo del porta era porque faltaban los bits del adcon1, pero no puedo usar la libreria de retardos ni tampoco un retardo individual que cree porque no funcionan no hacen nada y la señal sigue en milivoltios aun cuando solo lemando unos y ceros sin retardos al enviar el 1 deberia quedar en 5V en el osciloscopio pero no

Código: [Seleccionar]
#INCLUDE<P16F73.INC>

CBLOCK       0x20
R_ContA
R_ContB
R_ContC
ENDC
   








PUERTOS
BSF STATUS,5
BCF STATUS,6
BSF ADCON1,0
BSF ADCON1,1
BSF ADCON1,2
CLRF TRISB
CLRF TRISA
CLRF  TRISC
BCF STATUS,5
BCF STATUS,6
CLRF PORTA
CLRF PORTC
CLRF PORTB
CLRW
 







BTFSC PORTA,4
CALL RUT
BTFSS PORTA,4
CALL RUT_2




CALL MINIENVIO
; CALL ENVIO

GOTO LED_1


RUT
BCF PORTB,0
BCF PORTB,1
BCF PORTB,2
BCF PORTB,3
RETURN

RUT_2
BSF PORTB,0
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
RETURN



LED_1
BSF   PORTA,0
GOTO LED_1


ENVIO
BSF PORTA,2         
CALL Retardo_05s    ;1
CALL Retardo_05s    ;1   --- 11
BCF PORTA,2         
CALL Retardo_05s   ;0
BSF PORTA,2
CALL Retardo_05s   ;1   --- 01
BCF PORTA,2
CALL Retardo_05s    ;0
BSF PORTA,2
CALL Retardo_05s    ;1   --- 01
CALL Retardo_05s
BCF PORTA,2
CALL Retardo_05s    ;0   --- 10
BSF PORTA,2
CALL Retardo_05s    ;1
BCF PORTA,2
CALL Retardo_05s    ;0   --- 10
BSF PORTA,2
CALL Retardo_05s    ;1
BCF PORTA,2
CALL Retardo_05s    ;0   --- 10
CALL Retardo_05s    ;0
BSF PORTA,2
CALL Retardo_05s    ;1   --- 01
BSF PORTA,2
CALL Retardo_05s    ;1
BCF PORTA,2
CALL Retardo_05s   ;0   --- 10
RETURN

MINIENVIO
BSF PORTA,2
BCF PORTA,2
BSF PORTA,2
BCF PORTA,2         
RETURN         

Retardo_05s ;499994 cycles
movlw 0x08
movwf R_ContA
movlw 0x2F
movwf R_ContB
movlw 0x03
movwf R_ContC
goto Delay_0
Delay_0
decfsz R_ContA, f
goto $+2
decfsz R_ContB , f
goto $+2
decfsz R_ContC, f
; goto Delay_0
return
;6 cycles
goto $+1
nop

#INCLUDE <C:\Users\ciel\Desktop\archivos mplab\RETARDOS.INC>
end