hola stk500! quiero programarlo en ensamblador con el MPLAB. posteo mas abajo mi programita. es un semaforo con el que mediante un potenciometro cambio la velocidad y guardo en la eeprom cuantas veces a pasado por "rojo". sin más.
ahora quiero con otro potenciómetro variar la intensidad.
es para probar el modulo pwm...estoy aprendiendo nada mas. para hacerlo mas simple, puedo hacer un programa nuevo desde cero donde solo veo el cambio de intensidad del color de los leds. una pregunta que tengo, es que los leds no los puedo cambiar de pin (me los dieron soldados ya a esos que tengo puestos) y he visto que la salida del PWM está en este pic en los pines 12 o 13.... que puedo hacer?
copio aqui el programita que tengo hecho hasta ahora (todavia no tengo NADA del pwm, porque no se ni como empezar):
list P=16F886 ; indicamos el modelo de PIC que tenemos
#include "P16F886.inc"
__CONFIG _CONFIG1, _MCLRE_OFF & _PWRTE_ON & _LVP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _FCMEN_OFF & _IESO_OFF
; registros
; constantes del programa
TIEMPO equ 0x30 ; posicion de memoria
ampelstatus equ 0x31 ; para las tablas
contador equ 0x32
#define VERDE PORTC,3 ; definicion de puertos (donde se colocan los leds)
#define AMBAR PORTC,6
#define ROJO PORTB,6
#define K_TICKS_V .200 ; Temporizaciones (ciclos) para verde,ambar y rojo
#define K_TICKS_A .40
#define K_TICKS_R .140
#define adresseeprom 0xF0 ; dirección de la EEPROM donde escribimos el numero de ciclos
org 0
; Accedemos al Banco 1
bsf STATUS,RP0
; Configuración puertos
movlw 0
movwf TRISC
movlw 0x4 ; patilla RB2 cono entrada (analogica), el resto salidas
movwf TRISB
clrf ADCON1 ; Resultado ADC en el registro AdresH y los 2 bits de menor peso en AdresL
; configuracion del timer
movlw b'01010111' ; divisor preescalar = 256
movwf OPTION_REG
; Accedemos al Banco 0
bcf STATUS,RP0
;; A/D Converter
movlw b'11100001' ; ADCON0 - Frec.RC, Entrada analogica por RB2(AN8), habilitar conversion
movwf ADCON0
; Pongo a cero el puerto C
clrf PORTC
clrf contador
;***************************************************
;* Inicio Programa Sencillo utilizando Subrutina *
;***************************************************
inicio
bsf VERDE ; Semaforo en Verde
bcf AMBAR
bcf ROJO
bsf ADCON0,1 ; comienza la conversion AD
btfsc ADCON0,1 ; y espera hasta que termine (borra el bit)
goto $-1
movlw K_TICKS_V
call pausa
bcf VERDE ; Semaforo en Ambar
bsf AMBAR
bcf ROJO
bsf ADCON0,1
btfsc ADCON0,1
goto $-1
movlw K_TICKS_A
call pausa
bcf VERDE ; Semaforo en Rojo
bcf AMBAR
bsf ROJO
incf contador,1 ; contamos las veces que se ha puesto rojo
call escribir_eeprom ; y lo escribimos en la EEPROM
bsf ADCON0,1
btfsc ADCON0,1
goto $-1
movlw K_TICKS_R
call pausa
bcf VERDE ; Semaforo en Ambar-Rojo
bsf AMBAR
bsf ROJO
bsf ADCON0,1
btfsc ADCON0,1
goto $-1
movlw K_TICKS_A
call pausa
goto inicio ; vuelve a inicio
;********************************
;* Escribir Dato en la EEPROM *
;********************************
escribir_eeprom
bcf STATUS,RP0 ;Seleccionamos Banco 2
bsf STATUS,RP1
movlw adresseeprom ;Ponemos en W la dirección que vamos a escribir
movwf EEADR ;y la guardamos en EEADR
bcf STATUS,RP1 ;Seleccionamos Banco 0
movf contador,w ;Ponemos ahora el dato a escribir en W
bsf STATUS,RP1 ;Seleccionamos Banco 2
movwf EEDATA ;y lo guardamos en EEDATA
bsf STATUS,RP0 ;Seleccionamos Banco 3
bcf EECON1,EEPGD
bsf EECON1,WREN ;Colocamos el permiso de escritura (WREN) en EECON1 a 1
;Aquí da inicio la secuencia de escritura
movlw 0x55 ;Inicio de las intrucciones para EECON2
movwf EECON2
movlw 0xAA
movwf EECON2 ;Fin de las intrucciones para EECON2
bsf EECON1,WR ;Comienza la escritura propiamente dicha.
btfsc EECON1,WR ;esperar a que termine (10 ms)
goto $-1
bcf STATUS,RP0 ;cambiar a Banco 0
bcf STATUS,RP1
return
;**********************
;* RUTINA DE ESPERA *
;**********************
pausa
movwf TIEMPO ; guarda valor en memoria
otro_tic
movf ADRESH,w ; cargo el timer con el resultado de la conversión AD
movwf TMR0
sigue
clrwdt
btfss INTCON,2 ; ¿desbordamiento ? INTCON register: bit 2 = timer0 overflow
goto sigue ; no
bcf INTCON,2 ; si -> borro el flag
decfsz TIEMPO,1
goto otro_tic
return
END