Hola, antes que nada bienvenida al mundo de los Pics.
Te pasaré a explicar.
Escrito originalmente por aamoros79
Codigo:
list p=16f877 ; processor type
include "p16f876.inc"
;------------
;definiciones
;------------
TRISB equ 0x86 ; direccion TrisB RAM
PORTB equ 0x06 ; direccion PortB RAM
ADCON0 equ 0x1F ; direccion ADCON0 RAM
ADCON1 equ 0x9F ; direccion ADCON1 RAM
GO equ 0x04 ; GO = bit 2 de ADCON0 (¿tengo que definirlo?)
PIR1 equ 0x0C ; direccion PIR1 RAM
PIE1 equ 0x8C ; direccion PIE1 RAM
ADIF equ 0x04 ; ADIF = bit 6 de PIR1 (¿tengo que definirlo?)
ADIE equ 0x04 ; ADIE = bit 6 de PIE1 (¿tengo que definirlo?)
INTCON equ 0x0B ; direccion INTCON RAM (banco0)
PEIE equ 0x04 ; PEIE = bit 6 de INTCON (¿tengo que definirlo?)
GIE equ 0x04 ; GIE = bit 7 de INTCON (¿tengo que definirlo?)
Si usas el include "p16f876.inc" no te hace falta redefinir todos estos registros, y dije TODOS.
Ni siquiera el TRISB o el PORTB ya que estas redefiniendo algo que ya está definido en el .inc
Escrito originalmente por aamoros79
Codigo:
; -------------
; PROGRAM START
; -------------
Start clrf PORTB ; LIMPIA TODOS LOS BITS DE PORTB
clrf TRISB ; PORTB como Outputs
call IniciaAD ; configura modulo A/D
; & permite Interrupciones
bsf ADCON0,GO ; comienza primera conversion A/D
Main GoTo Main ; do nothing loop
;---------------------------------------------------------
; IniciaAD - inicializa e instala el hardware a/d.
; Selecion de AN0 como entrada analogica, RC clock.
; Permire interrupciones
;---------------------------------------------------------
IniciaAD movLW B"10001110" ; RA0 analog inputs(EL RESTO RAx SERAN SEÑALES I/O DIGITALES)
movWF ADCON1
movLW B"11000001" ; Select RC osc (FOSC/2), AN0 selected
movWF ADCON0 ; A/D enabled
bCF PIR1,ADIF ; Limpia A/D interrupt flag
bSF PIE1,ADIE ; Permite A/D interrupt
bSF INTCON,PEIE ; Enable peripheral interrupts
bSF INTCON,GIE ; Enable Global interrupts
RETURN ; Subroutine Return
No estas haciendo caso al tema de las páginas de memoria.
El ADCON0 está en la página 0 y el ADCON1 en la página 1.
El PIR1 está en la página 0 y el PIE1 en la página 1.
Entonces, debes indicarle al pic que redireccione a la página 1.
Cuando se resetea el PIC comienza en la página 0 de memoria de datos también (bits RP0 y RP1 del status en 0).
Esto se haría asi.
Codigo:
; -------------
; PROGRAM START
; -------------
Start clrf PORTB ; LIMPIA TODOS LOS BITS DE PORTB
clrf TRISB ; PORTB como Outputs
call IniciaAD ; configura modulo A/D
; & permite Interrupciones
bsf ADCON0,GO ; comienza primera conversion A/D
Main GoTo Main ; do nothing loop
;---------------------------------------------------------
; IniciaAD - inicializa e instala el hardware a/d.
; Selecion de AN0 como entrada analogica, RC clock.
; Permire interrupciones
;---------------------------------------------------------
IniciaAD
bsf STATUS,RP0 ; Pasar a RAM BANK #1
movlw B"10001110" ; RA0 analog inputs(EL RESTO RAx SERAN SEÑALES I/O DIGITALES)
movwf ADCON1
bcf STATUS,RP0 ; Pasar a RAM BANK #0
movlw B"11000001" ; Select RC osc (FOSC/2), AN0 selected
movwf ADCON0 ; A/D enabled
bcf PIR1,ADIF ; Limpia A/D interrupt flag
bsf STATUS,RP0 ; Pasar a RAM BANK #1
bsf PIE1,ADIE ; Permite A/D interrupt
bcf STATUS,RP0 ; Pasar a RAM BANK #0
bsf INTCON,PEIE ; Enable peripheral interrupts
bsf INTCON,GIE ; Enable Global interrupts
return ; Subroutine Return
Con eso solucionaras el problema de la configuración.
Ahora, no es necesario que actives el GIE y PEIE si no utilizarás interrupciones, pero bueno todavía te falta lo de la USART que no se como lo piensas hacer.