TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Steffi en 30 de Octubre de 2008, 06:32:52
-
holas a todos una semanita más! (mi tercera con esto del pic)
una vez que ya he hecho el semaforo, variando la velocidad con el ADC, y sabiendo grabar datos en la eeprom.... quiero dar un pasito más.
quiero variar la intensidad de la iluminacion de mis 3 leds del semaforo..... mediante PWM.
se teoricamente lo que es el pWM, pero no muy bien como aplicarlo. y es que mediante otro potenciómetro, quiero ir variando el ancho de pulso. osea, el duty cicle este.... jejeje
todo con el pic que tengo a mano, el 16F886.
alguna ayudita o consejo? porfaaaaaaaaaa! ahora si que me vuelvo un poco loca porque esto se me complica
gracias de antemano!
-
Hola Steffi, si pide ayuda porque nos no dice en que lenguaje?? y postea lo que tenga ya hecho.
Saludo
-
Del ADC lee el valor y lo pasas al PWM. ¿o exactamente qué es lo que quieres hacer? ¿dmx, midi show control? ¿? Recuerda que los valores del PWM no corresponden a valores visuales de tus leds. Necesitas hacer una corrección de gama. Es decir, 8 bits de PWM no corresponde a 256 niveles de "grises" en los leds.
-
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
-
Hola Steffi!
para que tenga una idea aqui te pongo un link http://www.response-box.com/rgblights/2007code.shtml aunque ese pic no lo conozco creo que solo tiene 2 pwm y para hacerlos mas simple necesita un pic con 3 pwm.
Saludo