TP2 – PROGRAMACIÓN CON SALTOS LABORATORIO DE ADMINISTRACIÓN DE LOS RECURSOS PAZ MARCOLLA VALENTIN, TORRES EDEN Y NAHMOD SANTIAGO Ejercicio 1 (Saltos_05) Compara el dato del puerto de entrada PORTA con un "Numero". Tres posibilidades: Si (PORTA) = Numero se encienden todos los LEDs de salida. Si (PORTA) > Numero se activan los LEDs pares de salida. Si (PORTA) < Numero se encienden los LEDs del nibble alto y se apagan los del bajo. Solución: ;------------------------------------------------------------------------------------------------; Ejercicio 1 (Saltos_05) ; Descripción: ; Si PORTA = NUM -> PORTB = 0XFF ; Si PORTA > NUM -> PORTB = 0X55 ; Si PORTA < NUM -> PORTB = 0XF0 ; Clock Rate: 4MHz ;------------------------------------------------------------------------------------------------LIST p=PIC16F84A INCLUDE <p16F84A.inc> __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF ERRORLEVEL -302 ;------------------------------------------------------------------------------------------------NUMERO EQU 0x0A ; 10 en decimal ;------------------------------------------------------------------------------------------------ORG 0x000 goto Main ORG 0x004 retfie ;------------------------------------------------------------------------------------------------Main bsf STATUS, RP0 clrf TRISB movlw 0xFF movwf TRISA bcf STATUS, RP0 ;hasta acá es el set de puertos Loop movf PORTA, W sublw NUMERO ; NUMERO - W btfsc STATUS, Z ; NUMERO == W goto Igual btfss STATUS, C ; NUMERO < W goto Mayor ; NUMERO > W goto Menor ; si = Igual movlw 0xFF goto Setear ; si > Mayor movlw 0x55 goto Setear ; si < Menor movlw 0xF0 Setear movwf PORTB goto Loop ;------------------------------------------------------------------------------------------------END Ejercicio 2 (BCD) Ingreso de por PORTA un número, del 0 al 30, y sale por el PORTB en BCD. Si el número ingresado es 31, se apagarán todos los bits de salida. Solución: ;------------------------------------------------------------------------------------------------; Ejercicio2 (BCD_01) ; Descripción: mostrar lo ingresado por el PORTA en bcd, salvo que sea 31 ; ClockRate 4Mhz ;------------------------------------------------------------------------------------------------LIST p=PIC16F84A INCLUDE <p16F84A.inc> __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF ERRORLEVEL -302 ;------------------------------------------------------------------------------------------------CBLOCK 0x0C Dec PuertoA ENDC ;------------------------------------------------------------------------------------------------ORG 0x000 goto Main ORG 0x004 retfie ;------------------------------------------------------------------------------------------------Main bsf STATUS, RP0 clrf TRISB movlw 0xFF movwf TRISA bcf STATUS, RP0 ; set de puertos Loop movlw .0 movwf Dec ; reset de dec movf PORTA, W movwf PuertoA ; lo guardo para que no cambie en el medio sublw .31 btfsc STATUS, Z ; si es 31 goto Cero Cmp incf Dec ; Voy guardando la cantidad de decenas que hay movlw .10 subwf PuertoA btfsc STATUS, C ; Si puertoA es menor a 10 muestro ya el resultado goto Cmp Cout movlw .10 ; Le sumo los 10 que le reste a puertoA addwf PuertoA decf Dec ;siempre mostramos dec - 1 swapf Dec, W ; lo guardo en el nibble alto iorwf PuertoA, W ; lo 'concateno' en el nibble bajo goto Mostrar Cero movlw 0x00 Mostrar movwf PORTB ; copio lo movido al portB goto Loop ;------------------------------------------------------------------------------------------------- END Ejercicio 3 (Indexado_02) Controla el nivel de un depósito de líquido. Utiliza (entre paréntesis las líneas del microcontrolador a la que se han conectado): - Tres sondas detectoras: SV, Sonda de Vacío (RA0); SLL, Sonda de Llenado (RA1); SR, Sonda de Rebose (RA2). Dos bombas de agua: B1 (RB5), B2 (RB6). Cinco indicadores: Vacío (RB0), Llenándose (RB1), Lleno (RB2), Rebose (RB3), Alarma (RB4). Su funcionamiento: - Cuando ninguna de las sondas está mojada se entiende que el depósito está vacío y se accionarán las dos bombas. El indicador "Vacío" se iluminará. Cuando el nivel del líquido toque la sonda de vacío "SV" seguirá llenándose el depósito con las dos bombas. El indicador "Llenándose" se ilumina. Cuando el nivel del líquido toca la sonda de llenado "SLL", para la bomba B2, quedando B1 activada en modo mantenimiento. El indicador "Lleno" se ilumina. Si el nivel del líquido moja la sonda de rebose "SR" se apaga también la bomba B1, quedando las dos bombas fuera de servicio. El indicador "Rebose" se enciende. Cuando se produce un fallo o mal funcionamiento en las sondas de entrada (por ejemplo que se active la sonda de rebose y no active la de vacío) se paran las dos bombas. El indicador "Alarma" se ilumina. Solución: ;------------------------------------------------------------------------------------------------; Ejercicio 3 (Indexado_02) ; Descripción: Ejercicio del depósito liquido ; Clock Rate: 4MHz (XT) ;------------------------------------------------------------------------------------------------LIST p=PIC16F84A INCLUDE <P16F84A.inc> __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF ERRORLEVEL -302 ;------------------------------------------------------------------------------------------------ORG 0x00 goto Main ORG 0x004 retfie Main bsf STATUS,RP0 clrf TRISB movlw 0xff movwf TRISA bcf STATUS,RP0 Loop movf PORTA,W andlw b'00000111' ;Me quedo solo con los primeros 3 bits de PORTA addwf PCL,F ;Según corresponda a las sondas, activo los indicadores y bombas goto Vacio ;PORTA en 0 (Ninguna sonda) goto Filling ;PORTA en 1 (SV) goto Alarm ;PORTA en 2 (se activo SLL sin SV) goto Done ;PORTA en 3 (SLL) Index goto Alarm goto Alarm ;En cualquiera de estos casos, sucede que se prendió goto Alarm ;alguna sonda sin que se prenda su anterior goto Over ;PORTA en 7 (SR) movlw b'01100001' ;Se van a prender las dos bombas y el indicador de vacío (RB6,5,0) Vacio goto Activate Filling movlw b'01100010' Llenándose (RB6,5,1) goto Activate ;Siguen prendidas las bombas, se va a prender el indicador Done movlw b'00100100' lleno(RB5, 2) ;Se va a apagar la segunda bomba y se va a prender el indicador de goto Activate Over movlw b'00001000' rebose (RB3) ;Se van a apagar las dos bombas y se va a prender el indicador de goto Activate Alarm movlw b'00010000' ;Se va a prender el indicador de alarma, todo lo demás se apaga (RB4) goto Activate Activate movwf PORTB ;Se pasa lo preparado en W a PORTB goto Loop ;Vuelvo al inicio ;------------------------------------------------------------------------------------------------END Conclusiones: Para estos ejercicios utilizamos todo lo relacionado a saltos, como indexado y btsss. Hay que tener cuidado con que instrucción saltas y cual no. Por ejemplo, en el ejercicio 3, había 4 posibles inputs usando las 8 combinaciones posibles de los primeros 3 bits de PORTA, cada input tiene su output mediante salto indexado, cualquier otra combinación de bits que no sea uno de los 4 posibles inputs, activa la alarma.