Imitar ordenador de los cines de antes en cuanto al sonido

Iniciado por Meta, 12 Febrero 2016, 07:44 AM

0 Miembros y 1 Visitante están viendo este tema.

Lekim

#10
Cita de: Eleкtro en  1 Marzo 2016, 11:10 AM
Solo vengo a aclarar una duda que ha surgido en este post a la cual no se le ha dado una respuesta muy correcta.

Gracias Elektro por la aclaración.


Como he dicho, se usaba antiguamente. Me cito a mi mismo:

En cuanto el uso de GOTO, antiguamente en Basic se usaba muchísimo, y en tal caso no veo porqué no.  Yo tuve un ordenador Sharp que funcionaba con Basic y un Commodore64 y era bastante habitual.


Con "y en tal caso no veo porqué no"  quiero decir que para el sencillo ejemplo que he puesto y además emulando la consola retro, creo que se puede utilizar. Vamos que no creo que vaya a explotar el ordenador  :xD

Lo que interesaba es crear el efecto retro de sonido que pedía Meta (en el que el GOTO no interviene).

Solo quería aclarar eso.

Saludos.

Meta

Cita de: Eleкtro en  1 Marzo 2016, 11:10 AM
Efectivamente la utilización de la instrucción Goto es totalmente irrecomendable tanto por Microsoft en la MSDN así como de forma no-oficial en cualquier otro lenguaje que soporte Goto y por cualquier programador con los conocimientos suficientes para entender lo que su uso implica[...]

No comparto que el Goto no se recomiende en cualquier lenguaje de programación. El GOTO que se uso mucho es en ASM de los PIC. Lo usas si o si.

Código (asm) [Seleccionar]
; ZONA DE DATOS *******************************************************

LIST P=16F887
INCLUDE <P16F887.INC>
__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
__IDLOCS 0x1234

CBLOCK   0x20
TeclaPulsada ; Va a guardar el contenido de la tecla pulsada.
MensajeApuntado ; Va a guarda la dirección del mensaje apuntado.
Relays ; Estado de los relays
Estado ; Estado general
ENDC

#DEFINE PEntradasB PORTB ; Define puerto de salidas.
#DEFINE EntradaR1B 0 ; Define dónde se sitúa cada salidas.
#DEFINE EntradaR2B 1
#DEFINE EntradaR3B 2
#DEFINE EntradaR4B 3
#DEFINE EntradaR5B 4
#DEFINE EntradaR6B 5
#DEFINE EntradaR7B 6
#DEFINE EntradaR8B 7
#DEFINE PSalidasD PORTD
#DEFINE SalidaR1D 0
#DEFINE SalidaR2D 1
#DEFINE SalidaR3D 2
#DEFINE SalidaR4D 3
#DEFINE SalidaR5D 4
#DEFINE SalidaR6D 5
#DEFINE SalidaR7D 6
#DEFINE SalidaR8D 7

TECLA_RELE_1_ON EQU 'q' ; Código de las teclas utilizadas.
TECLA_RELE_1_OFF EQU 'a'
TECLA_RELE_2_ON EQU 'w'
TECLA_RELE_2_OFF EQU 's'
TECLA_RELE_3_ON EQU 'e'
TECLA_RELE_3_OFF EQU 'd'
TECLA_RELE_4_ON EQU 'r'
TECLA_RELE_4_OFF EQU 'f'
TECLA_RELE_5_ON EQU 't'
TECLA_RELE_5_OFF EQU 'g'
TECLA_RELE_6_ON EQU 'y'
TECLA_RELE_6_OFF EQU 'h'
TECLA_RELE_7_ON EQU 'u'
TECLA_RELE_7_OFF EQU 'j'
TECLA_RELE_8_ON EQU 'i'
TECLA_RELE_8_OFF EQU 'k'
TECLA_INICIO EQU 'z'
TECLA_PARADA EQU ' ' ; Código de la tecla espaciadora, (hay un espacio,
; tened cuidado al teclear el programa).
TECLA_INFO EQU 'n'

ENTER EQU 0x0A ; Código de tecla "Enter" o "Retorno de Carro".
CAMBIO_LINEA EQU 0x0D ; Código para el cambio de línea.

ORG 0x2100 ; Corresponde a la dirección 0 de la zona EEPROM
; de datos.
DE 0x00,2,3

;****************************************************************************
;* ZONA DE CODIGOS *
;****************************************************************************

;****************************************************************************
;* Rutina Principal *
;****************************************************************************

ORG 0x00
goto Inicio

ORG 4 ; Aquí se sitúa el vector de interrupción para
goto LeeEntradasVisualiza ; atender las subrutinas de interrupción.


Inicio
call LCD_Inicializa ; Inicializa el display LCD
call RS232_Inicializa ; Inicializa RS232.
bsf PEntradasB,EntradaR1B
bsf PEntradasB,EntradaR2B
bsf PEntradasB,EntradaR3B
bsf PEntradasB,EntradaR4B
bsf PEntradasB,EntradaR5B
bsf PEntradasB,EntradaR6B
bsf PEntradasB,EntradaR7B
bsf PEntradasB,EntradaR8B
bcf PSalidasD,SalidaR1D
bcf PSalidasD,SalidaR2D
bcf PSalidasD,SalidaR3D
bcf PSalidasD,SalidaR4D
bcf PSalidasD,SalidaR5D
bcf PSalidasD,SalidaR6D
bcf PSalidasD,SalidaR7D
bcf PSalidasD,SalidaR8D
BANKSEL CM1CON0
movlw b'00000111'
movwf CM1CON0
movwf CM2CON0
movwf CM2CON1           
    BANKSEL ANSEL
    clrf ANSEL
    clrf ANSELH
    BANKSEL TRISB
movlw b'11111111'
    movwf TRISB
clrw
clrf TRISD
    BANKSEL PORTD



call RS232_LineasBlanco ; Visualiza unas cuantas líneas en blanco
call RS232_LineasBlanco ; para limpiar la pantalla.
movlw b'10001000' ; Habilita la interrupción RBI y la general.
movwf INTCON

Principal ; apagadas.
sleep
goto Principal ; Loop Infinito

;****************************************************************************
;* Mensajes *
;****************************************************************************
Mensajes
addwf PCL,F
MensajeParado
DT "Sistema DESACTIVADO ", 0x00
Mensaje_Reles
DT " 1 2 3 4 5 6 7 8 RL ", 0x00
Mensaje_ON
DT " 1", 0x00
Mensaje_OFF
DT " O", 0x00
Mensaje_Cambiolinea
DT ENTER, CAMBIO_LINEA, 0x00
Mensaje_Mostrarlinea
DT "----------------", 0x00
Mensaje_Info
DT "n", 0x00
; DT "FirmWare v2.15  "
; DT ENTER, CAMBIO_LINEA
; call LCD_Linea2
; DT " PIC16F887      "
; DT ENTER, CAMBIO_LINEA
; call Retardo_2s
; call LCD_Linea1
; DT " metaconta      "
; DT ENTER, CAMBIO_LINEA
; call LCD_Linea2
; DT " @gmail.com     ", 0x00
; call Retardo_2s
Mensaje_Activar
DT "   Todos ACTIVOS    ", 0x00
Mensaje_IN
DT " IN", 0x00
Mensaje_OUT
DT " OUT", 0x00
Mensaje_Avisos
DT "***    ALARMA    ***", 0x00
MensajeEntradas
DT ENTER, CAMBIO_LINEA
DT " 1 2 3 4 5 6 7 8 IN"
DT ENTER, CAMBIO_LINEA
DT "-------------------"
DT ENTER, CAMBIO_LINEA, 0x00
FinTablaASCII





;****************************************************************************
; Interrupción
;****************************************************************************

;****************************************************************************
; Subrutina
;****************************************************************************


; btfss PEntradasC,EntradaR1C ; ¿Bit 0 del PORTA es "1"?
; goto D1_OFF
; bsf PSalidasD,SalidaR1D
; goto Principal
;D1_OFF
; bcf PSalidasD,SalidaR1D

LeeEntradasVisualiza
call RS232_LineasBlanco
movlw MensajeEntradas ; Nombre de las entradas.
call RS232_Mensaje ; Lo visualiza en el ordenador.
LeeEntrada1
btfss PEntradasB,EntradaR1B ; ¿Entrada = 1?, ¿Entrada = Abierta?
goto Entrada1Cerrado ; No, está cerrada.
bsf PSalidasD,SalidaR1D
call VisualizaAbierto1
goto LeeEntrada2
Entrada1Cerrado
bcf PSalidasD,SalidaR1D
call VisualizaCerrado1
LeeEntrada2
btfss PEntradasB,EntradaR2B ; ¿Entrada = 1?, ¿Entrada = Abierta?
goto Entrada2Cerrado ; No, está cerrada.
call VisualizaAbierto2
goto LeeEntrada3
Entrada2Cerrado
call VisualizaCerrado2
LeeEntrada3
btfss PEntradasB,EntradaR3B ; ¿Entrada = 1?, ¿Entrada = Abierta?
goto Entrada3Cerrado ; No, está cerrada.
call VisualizaAbierto3
goto LeeEntrada4
Entrada3Cerrado
call VisualizaCerrado3
LeeEntrada4
btfss PEntradasB,EntradaR4B ; ¿Entrada = 1?, ¿Entrada = Abierta?
goto Entrada4Cerrado ; No, está cerrada.
call VisualizaAbierto4
goto LeeEntrada5
Entrada4Cerrado
call VisualizaCerrado4
LeeEntrada5
btfss PEntradasB,EntradaR5B ; ¿Entrada = 1?, ¿Entrada = Abierta?
goto Entrada5Cerrado ; No, está cerrada.
call VisualizaAbierto5
goto LeeEntrada6
Entrada5Cerrado
call VisualizaCerrado5
LeeEntrada6
btfss PEntradasB,EntradaR6B ; ¿Entrada = 1?, ¿Entrada = Abierta?
goto Entrada6Cerrado ; No, está cerrada.
call VisualizaAbierto6
goto LeeEntrada7
Entrada6Cerrado
call VisualizaCerrado6
LeeEntrada7
btfss PEntradasB,EntradaR7B ; ¿Entrada = 1?, ¿Entrada = Abierta?
goto Entrada7Cerrado ; No, está cerrada.
call VisualizaAbierto7
goto LeeEntrada8
Entrada7Cerrado
call VisualizaCerrado7
LeeEntrada8
btfss PEntradasB,EntradaR8B ; ¿Entrada = 1?, ¿Entrada = Abierta?
goto Entrada8Cerrado ; No, está cerrada.
call VisualizaAbierto8
goto FinVisualiza
Entrada8Cerrado
call VisualizaCerrado8
FinVisualiza
call RS232_LineasBlanco
bcf INTCON,RBIF ; Limpia el flag de reconocimiento de la
retfie

;----------------------------------------------------------------------------------------

VisualizaAbierto1
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaAbierto2
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaAbierto3
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaAbierto4
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaAbierto5
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaAbierto6
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaAbierto7
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaAbierto8
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_ON ; Visualiza el mensaje "Abierto"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaCerrado1
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaCerrado2
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaCerrado3
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaCerrado4
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaCerrado5
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaCerrado6
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaCerrado7
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
call RS232_Mensaje ; en el HyperTerminal.
return

VisualizaCerrado8
call LCD_Linea2 ; Seleccionar la línea 2.
movlw Mensaje_OFF ; Visualiza el mensaje "Cerrado"
call RS232_Mensaje ; en el HyperTerminal.
return ; interrupción.
; ---------------------------------------------------------------------------

IF (FinTablaASCII>0xFF)
ERROR "¡CUIDADO!: La tabla ha superado el tamaño de los"
MESSG "primeros 256 bytes de memoria ROM. No funcionará correctamente."
ENDIF

INCLUDE  <RS232.INC>
INCLUDE  <RS232MEN.INC>
INCLUDE  <LCD_4BIT.INC>
INCLUDE  <LCD_MENS.INC>
INCLUDE  <RETARDOS.INC>
INCLUDE  <EEPROM.INC>
END


GOTO para asm o ensamblador de PIC, 8085, 8086, 8088 y demás, se usa obligado por el cual está diseñado así, para lenguajes de bajo nivel. Para alto nivel como explica nuestro amigo, es como dice.

Gracias por la explicación.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

#12
Cita de: Meta en  1 Marzo 2016, 14:24 PMNo comparto que el Goto no se recomiende en cualquier lenguaje de programación. El GOTO que se uso mucho es en ASM de los PIC. Lo usas si o si.

GOTO para asm o ensamblador de PIC, 8085, 8086, 8088 y demás, se usa obligado por el cual está diseñado así, para lenguajes de bajo nivel. Para alto nivel como explica nuestro amigo, es como dice.

Por supuesto, se entiende que lo que he dicho se aplica a cualquier lenguaje cuya utilización no sea obligatoria, donde no exista una alternativa en el paradigma bajo el que nos permite programar ese lenguaje.

En Batch por ejemplo también hay que utilizar Goto si o si, sería absurdo pensar que al utilizarlo en estas circunstancias es seguir malos hábitos de programación, ya que no hay elección, estamos limitados.

Como ya dije, el uso de Goto está totalmente considerado deprecado e irrecomendable desde hace décadas para todos los lenguajes de programación bajo el que nos encontremos, esto se aplica a los lenguajes actuales de alto nivel con lo s paradigmas de mayor abstracción, los lenguajes que están en continuidad, vaya, te recuerdo que ASM apareció en el año 1949, es normal pensar que FASM, MASM, Objective ASM y todos esos tengan compatibilidad con Goto y dispongan o no de una alternativa a su utilización.

Los inconvenientes del uso de GoTo se conocen desde tiempos remotos de la programación, como prueba este extracto de la declaración "Go To Statement Considered Harmful" de Edsger W. Dijkstra publicada en el año 1968:
Cita de: http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html"The unbridled use of the go to statement has as an immediate consequence that it becomes terribly hard to find a meaningful set of coordinates in which to describe the process progress. ... The go to statement as it stands is just too primitive, it is too much an invitation to make a mess of one's program."

Y algunos de los métodos propuestos en el año 1990 que nos indica la wikipedia en la documentación del paradigma de programación estructurada:
Cita de: https://en.wikipedia.org/wiki/Structured_program_theoremUp to 1990 there were quite a few proposed methods for eliminating gotos from existing program, while preserving most of their structure. The various approaches to this problem also proposed several notions of equivalence, which are stricter than simply Turing equivalence, in order to avoid output like the folk theorem discussed above. The strictness of the chosen notion of equivalence dictates the minimal set of control flow structures needed. The 1988 JACM paper by Lyle Ramshaw surveys the field up to that point, as well proposing its own method. Ramshaw's algorithm was used for example in some Java decompilers because the Java virtual machine code has branch instructions with targets expressed as offsets, but the high-level Java language only has multi-level break and continue statements. Ammarguellat (1992) proposed a transformation method that goes back to enforcing single-exit.

Esto es lo que nos aconseja la MSDN:
Cita de: https://msdn.microsoft.com/en-us/library/69whc95c.aspx"GoTo statements can make code difficult to read and maintain. Whenever possible, use a control structure instead."
( hay que entender que el artículo está escrito para todo el público, por eso debemos cambiar las palabras "Whenever possible" por "Whenever you don't know other way to do". )

Soluciones al uso del Goto en C#/Vb.Net ya las expliqué en mi comentario anterior.

Saludos!