TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: - TuX - en 18 de Junio de 2008, 16:52:49
-
Hola, tengo un problema, lo que pasa es que estoy programando el timer/counter 1 en modo PWM, en asm y el micro es el AT90S8535, estou usando los 2 canales, el OC1A y el OC1B, meto lo valores al OC1AL, y al OCR1BL, y activo el PWM, llega una combinacion al PINB, activo la interrupcion INT0 y dependiendo de la combinacion se modifican los valores OC1xL.
El problema es que solo el canal 2 del pwm funciona (OC1B) el OC1A no funciona y la verdad no se porque, si los 2 los configure igual, me comentaron que es porque el pin en donde esta el OC1A, como es parte del puerto D tiene doble funcion, y que debo activar la funcion del pwm, pero no se como hacerlo. por eso les pido ayuda, dejo el codigo que tengo, para que vean que estoy haciendo:
.include "8515def.inc"
;*****************************************
.org $000 ; Inicio
rjmp Reset
.org $001 ;Interrupcion externa
rjmp INTE
.def PARAR = r20
.def INICIAR = r21
.def MOTOR1 = r22
.def MOTOR2 = r23
;*****************************************
Reset:
;*****************************************
cli ; Descativa Interrupciones Globales
;*****************************************
; Stak Pointer
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, low(RAMEND)
out SPL, r16
;*******************************************
;Configuracion del vector 0x001 INT0
ldi r16, 0b00000010
out MCUCR, r16
ldi r16, 0b01000000
out GIMSK, r16; Interrupcion Habilitada
;*******************************************
;Canal 1 Del PWM ;MOTOR 1
ldi r17, 0xFD ; Valor De OCR1A L
out OCR1AL, r17
;*****************************************
; Canal 2 Del PWM MOTOR 2
ldi r17, 0xFD ; Valor De OCR1B L
out OCR1BL, r17
;*****************************************
; Configuracion de PWM
ldi r17, 0b10100000 ;Resolucion de 8 bits
out TCCR1A, r17
;Configuracion De CLK
ldi r17, 0b00000010
out TCCR1B, r17
;****************************************
;Configuracion De Puertos
clr r17
out DDRB, r17 ;Puerto B Como Entrada
ser r17
out DDRA, r17 ;Puerto A Como Salidoa
;****************************************
ldi PARAR, 0b10100000
ldi INICIAR, 0b10100001
sei ;Activa Interrupciones Globales
INICIO:
nop
rjmp INICIO
;*************************************
;Interrupcion INT0
INTE:
in r18, PINB
cpi r18, 0x00
breq DETENER
cpi r18, 0b00000001
breq ADELANTE
cpi r18, 0b00000010
breq DERECHA
cpi r18, 0b00000011
breq IZQUIERDA
cpi r18, 0b00000100
breq REVERSA
cpi r18, 0b00000101
breq R_DERECHA
cpi r18, 0b00000110
breq R_IZQUIERDA
cpi r18, 0b00000111
breq AUMENTAR
cpi r18, 0b00001000
breq DISMINUIR
reti
DETENER:
;PWM APAGADO
out TCCR1A, PARAR
reti
ADELANTE:
;Configuracion de PULSO
ldi MOTOR1, 0xFD
ldi MOTOR2, 0xFD
out OCR1AL, MOTOR1
out OCR1BL, MOTOR2
;PWM habilitado
out TCCR1A, INICIAR
reti
DERECHA:
;Configuracion De Pulso
ldi MOTOR1, 0xFD
ldi MOTOR2, 0x7E
out OCR1AL, MOTOR1
out OCR1BL, MOTOR2
;PWM habilitado
out TCCR1A, INICIAR
reti
IZQUIERDA:
ldi MOTOR1, 0x7E
ldi MOTOR2, 0xFD
out OCR1AL, MOTOR1
out OCR1BL, MOTOR2
;PWM habilitado
out TCCR1A, INICIAR
reti
REVERSA:
reti
R_DERECHA:
reti
R_IZQUIERDA:
reti
AUMENTAR:
reti
DISMINUIR:
reti
-
Hola TuX
Te recomiendo bajar el programita CodeVisionAVR, no digo que lo uses para programar todo y tener que aprender un lenguaje nuevo, pero tiene un Wizard muy util, que te aseguro que ayuda bastante a entender el modo en que se deben programar los registros para hacer tal o cual cosa.
Por ejemplo, una vez que seleccionas el Timer, el modo PWM, los puertos de salida, frecuencia, etc, etc, te muestra cómo debes configurar los registros, y santo remedio.
Probalo y luego nos cuentas cómo te fué.
:-)
-
Aqui te dejo la hoja de aplicacion http://www.atmel.com/dyn/resources/prod_documents/doc2542.pdf
y de aqui puede bajar un codigo ejemplo http://www.avrfreaks.net/index.php?module=Freaks%20Tools&func=viewItem&item_id=498
comentanos todos tus errores por favor para que nosotros aprendamos.
Saludo
-
gracias a los 2, ya lo resolvi, como el oc1a no es un pin especifico de esa fincion, tenia que configurarlo como salida, lo raro es que ya lo habia hecho y no funciono, pero ahora ya esta listo.
Si, tambien quiero aprendes a usar C, ya se programar en C pero en la PC, voy a buscar un buen manual de esa libreria
Saludos