Programación Específica > Microcontroladores
Evaluacion De La Idea De Mi Proyecto
jgpeiro:
sip, lo se, pero de mmnto prefiero elaborar lo que mas o menos tengo en mente. una vez todo esto este realizado, si que kiero añadirle algunas cosas(como la posibilidad de almacenar y mostrar dibujitos).
Ahm, recorede una cosa que yo pense xa mi emisor de infrarrojos en su dia. Nada mas q yo lo hice con dos botones, y cuando se pulsaba uno la frecuencia era de 1Khz. Cuando se pulsaba el otro, la frecuencia era de 2Khz. Cuando se pulsaban los 2 a la vez emitia con una nueva frcuencia de 2.7Khz.
En fin, espero que este consejo te sea de utilidad
Pegasux:
http://www.geocities.com/dinceraydin/lcd/intro.htm
En esta pagina viene explicado el funcionamiento de un display 2x16, esta bien para entender como funcionan para poder programarlos con el pic. Tambien viene un simulador. Estaria bien saber tambien las diferencias que hay con un display como el del 5110, ya que los estandar tienen 14 pines y el del 5110 solo tiene 9 creo:
http://todomodding.com/forums/showthread.php?threadid=254
aqui viene una explicacion de un display del 3310, seria interesante tener disponible toda la informacion para poder trabajar con ello mas comodamente.
Saludos.
jgpeiro:
#include <p16f88.inc>
ledRreg equ 021H
ledGreg equ 022H
ledcount equ 023H
chanelreg equ 024H
ADchanel2outC equ 025H
ADchanel3outC equ 026H
ADchanel4outC equ 027H
;050H-05FH,0D0H-0DFH Accx Buffer
;060H-06FH,0E0H-0EFH Accy Buffer
init
nop
nop
nop
nop
;BuscarFlAG, ejecutar subrutina, retfie.
btfsc INTCON,TMR0IF
goto TMR0overflow
btfsc PIR1,SSPIF
goto SSPcompleteTR
btfsc PIR1,TMR2IF
goto TMR2toPR2match
btfsc PIR1,TMR1IF
goto TMR1overflow
btfsc PIR2,EEIF
goto EEPROMwritecompleted ;Internal EEPROM
CONFIGDEV ;CONFIG DEVICE(I/O PORTS, A/D, clock, SPI, IRQs,TIMERs, WDT)
;OSCILLATOR CONFIGURATIONS INTO2 8MHZ,whit I/O on RA6,RA7
bsf STATUS,RP0
movwf B'00000000'
movwf OSCTUNE
movlw B'01110010'
movwf OSCCON
bcf STATUS,RP0
;INTERRUPTS TMR0,TMR1,TMR2,SSP
bsf STATUS,RP0
movlw B'10000010'
movwf OPTION_REG
bsf STATUS,RP0
movlw B'11100000'
movwf INTCON
movlw B'00000000'
movwf PIR1
movlw B'00000000'
movwf PIR2
bsf STATUS,RP0
movlw B'00001001'
movwf PIE1
movlw B'00010000'
movwf PIE2
bcf STATUS,RP0
;I/O PORTS
;PORTA
movlw B'00000000'
movwf PORTA
bsf STATUS,RP0
movlw B'01011100'
movwf TRISA
bcf STATUS,RP0
;PORTB
movlw B'00000000'
movwf PORTB ;PORTB7-0 outputs
bsf STATUS,RP0
movlw B'00100010'
movwf TRISB
bcf STATUS,RP0
;SSP configurado en modo SPI Master
movlw B'00000000'
movwf SSPBUF ;b7-0
movlw B'00100000'
movwf SSPCON ;b7-0
bsf STATUS,RP0
movlw B'11000000'
movwf SSPSTAT ;b7-6,1
bcf STATUS,RP0
;A/D
movlw B'00000000'
movwf ADRESH ;b7-0
movlw B'01000001'
movwf ADCON0 ;b7-2,0
bsf STATUS,RP0
movlw B'0'
movwf ADRESL ;b7-0
movlw B'11000000'
movwf ADCON1 ;b7-4
movlw B'00011100'
movwf ANSEL ;b6-0
bcf STATUS,RP0
;TIMER0 MODULE
movlw B'00000000'
movwf TMR0
;TIMER1 MODULE
;TMR1L
;TMR1H
;T1CON
;TIMER2 MODULE
;TMR2
;T2CON
;PR2
;DATA EEPROM
;WDT
bsf STATUS,RP0
movlw B'00011110'
movwf WDTCON
bcf STATUS,RP0
;CCP MODULE OFF
;USART OFF
;COMPARATOR MODULE OFF
;COMPARATOR VOLTAGE REFERENCE MODULE OFF
CONFIGREGS
movlw 050H
movwf ADchanel2outC
movlw 060H
movwf ADchanel3outC
movlw B'00000100'
movwf chanelreg
movlw B'10101010'
movwf SSPBUF
movlw B'00100000'
movwf SSPCON
ledlevel
;como cambiar LedXreg desde cada subrutina?
movlw B'10101010'
movwf ledRreg
movlw B'10000000'
movwf ledGreg
movlw 0B0H
movwf ledcount
loop ;el programa inicial despues de un ReSET un configurar el uC
nop
goto loop
nop
TMR0overflow ;(interrupt);
bcf INTCON,TMR0IF
ADnoend
btfsc ADCON0,GO_DONE ;esperar en caso de q el AD no haya terminado
goto ADnoend
btfsc chanelreg,2 ;comprobar que canal se ha leido
goto ADchanel2out
btfsc chanelreg,3
goto ADchanel3out
btfsc chanelreg,4
goto ADchanel4out
ADchanel2out
bcf STATUS,RP0
movfw ADchanel2outC ;guardar los datos de la conversion en un buffer mediante indf
movwf FSR
movfw ADRESH
movwf INDF
bsf STATUS,RP0
bsf FSR,7
movfw ADRESL
movwf INDF
bcf FSR,7
bcf STATUS,RP0
incf ADchanel2outC,f
movfw ADchanel2outC
sublw 060H
btfss STATUS,Z
goto ADchanelselect
movlw 050H
movwf ADchanel2outC
;indicar que el buffer Accx(050H-05FH,0D0H-0DFH)esta completo.El buffer Accy aun le queda un dato por almacenar
goto ADchanelselect
ADchanel3out
bcf STATUS,RP0
movfw ADchanel3outC ;guardar los datos de la conversion en un buffer mediante indf
movwf FSR
movfw ADRESH
movwf INDF
bsf STATUS,RP0
bsf FSR,7
movfw ADRESL
movwf INDF
bcf FSR,7
bcf STATUS,RP0
incf ADchanel3outC,f
movfw ADchanel3outC
sublw 070H
btfss STATUS,Z
goto ADchanelselect
movlw 060H
movwf ADchanel3outC
;indicar que el buffer Accy(060H-06FH,0E0H-0EFH)esta completo. Los buffers Accx y Accy estan llenos
;desactivar interrupciones por AD?
goto ADchanelselect
ADchanel4out
;solo comprobar que las tensiones son adecuadas comparandolo con una referencia
goto ADchanelselect
ADchanelselect
;change chanel to read in next AD obtain(2,3,4)
bcf STATUS,C
rlf chanelreg,f
btfsc STATUS,C
bsf chanelreg,0
btfsc chanelreg,2
goto chanel2 ;el AccX
btfsc chanelreg,3
goto chanel3 ;el AccY
btfsc chanelreg,4
goto chanel4 ;el Vbat
movlw B'00000100'
movwf chanelreg
goto chanel2 ;;; xq es el proximo que se debe leer!!!
chanel2
movlw B'00010000' ;seleccionar canal 2 (010)
iorwf ADCON0,f
movlw B'11010111' ;seleccionar canal 2 (010)
andwf ADCON0,f
goto ADstart
chanel3
movlw B'00011000' ;seleccionar canal 3 (011)
iorwf ADCON0,f
movlw B'11011111' ;seleccionar canal 3 (011)
andwf ADCON0,f
goto ADstart
chanel4
movlw B'00100000' ;seleccionar canal 4 (100)
iorwf ADCON0,f
movlw B'11100111' ;seleccionar canal 4 (100)
andwf ADCON0,f
goto ADstart
ADstart
bsf ADCON0,GO_DONE
goto rotateLEDs
rotateLEDs
incfsz ledcount,f ;esperar varias IRQ por TMR0 para rotar los LEDs
retfie
rrf ledGreg,f ;rotar y mostar LEDGREEN
btfsc STATUS,C
bsf ledGreg,7
bcf STATUS,C
btfss ledGreg,0
bsf PORTB,6
btfsc ledGreg,0
bcf PORTB,6
rrf ledRreg,f ;rotar y mostar LEDRED
btfsc STATUS,C
bsf ledRreg,7
bcf STATUS,C
btfss ledRreg,0
bsf PORTB,7
btfsc ledRreg,0
bcf PORTB,7
movlw 0B0H
movwf ledcount
retfie ;FIN DE LA INTERRUPCION ;Datos AD obtenidos y guardados en buffer, LEDs rotados.
SSPcompleteTR
bcf PIR1,SSPIF
; subrutine
retfie
TMR2toPR2match
bcf PIR1,TMR2IF
; subrutine
retfie
TMR1overflow
bcf PIR1,TMR1IF
; subrutine
retfie
EEPROMwritecompleted
bcf PIR2,EEIF
; subrutine
retfie
END
jgpeiro:
Por fin termine 3 de las 4 rutinas para controlar el hardware, con sus interrupciones y su codigo optimizado para permitir ocupar el tiempo minimo al micro. Segun unos calclos aproximados el micro permanece libre aproximadamente un 90% del tiempo, es decir, la mayor parte del tiempo esta esperando a que se desborde un timmer o a q le devuelvan un dato del exterior.
El micro se arranca y configura los registros de todos los perifericos, busca la procendencia de las interupciones, salva y carga los registros mas importantes durante las interrupciones, lee datos analogicos de un ADXL 311 cada periodo de 3mS y toma el valormedio de cada 16 medidas. Comprueba e estado de la bateria cada 3mS. Envia datos a un LCD LPH7366 utilizando el periferico SSP y sus interrupciones, informa al usuario mediante 2 LEDs(rojo y verde) que tb van con IRQ...bueno, si alguien quiere el codigo en ASM que me lo pida, tb realice algunso cambios en el esquema, pero no son importantes. De mometo pienso eliminar el 74LVC07, el regulador de 5V y alimentar todo el circuito a 3.3V o 3.0V, pero no es nada demasiado importante....
Me queda realizar una rutina para leer y escribir en las EEPROM. Primero voy a hacer un diagrama de flujo del codigo que e escrito....en unos dias lo pondre.
jgpeiro:
aqui va el esquema del programa que e escrito en ASM, por cierto, son unas 380 instrucciones....
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa