TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: FER_CBA en 12 de Octubre de 2007, 23:24:50
-
Hola amigos, en esta ocasion los molesto porque estoy comensando a usar el pic 16F877 (no el A) y entiendo que la memoria de programa esta dividida en 4 paginas, pero no comprendo como saber cuando ocupe los 2k de memoria de una pagina para cambiar a otra, o como saber en que pagina de memoria se encuentra. Yo utilizo el assembler y el mplab.
El otro problema q tengo es el siguiente: configure el PORTA,0 como salida y el PORTA,1 como entrada, coloque un led y un pulsador respectivamente y logre q mientras tengo el boton apretado me de salida por el led, pero cuando pretendo q al pulsar temporize y aunque suelte el boton permanezca encendido el led hasta acabar el tiempo, 1 seg, no funciona. Lo extraño es q a la rutina que temporiza la llama bien mediante un call (coloque el encendido del led dentro), pero apenas suelto el pulsador se apaga, no temporiza. Pienso q puede estar relacionado con el tema anterior, q no sepa volver de la llamada. pronto voy a tratar de pegar el pedacito de programa,m ientras espero algunas guias para este problemita. muchas gracias de antemano.
PD: El micro que uso es un 16F877-20/P, y esta con un cristal de 4Mhz, esta configurado en modo XT, saben si esta bien asi, si puede usarse con ese cristal? gracias
-
Hola compañero:
Lo mejor para ayudarte de una manera mas eficiente es que coloques el programa que te da fallos y asi poder ayudarte mejor.
En cuanto a la configuracion del oscilador pienso que está correcta pues el-20/p te indica la frecuencia máxima que puedes utilizar para este micro
Fermin
-
Amigos les dejo el programita con el que intento iniciarme en el 16F877:
LIST p=16F877
#INCLUDE <P16F877.INC>
__CONFIG 3FBA
RADIX HEX
ADCON0 EQU 1FH ;Declaracion de registros
ADCON1 EQU 9FH
PORTA EQU 05H
TRISA EQU 85H
ESTATUS EQU 03H
PORTB EQU 06H
TRISB EQU 86H
PORTC EQU 07H
TRISC EQU 87H
PORTD EQU 08H
TRISD EQU 88H
ADRESH EQU 1EH
ADRESL EQU 9EH
ORG 0X00 ;Direccion de inicio tras reset
goto INICIO ;
ORG 0x04 ;Direccion de interrupcion
PDel0 equ 0x20
PDel1 equ 0x21
PDel2 equ 0x22
CounterD equ 0x23
;**************************************** INICIO ***********************************;
INICIO bcf STATUS,RP1 ;Banco 1
bsf STATUS,RP0 ;Banco 1
movlw b'10000000' ;
movwf OPTION_REG ;Configuro el registro OPTION
movlw 0x00 ;
movwf INTCON ;Configuro el registro INTCON
movwf PIE1 ;Configuro PIE1 (bit 0: habilita int de TMR0)
movwf PIE2 ;Configuro el registro PIE2
movwf ADCON0 ;Configuro el registro ADCON0
movlw b'00000110' ;
movwf ADCON1 ;Configuro el registro ADCON1
movlw b'00000010' ;
movwf TRISA ;Configuro el puerto A como salida
bcf STATUS,RP0 ;Banco 0
clrf PORTA
NO btfss PORTA,1 ;
goto NO
bsf PORTA,0
call DEMORA
bcf PORTA,0
goto NO
;-------------------------------------------------------------
; Code generated by PDEL ver 1.0 on 10/13/07 at 12:14:01 PM
; Description: Waits 5000000 cycles
;-------------------------------------------------------------
DEMORA movlw .165 ; 1 set number of repetitions (C)
movwf PDel0 ; 1 |
PLoop0 movlw .41 ; 1 set number of repetitions (B)
movwf PDel1 ; 1 |
PLoop1 movlw .147 ; 1 set number of repetitions (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 cycle delay
decfsz PDel2, 1 ; 1 + (1) is the time over? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) is the time over? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (C)
goto PLoop0 ; 2 no, loop
return ; 2+2 Done
;-------------------------------------------------------------
END