TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: ELECTROSWALDO en 27 de Febrero de 2009, 23:33:38
-
Que tal, soy nuevo en el foro. Desde hace tiempo he programado pics, pero solo o principalmente el 16f84a, en ensamblador, nada de C, sin embargo estoy queriendo empezar a usar el 18f4550 y evidentemente es bastante mas complejo y completo que el 16f84a.
El problema que les traigo es el siguiente: Deseo hacer un programa de prueba para encender y apagar los bits del PORTE, esto lo he conseguido de la siguiente manera:
.
.
.
ciclo
clrf PORTE
call Retardo_1s ;RETARDO DE UN SEGUNDO POR BUCLES DE CICLOS DE PROGRAMA
setf PORTE
call Retardo_1s ;RETARDO DE UN SEGUNDO POR BUCLES DE CICLOS DE PROGRAMA
goto ciclo
END
sin embargo estoy "caminando a tientas" con este pic y quiero ver que funcione bit por bit, asi que lo hice de esta manera:
.
.
.
ciclo
bcf PORTE,0
bcf PORTE,1
bcf PORTE,2
call Retardo_1s
bsf PORTE,0
bsf PORTE,1
bsf PORTE,2
call Retardo_1s
goto ciclo
END
Pero de esta manera NO FUNCIONA, solo parpadea el bit PORTE,0 pero los otros no parpadean, solo parpadean si volteo el led y lo conecto de Vcc al PORTE,1 o PORTE,2 (en lugar del pin a tierra que es lo comun), eso quiere decir segun yo que el PORTE si esta mandando el pulso BAJO pero no el pulso alto, tal vez sea de colector abierto... yo supongo que talvez tenga que ver con resistencias pull-up pero no encuentro en el datasheet algo que me diga como habilitarlas o deshabilitarlas (si las tiene internamente el PORTE).
Hice la prueba y le conecte resistencias pull-up externas y los led si parpadean pero el pic empieza a hacer feo pues el pulso alto programado para durar 1 seg dura a veces 2seg :shock: y a veces un seg.
MI NO ENTENDER NI MAIZ...
Este problema no pasa con el PORTB que es el unico que si se porta bien con migo :D.
Lo mismo me pasaba con un 16f917 pero ya no le segui para empezar con el 18f4550 el cual hace lo mismo :x
Bueno espero su respuesta amigos, seguro estoy haciendo algo muy muy mal pero no se que es, por cierto, les dejo el programa completo(la mayor parte la obtuve de estos utiles foros):
;**********************************************
;Programa de Prueba para el 18f4550, usa un XT de 4Mhz pero ejecuta las
;instrucciones a 48MHz
;---------------------------------------------------------------
LIST P=18F4550 ;directive to define processor
#include <P18F4550.INC> ;processor specific variable definitions
CONFIG FOSC = XTPLL_XT, PLLDIV = 1,CPUDIV = OSC1_PLL2,USBDIV = 2,PWRT = ON,BOR = ON, VREGEN = OFF
CONFIG WDT = OFF ,WDTPS = 1,MCLRE = ON,PBADEN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
CBLOCK 0x30
ENDC
org 0
goto inicionumero1
inicionumero1
clrf TRISA ; configuar el port como salida ¡que bueno!, no hay que estar cambiando de bancos ;-)
clrf TRISB ; el resto -> salida
clrf TRISC
clrf TRISD
clrf TRISE
;------------------------------------------------------
; ahora viene la deshabilitación de modulos (pheriperals)
;**********************************************
clrf ADCON0 ; desactiva el CAD
movlw 0x0F
movwf ADCON1 ; todas digitales
bcf INTCON,GIE ; desactiva interrupciones
movlw 0x07
movwf CMCON ;desactiva el modulo comparador
clrf SPPCON ; desactiva el modulo Streaming Parallel Port (SPP)
clrf SSPCON1 ; desactiva el modulo MSSP,SSPEN
bcf UCON,USBEN ; desactiva el modulo USB
bsf INTCON2,RBPU ; desactiva las resistencias de amarre en PORTB
;===================================
; Empieza el PROGRAMA (basicamente lo unico que hice yo)
;--------------------------------------------------------------
enclava
bsf PORTB,7
BSF PORTE,0
BSF PORTE,1
BSF PORTE,2
call Retardo_1s
BCF PORTE,0
BCF PORTE,1
BCF PORTE,2
BCF PORTB,7
call Retardo_1s
goto enclava
include<RETARDOS_18F4550_48MHz.INC> ;Libreria de retardos para un 18f4550
END
SALUDOS CORDIALES
-
El port E es un poco cabron como el port A de los 628.
Mira la hoja de datos, me parece que comparte algo con el port D.
El bsf es para poner un bit a 1.
EL setf es para poner 1 byte a FF (o sea todos 1)
-
El port E es un poco cabron como el port A de los 628.
Mira la hoja de datos, me parece que comparte algo con el port D.
El bsf es para poner un bit a 1.
EL setf es para poner 1 byte a FF (o sea todos 1)
Ok, si entiendo que bsf es para un bit y setf es para byte, la pregunta iba en sentido de porque el programa jala bien con las instrucciones clrf y setf y no jala con las instrucciones bcf y bsf que se supone que practicamente hacen lo mismo en el programa(solo que pongo a 0ó1 bit por bit).
Bueno ya busque en la hoja de datos... me pase la noche y no di con el problema, por eso decidi empezar a usar este foro. Pero igual voy a seguir buscando en la hoja de datos como me suguieres... y sí recuerdo algo del PORTD ¿o lo soñe? porque ya estaba medio dormido je je.
SALUDOS
-
Por cierto gracias por responder tan rapido pibe, igual si tienes o tiene alguien algo que me heche la mano se los agradezco mucho, si que cuesta un poquitin pasar del 16f84a al 18f4550 pero emociona aprender algo nuevo y mejor :-/
-
Lo acabo de simular por el Proteus y me va de muerte :mrgreen: Mi no comprender porque no furularte a usted. :D
LIST P=18F4550 ;directive to define processor
#include <P18F4550.INC> ;processor specific variable definitions
CONFIG FOSC = XTPLL_XT, PLLDIV = 1,CPUDIV = OSC1_PLL2,USBDIV = 2,PWRT = ON,BOR = ON, VREGEN = OFF
CONFIG WDT = OFF ,WDTPS = 1,MCLRE = ON,PBADEN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
CBLOCK 0x30
PDel0
PDel1
PDel2
ENDC
org 0
goto inicionumero1
inicionumero1
clrf TRISA ; configuar el port como salida ¡que bueno!, no hay que estar cambiando de bancos wink
clrf TRISB ; el resto -> salida
clrf TRISC
clrf TRISD
clrf TRISE
;------------------------------------------------------
; ahora viene la deshabilitación de modulos (pheriperals)
;**********************************************
clrf ADCON0 ; desactiva el CAD
movlw 0x0F
movwf ADCON1 ; todas digitales
bcf INTCON,GIE ; desactiva interrupciones
movlw 0x07
movwf CMCON ;desactiva el modulo comparador
clrf SPPCON ; desactiva el modulo Streaming Parallel Port (SPP)
clrf SSPCON1 ; desactiva el modulo MSSP,SSPEN
bcf UCON,USBEN ; desactiva el modulo USB
bsf INTCON2,RBPU ; desactiva las resistencias de amarre en PORTB
;===================================
; Empieza el PROGRAMA (basicamente lo unico que hice yo)
;--------------------------------------------------------------
enclava
bsf PORTB,7
BSF PORTE,0
BSF PORTE,1
BSF PORTE,2
call DEMORA
BCF PORTE,0
BCF PORTE,1
BCF PORTE,2
BCF PORTB,7
call DEMORA
goto enclava
DEMORA movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END
-
Hola, perdon pero no entiendo que significa "furularte"... ¿es funcionarte?... digo para que lo anexe y enriquezca mi lexico de picmaniaco.
Bueno, respecto al programa no lo he probado en ningun simulador. Donde no funciona es en la vida real, ya copie y pege el programa que posteaste pero hace lo mismo, solo que el tiempo es menor. voy a ver si puedo subir un dibujo para ilustrar lo que pasa (ya que soy nuevo en este foraso):
(http://imagen1.jpg)
(http://imagen2.jpg)
(http://imagen3.jpg)
Bueno, los leds no parpadean cuando se conectan del PORTE,X a Tierra, solo si los volteo y los conecto de VCC al PORTE,X, lo cual supongo quiere decir que el PORTE,1 y 2 conducen a tierra (tiempo bajo) y se ponen a Z en lo que deberia ser el tiempo alto. Lo raro es que oscilan bien cuando las instrucciones usadas son CLRF y SETF pero nada que jalan con BCF y BSF. no se si me explico...
Por cierto, el PORTB,7 (el unico que no me da problemas)solo lo conecto y lo hago oscilar junto con los otros nomas pa checar que el pic si jale, es como mi muestra de control je je.
oh! como sufro, de haber sabido ni nazco.
-
Prueba con LATE en lugar de PORTE a ver que tal. Segun el datasheet con LATE no interesa si lo has configurado o no como entrada analógica.
La verdad que no he tenido mayores problemas con el porte.
-
Hola Pibe, le puse una resistencia a los leds y ya jalo bien el PORTE, lo meti a un buffer y jalo tambien jalo bien, parece que el PORTE es muy sentimental con eso de las corrientes.
Pero de todas formas me parece raro porque el PORTE jala perfecto con o sin resistencia y con o sin buffer con la instruccion SETF y no jala con BSF a menos que le ponga una R (330)...¿como puede ser una diferencia de corrientes con cambiar instrucciones?... ¿o estoy malentendiendo algun concepto por ahi?.
Bueno, dejo ese detalle talvez a alguien mas le pueda ayudar, segun esta experiencia hay que ponerle siempre sus respectivas R de 330. Por cierto voy a probar con LATE en lugar de PORTE y reporto resultados.
-
:shock: Yo daba por hecho que le ponías resistencias! :shock:
Que loco.... :mrgreen:
-
Pues si ya probe con LATE y hace lo mismo que con PORTE, y bueno pues el problema parece que eran las resistencias, aunque sigue siendo algo curioso como solo por cambiar la instruccion parece cambiar la corriente. Talvez por eso el 16F84A es numero uno en la enseñanza porque es aprueba de... "·$%"&&das.
Bueno a ver cuando vuelvo a molestarles por aqui otravez :lol: