Supongo que esto estará respondido por algún lado, pero no lo he encontrado (buscando por PIC16F876) o no he sabido encontrarlo.
El caso es que debo montar una secuencia de encendido de 16 LEDs uno tras otro con una serie de intervalos que varían según el LED a encender, para finalmente terminar con todos los LEDs encendidos.
El pin MCLR está conectado con una resistencia a V+ (+4.5 V), el pin VDD está conectado a V+ (+4.5 V) sin resistencia, y conectado a CLKIN y CLKOUT estoy utilizando un cristal de 4 MHz con dos condensadores de 22.
El programa lo obtuve de una secuencia de 8 luces a las que añadí las otras 8 que faltaban, por lo que no creo que sea el problema del propio programa. Los problemas son los siguientes:
- Al aplicar corriente al PIC para iniciar el programa automáticamente se encienden todos los LEDs y ya está, no hace nada más.
- Los pines VSS los tengo conectados entre ellos (o puedo dejarlos al aire), pero no puedo conectarlos a GND, puesto que entonces solamente se encienden la mitad de los LEDs y el PIC se calienta demasiado.
- Si conecto solamente un pin VSS a GND, dependiendo del pin conectado se encienden unos pocos LEDs con muy poca intensidad, pero en cualquier caso el pic se calienta muchísimo.
- Si no conecto los pines VSS a GND se encienden todos los LEDs a la vez y el PIC no se calienta.
El caso es que la secuencia no se ejecuta (pienso que aunque el intervalo de uno a otro fuera muy pequeño habría una diferencia de tiempo entre el encendido del primer LED y el último)
El programa en ASM es
LIST P=16F876
INCLUDE <P16F876.INC>
CONTA0 = 0X20
CONTA1 = 0X21
CONTA2 = 0X22
ORG 0
GOTO INICIO
INICIO
BSF STATUS,0
MOVLW 0X00
MOVWF TRISB
BCF STATUS,0
BSF STATUS,0
MOVLW 0X00
MOVWF TRISC
BCF STATUS,0
MOVLW B'00000001'
MOVWF PORTB
CALL RETARDO
MOVLW B'00000011'
MOVWF PORTB
CALL RETARDO
MOVLW B'00000111'
MOVWF PORTB
CALL RETARDO
MOVLW B'00001111'
MOVWF PORTB
CALL RETARDO
MOVLW B'00011111'
MOVWF PORTB
CALL RETARDO
MOVLW B'00111111'
MOVWF PORTB
CALL RETARDO
MOVLW B'01111111'
MOVWF PORTB
CALL RETARDO
MOVLW B'11111111'
MOVWF PORTB
CALL RETARDO
MOVLW B'00000001'
MOVWF PORTC
CALL RETARDO
MOVLW B'00000011'
MOVWF PORTC
CALL RETARDO
MOVLW B'00000111'
MOVWF PORTC
CALL RETARDO
MOVLW B'00001111'
MOVWF PORTC
CALL RETARDO
MOVLW B'00011111'
MOVWF PORTC
CALL RETARDO
MOVLW B'00111111'
MOVWF PORTC
CALL RETARDO
MOVLW B'01111111'
MOVWF PORTC
CALL RETARDO
MOVLW B'11111111'
MOVWF PORTC
RETARDO
MOVLW D'200'
MOVWF CONTA0
REP1 MOVLW D'200'
MOVWF CONTA1
REP2 MOVLW D'32'
MOVWF CONTA2
REP3 DECFSZ CONTA2,F
GOTO REP3
DECFSZ CONTA1,F
GOTO REP2
DECFSZ CONTA0,F
GOTO REP1
RETURN
END
Agradeceré cualquier tipo de ayuda, tanto para hacer arrancar la secuencia de LEDs como para después variar el intervalo según me interese, pues tampoco sé cuál es el actual, ya que el programa no funciona (aunque sabiendo el intervalo que hay definido en el programa supongo que sería posible variarlo llamando varias veces a la función RETARDO)