Hola gente de todopic, he de acudir otra vez a la sabiduria del foro por culpa de un programa en ensamblador que no me funciona, lo he comentado con los profesor de sistemas digitales microprogramables y no me ha sabido decir el error. Los comentarios del programa estan en catalan, espero que esto no resulte ningun problema.
Os comento rapidamente como es el circuito
De RA0 a RA3 van conectados a un BCD a 7 segmentos.
RA4, el pulsador, con un condensador en paralelo con la resistencia para eliminar los rebotes.
RB1 esta conectado al EN1 del LM293B y RB2 es la salida de pwm que va conectara a la patilla IN1 del 293.
El programa tiene que hacer lo siguiente:
Cada vez que se pulsa el pulsador el motor aumenta un 20% su rendimento,y en el display marca el estado actual del motor, si es 20% sale un, si es 40%sale un 4 y asi succesivamente, si pulsas despues del 100% se apaga el motor.
El problema es el siguiente, cuando simulo en proteus el programa lo hace del tiron, sin tener en cuenta si se pulsa o no el pulsador y el display no enciende, las patillas del 4511 cambian de estado, con lo que no entiendo porque no se enciende. Ahi va el codigo:
Codigo:
;***************CONTROL DE MOTORS DE CORRENT CONTINUA AMB PWM******************
;
;El programa s"encarrega de controlar el dendiment de 2 motors de
;corrent continua de la següent manera: Cada vegada que s"apreta un
;pulsador el motor augmenta un 20% el seu rendiment, quan aquest
;arriba al 100%, si es torna a pulsar, el motor es para. Per
;saber el rendiment del motor en tot moment, el sistema incorpora 2
;diaplays de 7 segments, un per cada motor. Si el motor esta al 20%
;el display marcara 2, si esta a 40% marcara 4 i aixi successivament,
;en el moment que arribi al 100% marcara un 1.
;
; RENDIMENT SEMIPERIODE ALT SEMIPERIODE BAIX
; --------- --------------- ----------------
; 0% 0 ms 10 ms
; 20% 2 ms 8 ms
; 40% 4 ms 6 ms
; 60% 6 ms 4 ms
; 80% 8 ms 2 ms
; 100% 10 ms 0 ms
;
;ZONA DE DADES*****************************************************************
LIST P=16F84 ;el ucontrolador usat
INCLUDE <P16F84.INC> ;arxiu de definició de registres
;ZONA DE CODIS*****************************************************************
ORG 0 ;el programa comença a la direcció 0
Inici
bsf STATUS,RP0 ;accès al banc 1
movlw b"10000" ;RA0:RA3 = sortides RA4 = entrada
movwf TRISA
movlw b"00000001" ;RB0 = entrada, els altres son sortides
movwf TRISB
bcf STATUS,RP0 ;accès al banc 0
Test
btfss PORTA,4 ;testeja RA4
goto PWM20_1D ;si =0 va a PWM20_1
;btfss PORTB,0 ;testeja RB0
;goto PWM20_2D ;si =0 va a PWM20_2
goto Test ;va a Test
PWM20_1D
bcf PORTA,0
bcf PORTA,1 ;posa a 0 el 1 dsplay
bcf PORTA,2
bcf PORTA,3
movlw b"00010"
movwf PORTA ;mostra un 2 al display
bsf PORTB,1 ;activa EN1
PWM20_1
bsf PORTB,2 ;envia un nibell alt a RB2
call Retardo_2ms ;durant 2ms
bcf PORTB,2 ;envia un nivell baix a RB2
call Retardo_5ms
call Retardo_2ms ;durant 8ms
call Retardo_1ms
btfss PORTA,4 ;testeja RA4
goto PWM40_1D ;si=0 va a PWM40_1D
goto PWM20_1 ;si=1 va a PWM20_1
PWM40_1D
bcf PORTA,0
bcf PORTA,1 ;posa a 0 el primer display
bcf PORTA,2
bcf PORTA,3
bcf PORTB,2 ;deixa d"emetre pulsos
movlw b"00100" ;posa a 1 RA2
movwf PORTA ;mostra el resulat al display
PWM40_1
bsf PORTB,2 ;posa a nivell alt RB2
call Retardo_2ms
call Retardo_2ms ;durant 4ms
bcf PORTB,2 ;posa RB2 a nivell baix
call Retardo_5ms
call Retardo_1ms ;durant 6ms
btfss PORTA,4 ;testeja RA4
goto PWM60_1D ;va a PWM60_1D
goto PWM40_1 ;va a PWM40_1
PWM60_1D
bcf PORTA,0
bcf PORTA,1 ;posa a 0 el primer display
bcf PORTA,2
bcf PORTA,3
bcf PORTB,2 ;deixa d"emetre pulsos
movlw b"00101" ;posa a nivell alt RA0 i RA3
movwf PORTA ;mostra un 6 en el display.
PWM60_1
bsf PORTB,2 ;posa a nivell alt RB2
call Retardo_5ms
call Retardo_1ms ;durant 6ms
bcf PORTB,2 ;posa a nivell baix RB2
call Retardo_2ms
call Retardo_2ms ;durant 4ms
btfss PORTA,4 ;testeja RA4
goto PWM80_1D ;va a PWM80_1D
goto PWM60_1 ;va a PWM60_1
PWM80_1D
bcf PORTA,0
bcf PORTA,1 ;posa a 0 el primer display
bcf PORTA,2
bcf PORTA,3
bcf PORTB,2 ;deixa d"emetre pulsos
movlw b"01000" ;posa a nivell alt RA3
movwf PORTA ;mostra un 8 al display
PWM80_1
bsf PORTB,2 ;posa a nivell alt RB2
call Retardo_5ms
call Retardo_2ms ;durant 8ms
call Retardo_1ms
bcf PORTB,2 ;posa a nivell baix RB2
call Retardo_2ms ;durant 2ms
btfss PORTA,4 ;testeja RA4
goto PWM100_1D ;va a PWM100_1D
goto PWM80_1 ;va a PWM80_1
PWM100_1D
bcf PORTA,0
bcf PORTA,1 ;posa a 0 el primer display
bcf PORTA,2
bcf PORTA,3
bcf PORTB,2 ;deixa d"emetre pulsos
movlw b"00001" ;posa a 1 RA0
movwf PORTA ;mostra un 1 al display
PWM100_1
bsf PORTB,2 ;envia un puls de durada indefinida per RB2
btfss PORTA,4 ;testeja RA4
goto Motor1_off ;va a Motor1_off
goto PWM100_1 ;va a PWM100_1
Motor1_off
bcf PORTA,0 ;posa a 0 el display
bcf PORTA,1
bcf PORTA,2
bcf PORTA,3
bcf PORTB,2 ;deixa d"emetre pulsos
goto Test ;va a test
INCLUDE <RETARDOS.INC>
END
Aprobecho para decir que este seguramente sera mi ultimo programa en asm ya que me paso a C porque en el insti nos den programacion en C.
Saludos y gracias de antemano.