Mostrando entradas con la etiqueta Artículos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Artículos. Mostrar todas las entradas

jueves, 28 de noviembre de 2013

Electrónica de Andar por Casa, Artículo 8: Fuentes de alimentación (II)

Artículo publicado en el número 7 de RetroWiki Magazine

FUENTES DE ALIMENTACION II

En el anterior artículo vimos las dos primeras partes de una fuente de alimentación, el transformador y el rectificador, seguimos con las fuentes en esta entrada.


3 - Filtrado


Tras la rectificación, tenemos una señal contínua positiva, pero pulsante, ya sea con media onda o con onda completa. El objetivo es filtrar el máximo de ondulación de la señal en esta fase, para que en la regulación se obtenga una señal contínua de buena calidad. Muchas fuentes económicas no disponen de regulador, muchos de nuestros equipos, como los Spectrum o las consolas de Sega externamente tienen los tres primeros pasos, dejando la regulación para el interior de la máquina. 

El elemento que necesitamos para el filtro es un condensador, cuando recibe corriente en la parte de subida de la onda la almacena en su interior, y cuando la corriente baja libera lo almacenado, de esta forma se consigue mantener una corriente contante en la salida


Vemos en azul la corriente tras el condensador, y en rojo punteado la del regulador, cuando sube la corriente el condensador de carga, cuando baja se descarga poco a poco, hasta que el nivel de la corriente es igual al restante en el condensador, luego vuelve a subir. Con esto no tenemos una salida plana perfecta, pero si muy poco ondulada, contra mayor sea el condensador menos ondulada será la señal.

4 - REGULADOR

Una vez disponemo de una señal mas o menos adecuada, lo siguiente es usar un regulador que nos proporcione el voltaje que necesitamos, lo mas estable posible. Para ello este tipo de fuentes lineales lo que hacen es partir de un voltaje superior, y bajarlo al que buscamos, de esta forma se aseguran de que hay una corriente suficiente en la entrada para proporcionar una salida estable.

El mas sencillo es usando un diodo Zenner, que tiene la particularad de que el voltaje en su salida es siempre el mismo, mientras en su entrada tenga un voltaje igual o superior. Vemos como el voltaje de entrada se aplica a una resistencia, y el diodo Zenner entre su salida y masa estabilizará su salida, manteniendo la cirriente contante en el voltaje Zenner del diodo. Estos diodos se compran para un voltaje determinado.


Este tipo es muy sencillo, pero admite poca corriente, por ello se usa un sistema en el que el diodo pilota un transistor, que compara el voltaje de la entrada desde el diodo con el que tenemos en la salida del filtro, y se justa la corriente para que coincida (esta esplicación es muy de andar por casa, pero es suficiente). En el esquema vemos que la corriente de entrada se ubica en el colector del transistor, su base la pilota el diodo Zenner, y la salida es el voltaje regulado.

Podemos emplear una mejora importante, en lugar del Zenner ubicamos una referencia de tensión, un circuito mas preciso que solo el diodo, y si en lugar del transistor directamente ubicamos entre ambos un comparador, que compare el voltaje de la entrada con el voltaje del zenner, y en su salida nos de la regulación a aplicar, que pilotará el transistor. Esto ya nos complica mas el diseño, y no voy a entrar en mas detalles, con que se entienda esto es suficiente en este nivel, pero tenemos la ventaja de que se venden estos montajes ya listo para funcionar, por lo que usaremos un regulador encapsulado para nuestra fuente, que proporciona mejor regulación, estabilidad, protección contra sobretensión y sobrecalentamiento. 

Hay varios chips que hacen esto, pero la serie 78XX es la mas usada. Solo debemos reemplazar XX por el voltaje que deseemos en la salida, y tendremos un regulador de ese voltaje con un solo componente, por ejemplo nuestras máquinas usan en general un regulador 7805, para proporcionar los 5 voltios en la salida, solo debe tener por lo menos 1’5 voltios mas de los que vamos a regular, por lo que la salida del filtro debe proporcionar por lo menos 6’5 voltios o mas, aunque usualmente se usan de 9 a 12 voltios.



De los tres pines, el de la izquierda es la entrada de corriente, el central es la masa, y el de la derecha es la salida. Para mejorar la estabilidad y el filtrado de la corriente, se suelen añadir unos condensadores en la entrada y la salida, usando este esquema:

Seguiremos en la próxima entrada con el esquema completo de la fuente para poder montarnos una en casa de forma económica.


José Antonio Vaqué Urbaneja, podeis
contactar conmigo en mi mail

martes, 26 de noviembre de 2013

Introducción a la programación usando BASIC (VII): CONTANTES, READ/DATA/RESTORE

Artículo publicado en el número 7 de RetroWiki Magazine

CONTANTES, READ/DATA/RESTORE

Una constante es un valor que no cambiará a lo largo de la ejecución del programa, en BASIC no existe la definición de constantes, pero se pueden simular usando variables. Pongo un ejemplo de un conversor de grados a radianes, para lo que usaremos el valor de PI, y luego guardaremos el valor de la relación entre grados y radianes. Una vez calculados estos valores, no cambiarán ya en el resto del programa:


10 REM Constantes 
20 LET PI=3.1416 
30 LET RD=180/PI 
40 INPUT "Valor en grados: ",G 
50 IF (G=0) THEN STOP 
60 LET R=G/RD 
70 PRINT G;" grados son ";R;" radianes" 
80 PRINT



En BASIC existe otro mecanismo para definir valores que no cambian a lo largo de la ejecución, la instrucción DATA permite acceso secuencial a datos, es una especie de almacén en el que almacenar cosas, con la limitación de que solo se pueden ver de una en una y una tras otra.

Ejemplo sencillo, pedimos una fecha y la imprimimos en formato texto con el nombre del mes en lugar de su número:

100 REM IMPRESION DE FECHAS
110 INPUT "Dia: ";D
120 IF (D=0) THEN STOP
130 IF (D<1 or="">31) THEN PRINT "Dia no valido" : GOTO 110
140 INPUT "Mes: ";M
150 IF (M=0) THEN STOP
160 IF (M<1 or="">31) THEN PRINT "Mes no valido" : GOTO 140
170 INPUT "Año: ";A
180 IF (A=0) THEN STOP
190 LET M$=""
200 RESTORE 400
210 FOR I=1 TO M
220   READ M$
230 NEXT I
240 PRINT : PRINT "Fecha: ";D; " de ";M$;" de ";A
250 PRINT : PRINT
260 GOTO 110
400 DATA "Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto"
410 DATA "Septiembre","Octubre","Noviembre","Diciembre"


El programa pide primero día, mes y año, si se deja a cero cualquiera el programa termina, si se introduce un día o mes fuera de rango también termina. Luego pone en blanco la variable m$ (ojo, existe una variable llamada m y otra llamada m$, son diferentes y no tienen nada que ver entre sí, lo he hecho así para que se vea claramente este tema). Llama a la instrucción RESTORE, que vuelve a poner a cero el contador interno para los DATA, lee el número de meses indicado en la variable m el data correspondiente, la primera vez que pasa por el bucle lee “Enero”, la segunda vez lee “Febrero”, y así sucesivamente. El resultado de la ejecución del programa es este:


Pensemos que lo vamos a hacer multi formato o multi idioma, es muy sencillo el cambio, ya que la instrucción RESTORE tiene como opción la línea a partir de la cual empezamos a leer datos, por lo que solos necesario tener dos secuencias de DATA

100 REM IMPRESION DE FECHAS 
110 INPUT "Dia: ";D 
120 IF (D=0) THEN STOP 
130 IF (D<1) OR (D>31) THEN PRINT "Dia no válido" : GOTO 110
140 INPUT "Mes: ";M 
150 IF (M=0) THEN STOP 
160 IF (M<1) OR (M>31) THEN PRINT "Mes no válido" : GOTO 140
170 INPUT "Año: ";A 
180 IF (A=0) THEN STOP 
190 INPUT "Formato (C/L): ",F$ 
200 IF (F$="l") THEN F$="L" 
210 IF (F$="c") THEN F$="C" 
211 IF (F$<>"L") AND (F$<>"C") THEN PRINT "Formato no válido" : GOTO 190 
220 REM Proceso ------------------------------- 
230 LET M$="" 
240 IF (F$="L") THEN RESTORE 400 
241 IF (F$="C") THEN RESTORE 420 
250 FOR I=1 TO
260   READ M$ 
270 NEXT
280 PRINT : PRINT "Fecha: ";D; " de ";M$;" de ";A 
290 PRINT : PRINT 
300 GOTO 110 
310 REM Datos ------------------------------- 
400 DATA "Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto" 
410 DATA "Septiembre","Octubre","Noviembre","Diciembre" 
420 DATA "Ene","Feb","Mar","Abr","May","Jun" 430 DATA "Jul","Ago","Sep","Oct","Nov","Dic"


Este programa es muy similar al anterior, solo que pide una variable adicional con el tipo de formato, la pone en mayúsculas para evitar comparaciones, y según su valor usa una u otra línea de DATA 




Avanzamos con el BASIC, ir probando cosas de los DATA, que ofrecen un mecanismo sencillo para almacenar cosas en el propio programa.

 Jose Antonio Vaqué Urbaneja, podéis
contactar conmigo en mi mail

martes, 19 de noviembre de 2013

El sonido en 8 bits (VI): Sonido en el C64 (II)

Artículo publicado en el número 7 de RetroWiki Magazine

El sonido en un Commodore 64 (II)

Seguimos con el sonido en los Commodore 64, las envolventes de sonido nos permiten modificar el volumen del sonido

El generador de envolvente

Cuando una nota musical sube de volumen, a la velocidad con que lo hace se le denomina ataque (ATTACK). Cuando baja de volumen a la velocidad se le denomina caída (DECAY), si la nota baja hasta cero se le denomina liberación (RELEASE). Si la nota se mantiene durante el tiempo se le denomina sostenido (SUSTAIN). Esto lo ejemplarizamos en esta gráfica, y se les denomina como conjunto por sus siglas en inglés ADSR.

Para cada una de las tres voces se utilizan dos registros de 8 bits para controlar los parámetros ADSR , 5 y 6 para la voz 1 , 12 y 13 para la voz 2 y 19 y 20 para la voz 3. El primer registro de cada pareja controla ataque y caída, y el segundo liberación y sostenido, cada parámetro por tanto usa 4 bits, y puede usar valores por tanto entre cero y 15. A los primeros cuatro bits se les denominan Altos, y a los segundos Bajos, y hay que combinarlos para obtener el parámetro a usar, siendo los altos para caída y liberación y los bajos para ataque y sostenido. La forma más sencilla es sumar los valores del (valor Alto * 16) + (Valor Bajo), así por ejemplo si el valor del Ataque es 4 y el de caída 8, el valor a usar sería 8*16 + 4 = 132.

10 FOR L=54272 TO 54296:POKE L,0:NEXT Limpia el SID
20 POKE 54296,15 Ajusta volumen máximo
30 POKE 54277,64 Establece ataque/caida
40 POKE 54273,162:POKE 54272,37 Nota en la voz 1
50 PRINT "PUSA UNA TECLA" Mensaje en pantalla
60 GET K$:IF K$="" THEN 60 Mira el teclado
70 POKE 54276,17:FOR T=1 TO 200:NEXT Forma de onda triangular
80 POKE 54276,16:FOR T=1 TO 50:NEXT Para la nota
90 GOTO 50 Repite la ejecución


En la línea 30 se establece la tasa de ATTACK/DECAY, ponemos ataque a cuatro y caída a cero, por tanto 4*16+0=64. Podemos jugar con los valores de la línea 30 para ver cómo afecta al volumen de la nota que está sonando. Lo mismo se puede hacer con el sostenido y liberación, por ejemplo añadiendo esta línea al programa:

35 POKE 54278,128

Esta tabla puede servirnos para establecer los valores de los 4 parámetros en cuatro niveles sin necesidad de calcular, solo suma el valor de Ataque y Caída deseado para el primer parámetro, y sumar los valores de Sostenido y liberado deseados para el segundo parámetro.

Alto Medio Bajo Muy bajo Alto Medio Bajo Muy bajo
Ataque Ataque Ataque Ataque Caída Caída Caída Caída
Sostenido Sostenido Sostenido Sostenido Liberado Liberado Liberado Liberado
128 64 32 16 8 4 2 1

FILTRADO

Para ajustar el timbre de las notas se utilizan los filtros, son los más difíciles de ajustar, pero se puede hacer que nuestro C64 suene como cualquier instrumento musical ajustando los filtros. Existen tres filtros a usar, ajustan un nivel de señal para cortar las otras:

  • Filtro de paso alto. Este filtro reduce el nivel de las frecuencias inferiores a la frecuencia de corte especificada. Pasan todas las frecuencias iguales o superiores al punto de corte, mientras que reduce las frecuencias por debajo del corte.
  • Filtro de paso bajo. Al contrario, este filtro deja pasar las frecuencias por debajo del corte y reduce las superiores al corte.
  • Filtro paso banda. Este filtro deja pasar una banda estrecha de frecuencias en torno al corte y reduce el nivel de todas las demás.
  • Un filtro adicional llamado filtro de rechazo, que es el contrario al de paso banda, puede sintetizarse combinando los filtros de paso alto y bajo.
El registro 24 permite indicar el uso de los filtros, y también se usa en el control de volumen, por lo que hay que sumar ambos valores. Los bits a usar son:

      BIT Uso
      4 Selecciona el uso del filtro de paso bajo (valor 8)
      5 Selecciona el uso del filtro de paso banda (valor 16)
      6 Selecciona el uso del filtro de paso alto (valor 32)

Para activar los filtros se usa el registro 24 del SID, solo se puede activar un filtro a la vez, usando un valor  de 0 a 15 para cada uno, para usarlo se usan estos bits:

      BIT Uso
      7-4 Valor de resonancia del filtro (valor 0 a 15 multiplicado por 16)
      3 Entrada externa del valor del filtro (valor 8)
      2 Activar el filtro para la voz 3 (valor 4)
      1 Activar el filtro para la voz 2 (valor 2)
      0 Activar el filtro para la voz 1 (valor 1)


La frecuencia de corte es un número de once bits, por lo que su valro oscilará entre 0 y 2047. Los ocho bits superiores (11 al 3) se almacenan en el registro 22, mientras que los tres bits más bajos (2 al 0) se almacenan en el registro 21. Añadiremos al programa anterior líneas que nos permite probar los valores de los filtros:

10 FOR L=54272 TO 54296:POKE L,0:NEXT      Limpia el SID
20 POKE 54296,15 Ajusta volumen máximo
30 POKE S+24,31 volumen total + filtro paso bajo
35 POKE S+23,1 filtro de voz 1
37 POKE S+22,128:POKE S+21,7 frecuencia de corte
40 POKE 54273,162:POKE 54272,37 Nota en la voz 1
50 PRINT"PUSA UNA TECLA" Mensaje en pantalla
60 GET K$:IF K$="" THEN 60 Mira el teclado
70 POKE 54276,17:FOR T=1 TO 200:NEXT Forma de onda triangular
80 POKE 54276,16:FOR T=1 TO 50:NEXT Para la nota
90 GOTO 50 Repite la ejecución


Hasta aquí el manejo del sonido de nuestros C64 desde su Basic, con esto completamos el repaso de la forma de sacar el sonido de los principales sistemas de 8 bits, Spectrum, Amstrad, MSX y C64.

 Jose Antonio Vaqué Urbaneja, podéis
contactar conmigo en mi mail

martes, 8 de octubre de 2013

El sonido en 8 bits (V): El C64


Artículo publicado en el número 6 de RetroWiki Magazine

El sonido en un Commodore 64

El Commodore 64 disponía de un chip gráfico denominado VIC-II, y un chip de sonido denominado SID (Sound Interface Device),que le permitía generar un sonido de alta calidad, disponiendo de 3 generadores de sonido independientes, este chip además era rápido procesando sonidos, por lo que a pesar de una CPU relativamente lenta, la capacidad sonora del C64 siempre ha sido muy elogiada, permitiendo por ejemplo ejecutar sonido durante la lenta carga de los juegos.

El sonido en el Commodore 64

El chip SID proporciona tres canales configurables de sonido para generar no solo las típicas ondas cuadradas, sino que podía generar también triangulares, de diente de sierra y ruido blanco por cualquiera de sus canales, potenciado por filtros de paso y resonancia configurables, por lo que podía generar una variedad de sonidos mucho mayor que los AY, disponía de una serie de registros de entrada, en los que se introducían los valores a reproducir, por lo que era sencillo cargarlos y mientras el chip ejecutaba los comandos, el procesador principal podía seguir haciendo otras cosas. El chip se desarrolló en un tiempo record, con muchas prisas, por lo que tenía algunos fallos, y en los últimos modelos se cambió el chip de sonido por el nuevo 8580, incluido en los Commodore C64-C, C64-G, ALDI y la Consola Commodore 64, este chip producía un sonido más limpio, pero no era capaz de reproducir igual de bien los sonidos digitalizados del SID.

"Sonido desde BASIC

Desde el BASIC no existían instrucciones específicas para manejar el sonido, pero como el C64 utiliza la técnica de periféricos mapeados en memoria, mediante la llamada a la instrucción POKE, que pone en la posición de memoria indicada un valor, se pueden introducir los comandos que activan el sonido. Podemos controlar así 5 grupos de datos relacionados con el sonido, Frecuencia, Volumen, Múltiples voces, Formas de onda y elGenerador de envolvente (ataque, caída, sostenido, liberado).
El chip SID dispone de 29 registros de 8 bits numerados del 0 al 28, cada uno es responsable de un determinado componente de la generación del sonido, aunque principalmente se usan solo 25. En el mapa de memoria están ubicados a partir de la posición 54272.  Esta tabla nos indica para que se utiliza cada registro:
Nro. Posición Uso
0 a 6 54272 a 54278 Control del primer canal de sonido
7 a 13 54279 a 54285 Control del segundo canal de sonido
14 a 20 54286 a 54292 Control del tercer canal de sonido
21 54293 Frecuencia baja
22 54294 Frecuencia alta
23 54295
24 54296 Control de volumen y filtros
25 54297
26 54298
27 54299
28 54300

Este ejemplo está sacado del manual de usuario del C64, y nos permite probar como generar sonidos diversos en el aparato:

100 S=54272
110 FOR L=S TO S+24:POKE L,0:NEXT: REM INICIALIZA EL CHIP
120 POKE S+5,9:POKE S+6,0
130 POKE S+24,15: REM AJUSTA EL VOLUMEN
140 READ HF,LF,DR
150 IF HF<0 THEN END
160 POKE S+1,HF:POKE S,LF
170 POKE S+4,33
180 FOR T=1 TO DR:NEXT
190 POKE S+4,32:FOR T=1 TO 50:NEXT
200 GOTO 140
210 DATA 25,177,250,28,214,250
220 DATA 25,177,250,25,177,250
230 DATA 25,177,125,28,214,125
240 DATA 32,94,750,25,177,250
250 DATA 28,214,250,19,63,250
260 DATA 19,63,250,19,63,250
270 DATA 21,154,63,24,63,63
280 DATA 25,177,250,24,63,125
290 DATA 19,63,250,-1,-1,-1

La línea 100 guarda en S la dirección base del SID, para acceder a los registros solo hay que sumarle el número del registro a S. La línea 110 inicializa el chip, poniendo todos los registros a cero. Las líneas 120 a 130 inicializan el volumen. Las líneas 140 a 170 leen un grupo de 3 valores hasta que sean -1 en cuyo momento paran, y lo establecen en el canal 1 para ajustar el sonido a emitir. La línea 180 es una pausa, la 190 activa otra vez el sonido, y en la 200 volvemos al bucle de lectura.

Control de Volumen

Para controlar el volumen hay que escribir en el registro 24.El C64 dispone16 niveles de volumen, entre 0 (apagado) y 15 (máximo), afectando siempre a los 3 canales a la vez. La línea 30 del programa de ejemplo establece el nivel de volumen al máximo (15).
Voces

El C64 dispone de tres canales de sonido separados, pudiendo atacarse cada uno de forma independiente, el sonido resultante es la suma de los tres canales. Por cada canal, la nota se especifica por su frecuencia y la duración en milisegundos, usando 16bits para ello, por tanto hay que dividirlos en dos registros de 8 bits para enviarlas al chip. Se usan 7 registros para cada canal:

Canal 1 Canal 2 Canal 3 Descripción
0 7 14 Parte baja de la frecuencia a generar
1 8 15 Parte alta de la frecuencia a generar
2 9 16 Parte baja del ancho del pulso
3 10 17 Parte alta del ancho del pulso
4 11 18 Registro de control de forma de onda
5 12 19 Control de ataque y caída
6 13 20 Control de sostenido y retenido


Frecuencias

Para hacer sonar una nota, se pasa el valor de 16 bits de su frecuencia a dos registros de 8 bits, y se envían al chip. Cada canal puede usar una frecuencia diferente a la vez. La línea 160 del ejemplo establece la nota del canal 1. Para calcular los valores usaremos estos tres comandos:

F = FRECUENCIA / .06097 : HI = INT ( F / 256 ) : LO = F - (256 * HI)

Le pasamos en la variable FRECUENCIA le valor a generar, y disponemos el valor a introducir en los dos registros en las variables HI (parte alta) LO (parte baja).

Formas de onda

El tipo determina el timbre del sonido a producir, siendo el primer chip que permitía su control. Existen cuatro formas de onda posibles a generar:
  • Triángular. Esta forma de onda contiene pocos armónicos y un suave sonido de flauta.

  • En diente de sierra: Esta forma de onda contiene todos los armónicos. Tiene una calidad brillante y directa.

  • Cuadrada: Es una onda de pulso variable. Cambiar el ancho del pulso produce sonidos que van desde un sonido brillante, uno hueco o uno nasal

  • Ruido Blanco: Esta forma de onda se utiliza principalmente para efectos de sonido como explosiones o disparos, y oscila entre un retumbar bajo a un silbido.



Para establecer la forma de onda se usa el registro de control, cada bit del mismo tiene un uso diferente:

BIT DESCRIPTION
0 Disparo
1-3 No se usa
4 Onda triangular
5 Onda en diente de sierra
6 Onda cuadrada
7 Ruido blanco

El bit de disparo controla el generador de envolvente, cuando está a 1 se activa. Los bits 4 a 7 establecen la forma de onda del canal, y se pueden activar varios a la vez. La línea 170 del programa de ejemplo establece la forma de onda a diente de sierra.
Seguiremos en el próximo artículo con el resto de controles, pero por ahora ya podéis probar a generar sonidos en vuestro C64.

Jose Antonio Vaqué Urbaneja, podéis contactar
conmigo en mi mail para cualquier duda que tengais

viernes, 4 de octubre de 2013

Introducción a la programación usando BASIC (VI): BUCLES ANIDADOS


Artículo publicado en el número 6 de RetroWiki Magazine

BUCLES ANIDADOS.

Los bucles FOR son sencillos de usar, y podemos anidar unos dentro de otros sin problemas, para crear estructuras que recorran varias variables a la vez. Como primer ejemplo muy sencillo crearé un programa que imprime las tablas de multiplicar:

10 PRINT "Tablas de multiplicar"
20 FOR I=1 TO 9
30 PRINT "Tabla del ";I
40 FOR J=1 TO 10
50 PRINT " ";I;"x";J;"=";I*J
60 NEXT J
70 PRINT
80 NEXT I

Vemos que recorremos en I desde 1, imprimimos la cabecera de la tabla, luego recorremos J desde 1 hasta 10, imprimimos la tabla multiplicando I por J, aumentamos I en uno, y volvemos a empezar con la cabecera y recorriendo J de 1 a 10, y así hasta que I alcance 9. Para mejorar la lectura, los bucles se indentan, y así es más sencillo leer el programa, así que lo reescribo de esta manera:
10 PRINT "Tablas de multiplicar"
20 FOR I=1 TO 9
30    PRINT "Tabla del ";I
40    FOR J=1 TO 10
50       PRINT " ";I;"x";J;"=";I*J
60    NEXT J
70 PRINT
80 NEXT I


El programa es el mismo, pero así es más sencillo leerlo. Lo importante es que se entienda que el bucle interno, el que recorre J, siempre empieza en 1 cada vez que llega a la instrucción FOR, es un concepto que suele costar de entender a los principiantes.

El resultado de la ejecución del programa no es muy bonito, ya que imprime 100 líneas en la pantalla:



Lo mejoraremos, imprimiendo varias tablas en horizontal, así caben más a la vez en la pantalla, para ello usaremos la instrucción STEP del bucle:
100 PRINT "Tablas de multiplicar"
110 LET C=5
120 FOR I=1 TO 9 STEP C
130    GOSUB 210
140    FOR J=1 TO 10
150       GOSUB 270
160    NEXT J
170    PRINT
180 NEXT I
190 IF (INKEY$="") THEN GOTO 190
200 STOP
210 REM ----- Imprimir la cabecera -------------------------
220 LET A=80/C
230 FOR K=1 TO C
240    PRINT TAB(A*(K-1)); "Tabla del ";I+(K-1);
250 NEXT K
260 RETURN
270 REM ----- Imprimir la linea ----------------------------
280 PRINT
290 LET A=80/C
300 FOR K=0 TO C-1
310    PRINT TAB(A*K); I+K;"x";J;"=";(I+K)*J;
320 NEXT K
330 RETURN


Empezamos definiendo en C las columnas que deseamos tener en la pantalla, para que quepan en una sola usaremos 5 columnas, pero podéis jugar con esta variable y ver las diferencias. Luego un bucle de 1 a 9 de C en C, imprimimos la cabecera con GOSUB 210, luego un bucle de 1 a 10 e imprimimos las líneas con otro GOSUB 270. No es necesario hacer esta separación, pero el programa queda más compacto y legible, además de que podemos cambiar de manera sencilla la parte de la cabecera o de las líneas, debéis pensar en hacer los programas lo más modulares posibles, es una buena técnica de programación.

Para imprimir la cabecera dividimos el ancho de la pantalla (80 columnas) entre las tablas que vamos a imprimir, así tenemos el ancho de cada tabla (80/5=16). Montamos un bucle desde 1 hasta las columnas a montar, e imprimimos las cabeceras, para ello usaremos I que nos da la base, y K-1 para recorrer desde 0 hasta 4, así tendremos I+0, I+1, I+2, I+3, I+4.

Para imprimir las líneas usamos lo mismo, pero recorremos el bucle desde 0 hasta 4 directamente, y así no tenemos que ir restando uno cada vez. Ambos sistemas son equivalentes, podéis usar el que más os guste o el que mas claro veais.

Ahora el resultado es mejor caben 10 tablas en una sola pantalla, pero ojo, ¿el bucle no era de 1 hasta 9?, pues sí pero realmente recorre I haciendo igual a 1 y hace el primer ciclo de 5 tablas, 1+5=6 y hace el segundo ciclo de 5 tablas, y luego 6+5=11 y salimos del bucle por pasarnos de 9, por tanto realmente solo recorre dos valores al usar un STEP (1 y 6), no los 9 indicados, o los 10 que se imprimem, esto lo he puesto así para que se entienda mejor su uso. Probar con varios valores de C y lo entenderéis mejor.



Adelante, escribir el programa, mejorarlo, probar cosas, solo se aprende a programar programando, por tanto no dejéis de buscar problemas sencillos de programación y solucionarlos con nuestro querido BASIC.



Jose Antonio Vaqué Urbaneja,
podéis contactar conmigo en mi mail

lunes, 30 de septiembre de 2013

Electrónica de Andar por Casa, Artículo 7: Fuentes de alimentación (I)

Artículo publicado en el número 6 de RetroWiki Magazine

 

FUENTES DE ALIMENTACION (I)


Vamos a ver cómo funciona una fuente de alimentación, que es algo que necesitan todos los aparatos que utilizamos, y nos permitirá efectuar algunos arreglos básicos. Actualmente se usan fuentes conmutadas, mucho más eficientes, pero como los aparatos que usamos son antiguos, se usan en casi todos fuentes lineales, menos eficientes pero más sencillas de entender. Nuestros aparatos usan principalmente 5 voltios en continua, aunque se usan otros voltajes como +12, -12 o -5 voltios. Para obtenerlos se parte de los 220Voltios en alterna de los enchufes (en España, o de los 110Voltios en algunos paises), por lo que hay que pasar por una serie de fases:





Cada aparato tiene una parte en su interior y otra fuera, por ejemplo la NES o el Dragón solo tienen el transformador externo, el Spectrum tiene hasta el filtro externo, y los MSX suelen llevar todo en su interior. Además hay aparatos que usan varias corrientes a la vez, como el C64 que se alimenta externamente con 9v en alterna por un lado con un transformador, y por otro lado 5 voltios en continua para lo que incluye hasta el regulador externo. Vamos a ver una sencilla fuente de alimentación que nos proporcione 5 voltios y 1 amperios en continua filtrados y regulados.

1 - TRANSFORMADOR


El primer paso es convertir los 220V (o 110V en otros países) en  un voltaje más bajo, el regulador necesita normalmente 2 voltios más de los que va a regular para su funcionamiento,  por lo que necesitamos 7 voltios o más, lo usual es entre 9 y 12 voltios. Para ello usaremos un transformador de 9 voltios 1 amperio,  con entrada a 200V en alterna nos proporciona 9V en alterna en su salida. Al ser corriente alterna, el voltaje efectivo que nos proporcionará realmente será el producto del voltaje de salida por raíz de dos 1’4142), por tanto el voltaje real serán 9Voltios, y el efectivo serán 12’7 voltios, más que suficiente para nuestra fuente.


En el esquema vemos que en la entrada hay una onda de corriente alterna, y en la salida la misma onda, pero de menos altura. No están a escala, la salida es 25 veces menor que la entrada.

2 – CONVERSOR A CONTINUA


La siguiente etapa convierte la alterna en continua, para lo que usaremos diodos, que solo dejan pasar la corriente en un sentido. Hay dos formas generales de conectarlos, en forma de media onda o en onda completa.

El rectificador de media onda es sencillo, se usan dos diodos, uno en cada línea de salida (realmente se puede usar uno solo en cualquiera de las dos líneas), su función es dejar pasar solo la parte positiva de la corriente, cortando la negativa, como vemos en el siguiente gráfico:


En los puntos verdes está la salida del transformador, y en los rojos los de salida de los diodos, debajo vemos la forma de onda en dichos puntos. Como vemos disponemos de una corriente pulsante, pero solo positiva siempre, eliminando la semionda negativa. Esto es suficiente para convertir la alterna en continua, pero hay otro sistema mejor usando cuatro diodos, el llamado rectificador de onda completa:

Durante la parte positiva del ciclo, dos diodos conducen normalmente como en el rectificador de media onda, pero durante la parte negativa estos dos diodos cortan la corriente, pero los otros dos, montados en sentido inverso, si que dejan pasar la corriente pero cambiando las líneas, por lo que siempre hay una onda positiva en la salida. Lógicamente este tipo de rectificador es más eficiente, aunque más caro al usar el doble de diodos. Hay una variante con solo dos diodos, pero usa un transformador con toma central.

Este tipo de rectificador es tan usado, que se vende con los cuatro diodos encapsulados en un chip, denominado puente rectificador,  con dos patas para la entrada de alterna, y dos patas para las salidas positiva y negativa. Ya sea con cuatro diodos o con el puente de diodos, es el sistema preferido en nuestros retro aparatos.

Seguiremos en la próxima entrada con las otras dos fases de la fuente y pondré el esquema completo para poder montarnos una.



Jose Antonio Vaqué Urbaneja,
podéis contactar conmigo en mi mail

domingo, 30 de diciembre de 2012

El sonido en 8 bits (IV): En los MSX

Artículo publicado en el número 5 de RetroWiki Magazine


El estándar MSX1 definía una máquina con el típico chip de sonido de General Instrument, el AY-3-8910, lo que se mejoró mínimamente en el MSX2, se aumentó en los  MSX2, llegando al máximo en los Tubo-R. En su versión del Microsoft Basic incluyeron una forma muy sencilla de usar para hacer música. En su versión del Basic para los MSX1, Microsoft incluyó tres instrucciones de manejo del sonido, que daban todo el control del chip al usuario. 

El sonido en los MSX
El estándar original de los MSX definía el uso de un chip generador de sonido programable (PSG) de General Instrument, el AY-3-8910, que proporciona tres canales configurables de sonido para generar ondas cuadradas y ruido blanco, con dos puertos de entrada/salida para su gestión. Como cada fabricante podía implementar sus máquinas con muchas opciones, la mayoría de los MSX1 solo disponían de salida de sonido mono a través del televisor, solo algunos permitían salida estéreo desde un conector trasero. 

En los MSX2 no se mejoró mucho la capacidad de generar sonido, ya que usaba el chip de Yamaha YM2149 que es compatible con el AY-3-8910, pero todas las implementaciones ya tenían mono o estéreo por la tele, y siempre estéreo por un conector de salida. El MSX2+ mantenía el sistema, añadiendo opcionalmente un segundo chip de sonido Yamaha YM2413, que proporcionaba síntesis musical de 1 instrumento entre 15 posibles, que también fue muy usado en cartuchos de ampliación.  El TURBO-R cambiaba todo el sistema, mejorando los chips usados y añadiendo MIDI, pero muy pocas máquinas lo usaron.

Sonido desde BASIC

Para producir sonido desde el BASIC hay tres formas, usando BEEP, SOUND o PLAY, cada una tiene una forma diferente de enviar los comandos.

La forma mas sencilla es usar BEEP, que hace un sonido fijo de duración establecida, es un pitido sencillo en el altavoz, y se usa mucho antes de una interacción con el usuario para avisarle:

10 BEEP
20 INPUT “Introduzca un valor: “;A$


La orden SOUND permite enviar a los registros internos del chip los valores que se deseen, por lo que hay completo control del sonido, a costa de necesitar conocer perfectamente como trabaja el chip. La sintaxis es: SOUND registro, valor
  • Registro: indica el registro que se desea modificar. Los AY-3-8910 disponían de 16 registros de 8 bits, algunos usados de dos en dos para conseguir valores de 16 bits, pero no todos admitían cualquier valor: 
    • 0 y 1: En los 12 bits se establece la frecuencia para el canal A, el 0 es el byte bajo (0-255) y el 1 el medio byte alto (0-15), pudiendo manejar 4096 tonos. Para enviar un sonido, por ejemplo de 1456, hay que calcular:
      • Byte alto: parte entera del valor dividido entre 256 -&gt; |1456/256|=5 
      • Byte bajo: el valor menos el byte alto por 256 -&gt; 1456-(5*256)=176
    • 2 y 3: Lo mismo para el canal B. 
    • 4 y 5: Lo mismo para el canal C .
    • 6: En 5 bits el tono del canal de sonido blanco. 
    • 7: En 6 bits que canales se activan a la vez, será la suma de los valores deseados entre los siguiente, así si queremos que suenen a la vez A y C, y por el A añadir ruido blanco, sería 1+4+8=13:
      •    1: Canal A
      •    2: Canal B
      •    4: Canal C-Sonido Blanco)
      •    8: Ruido blanco en el canal A
      •  16: Ruido blanco en el canal B
      •  32: Ruido blanco en el canal C
    • 8, 9 y 10: Volumen del canal A, B o C respectivamente, entre 0 (mínimo) y 15 (máximo), pero siempre hay que sumarle 16 para activar el registro.
    • 11, 12: Frecuencia del patrón de envolvente del sonido, 11 byte bajo y 12 byte alto.
    • 13: Modo del patrón del envolvente de volumen, con valores que se sumen entre:  1 para activar Hold, 2 para activar Alternate, 4 para activar Attack, 8 para activar Continue (ver el artículo sobre los Amtrad para entender mejor los envolventes).
    • 14 y 15: No se usan para el sonido, son los valores de los puertos de entrada/salida del chip
  • Valor: es el valor a guardar en el registro, dependiendo de los bits que pueda recoger cada uno.
Esta forma de ejecutar sonido nos da todo el control sobre el chip generador de sonido, pero es más compleja de manejar. Un ejemplo con el canal de sonido blanco:

10 SOUND 6,0
20 SOUND 7,55
30 SOUND 8,16
40 SOUND 11,23
50 SOUND 12,2
60 SOUND 13,9

Como esta forma de manejarlo es mas compleja, hay una segunda forma de hacerlo mucho mas sencilla, que nos permite hacerlo incluso a los que no sabemos casi nada de música, con la orden PLAY, que tiene esa sintaxis: PLAY [EA] [,EB][,EC] en donde EA, EB y EC son tres cadenas de caracteres con las notas que se desea hacer sonar en los canales A, B y C respectivamente. Solo es obligatorio indicar una de las tres cadenas, y se componen de notas y variaciones de sonido, pudiendo usar cualquiera de estos comandos sin separaciones entre ellos (lo que dificulta un tanto la lectura):
  • Notas Musicales: Se indican mediante una letra o una “N” seguida de un número de una o dos cifras, y al igual que en un piano de una octava, se usa la escala cromática en lugar de la natural, con los semitonos usando sostenidos (añadiendo “#” o “+”) y bemoles (añadiendo “-“), y al igual que en un piano de una sola octava no están permitidos B# (Do de la siguiente octava), C- (Si de la anterior octava), E# (Fa), F- (Mi):
    •     Do        N36, C
    •     Do#      N37, C#, C+, D-
    •     Re        N38, D
    •     Re#      N39, D#, D+, E-
    •     Mi        N40, E
    •     Fa        N41, F
    •     Fa#      N42, F#, F+,G-
    •     Sol       N43, G
    •     Sol#     N44, G#, G+, A-
    •     La        N45, A
    •     La#      N46, A, A+, B-
    •     Si         N47, B   
  • Octava: Si no se indica nada se entiende la octava natural (la cuarta), si se desea usar otra octava se indica con al expresión “On” antes de la nota, donde n es el número de la octava de 1 a 8. Así O2B es el Si de la segunda octava. Si se usa la notación numérica, no es necesario, solo hay que usar el número mas o menos 12 veces la octava a usar, así el Do en las 8 octavas sería O1C=1,  O2C=12, O3C=24, O4C=36, O5C=48, O6C=60, O7C=72, O8C=84
  • Duración de la nota: Se indica usando “L” mas la duración entre 1 y 64, siendo L1=redonda y el resto la fracción 1/n del tiempo, así L2=blanca (1/2), L4=negra (1/4), L8=corchea (1/8), etc. Si solo queremos que afecte a una nota, lo pondremos justo después de su símbolo, Así A16 es una La semicorchea, y E4F es Mi negra Fa redonda, mientras que L4EF es Mi negra Fa negra.
  • Silencios: Se indican mediante “R” seguido de la duración, igual que la de una nota, así R1 es silencio de redonda y R8 silencio de corchea.
  • Puntillo: El símbolo “.” extiende la nota o silencio por 3/2 de su valor.
  • Tempo: Se usa “T” seguida de un número entre 32 y 255, indicando la duración base de una blanca. Si no se indica nada se asume T120.
  • Volumen: Se usa “V” seguida de un número entre 0 y 15 para indicar el volumen del canal.
  • Envolvente: Para manejarlo se usan “S” seguida de un número entre 0 y 15, para indicar la forma de la envolvente, y “M” seguida de un número entre 0 y 65535 para el periodo de la envolvente.
  • Uso de variables: Si se desea usar el contenido de una variable numérica en lugar de cualquier argumento numérico (no para notas), se puede usar en lugar de un número la expresión “=” mas el nombre de la variable mas “;”, así si disponemos de una variable llamada A y otra llamada B, podemos usar “BBO=A;T=B;”.

Un ejemplo sacado de un manual, en el que se presenta una melodía en tono de rock, o eso ponen en el libro:

10 A$=”T230O3EG#BO4C#DC#O3BG#”
20 B$=”T230O3AO4C#EF#GF#EC#”
30 C$=”T230O3BO4D#F#G#AG#F#D#”
40 PLAY A$ : PLAY A$ : PLAY B$
50 PLAY A$ : PLAY C$ : PLAY B$
60 GOTO 40

Este sistema de producir sonido es muy sencillo para que cualquiera pueda transcribir una partitura en su MSX.


Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en mi mail o ver más cosas en mi blog

sábado, 29 de diciembre de 2012

Introducción a la programación usando BASIC (V): FOR y GOSUB


Artículo publicado en el número 5 de RetroWiki Magazine

BUCLES y SUBRUTINAS.

En este artículos presento los bucles y el manejo de las subrutinas, con esto simplificamos el manejo del control del programa, sin usar tantas sentencias GOTO.

BUCLES FOR

Una vez hemos repasado las sentencias IF y GOTO, que son las básicas para el manejo del programa, en esta entrada veremos dos que nos simplificarán su manejo, haciendo que el propio programa realice el control.

Un bucle es un trozo del programa que se ejecuta repetidamente, al final del bucle una sentencia GOTO nos retorna al principio, y en cualquier momento podemos salir de él usando otros GOTO. Vamos a hacer un bucle que nos calcule el factorial de un número, sabemos que el factorial de un número (que se marca con el símbolo de admiración) es el producto de los números entre 1 y el número que estamos calculando, así el factorial de 5 es:
5! = 5.4.3.2.1 = 120


100 REM --------------------------------------------------------
110 REM - Calculo de factoriales, JAVaqué‚ 2012                -
120 REM --------------------------------------------------------
130 CLS: INPUT "Número: ";N              :REM Pedimos el número mero
140 IF (N>=0) THEN GOTO 170             :REM No para negativos
150 PRINT "ERROR: No se puede calcular el factorial de un negativo"
160 GOTO 240                            :REM Ir al final
170 LET R=1                             :REM R será el resultado
180 IF (N=0) THEN GOTO 230              :REM El factorial de 0 es uno
190 LET S=1                             :REM En S lo que multiplicamos
200 LET R=S*R                           :REM Multiplicamos anterior
210 LET S=S+1                           :REM Sumamos 1 al número
220 IF (S<=N) THEN GOTO 200             :REM Mientras no sea mayor
230 PRINT ,N;"! = ";R                   :REM El resultado
240 PRINT : PRINT                       :REM Dejamos línea en blanco
250 INPUT "¿Otro? (S/N): ";O$           :REM Preguntamos si seguimos
260 PRINT : PRINT                       :REM Dejamos línea en blanco
270 IF (O$="S") OR (O$="s") GOTO 130    :REM Si es si seguimos
280 IF (O$="N") OR (O$="n") GOTO 310    :REM Si es no salimos
290 PRINT "Responda S o N" : GOTO 240   :REM Repetir pregunta
310 PRINT "Fin del programa"

La parte marcada en verde es la inicialización de las variables necesarias, en R tendremos el resultado, lo empezamos en uno ya que lo usamos multiplicando (si fuera sumando empezaríamos en cero), en S ponemos un contador hasta el número, empezamos a contar en uno. Luego en rojo el bucle, multiplicamos el resultado anterior por el contador del número, le sumamos uno al número, y se repite mientras no lleguemos a superar el número. Para entender mejor un bucle se usan diagramas de valores de variables, en el que se expresa como van cambiando las variables del programa a lo largo del tiempo, con un valor de ejemplo:

Paso Valor de N Valor de R Valor de S
130 INPUT N
<Se pide el número>
5 Indeterminado Indeterminado
170 LET R=1 5 1 Indeterminado
180 IF (N=0) THEN GOTO 230
<NO es 0, comienza el bucle>
5 1 Indeterminado
190 LET S=1 5 1 1
PASO 1 POR EL BUCLE
200 LET R=S*R 5 1 1
210 LET S=S+1 5 1 2
220 IF (S<=N) THEN GOTO 200
<Es menos, seguir el bucle>
5 1 2
PASO 2 POR EL BUCLE
200 LET R=S*R 5 2 2
210 LET S=S+1 5 2 3
220 IF (S<=N) THEN GOTO 200
<Es menos, seguir el bucle>
5 2 3
PASO 3 POR EL BUCLE
200 LET R=S*R 5 6 3
210 LET S=S+1 5 6 4
220 IF (S<=N) THEN GOTO 200
<Es menos, seguir el bucle>
5 6 4
PASO 4 POR EL BUCLE
200 LET R=S*R 5 24 4
210 LET S=S+1 5 24 5
220 IF (S<=N) THEN GOTO 200
<Es menos, seguir el bucle>
5 24 5
PASO 5 POR EL BUCLE
200 LET R=S*R 5 120 5
210 LET S=S+1 5 120 6
220 IF (S<=N) THEN GOTO 200
<Es mayor, fin del bucle>
5 120 6


Podemos simplificar esto usando la sentencia FOR - NEXT, que es el bucle usado en el BASIC para realizar estas labores. Es un bucle automático, en el que una variable va aumentando (o disminuyendo) su valor de forma automática. Veamos como cambiar las 6 líneas anteriores por
170 LET R=1                  :REM En R tendremos el resultado
180 IF (N=0) THEN GOTO 230   :REM El factorial de cero es uno
190 FOR S=1 TO N             :REM Bucle desde 1 hasta el valor de N
200   LET R=S*R              :REM Multiplicamos por el anterior
220 NEXT S                   :REM Repetir el bucle

Es muy similar, pero nos ahorramos inicializar el valor de S e ir comparando, el bucle se repite de forma automática, la sintaxis es FOR variable = inicial TO final [STEP suma] en el que usamos una variable por su nombre, que partirá de un valor inicial, y se irá sumando el valor indicado por STEP, hasta que se sobrepase al valor final, momento en que se sale del bucle
Paso Valor de N Valor de R Valor de S
130 INPUT N
<Se pide el número>
5 Indeterminado Indeterminado
170 LET R=1 5 1 Indeterminado
180 IF (N=0) THEN GOTO 230
<NO es 0, comienza el bucle>
5 1 Indeterminado
190 FOR S=1 TO N 5 1 1
PASO 1 POR EL BUCLE      
200 LET R=S*R 5 1 1
220 NEXT S
<Es menos, seguir el bucle>
5 1 2
PASO 2 POR EL BUCLE      
200 LET R=S*R 5 2 2
220 NEXT S
<Es menos, seguir el bucle>
5 2 3
PASO 3 POR EL BUCLE      
< 200 LET R=S*R 5 6 3
220 NEXT S
<Es menos, seguir el bucle>
5 6 4
PASO 4 POR EL BUCLE      
200   LET R=S*R 5 24 4
220 NEXT S
<Es menos, seguir el bucle>
5 24 5
PASO 5 POR EL BUCLE      
200 LET R=S*R 5 120 5
220 NEXT S
<Es mayor, fin del bucle>
5 120 6

Podemos usar STEP para indicar decremento, usando un valor negativo de incremento, si queremos usar bucle que empiece por 10 y llegue hasta 1 decrementando de uno en uno, usaremos FOR i=10 TO 1 STEP -1.

Podemos usar STEP para indicar que cuente de n en n, no tiene por qué ser uno, por ejemplo sumaremos todos los números múltiplos de 2 menores de cien, usaremos un bucle FOR i=0 TO 99 STEP 2, lo que hará un bucle  con los valores 0,0+2=2, 2+2=4, 4+2=6, etc. Si queremos multiplicar todos los números múltiplos de 13 menores de 130 inclusive, podemos usar FOR i=130 TO 0 STEP -13 (lo que dará 130, 117, 104,…, 13, 0) o bien FOR i=0 TO 130 STEP 13 (lo que dará 0, 13, 26,…, 117, 130).

En versiones más modernas del BASIC existen otras instrucciones de control de bucle, pero solo el FOR está disponible en todas las versiones de BASIC de nuestras máquinas.

Subrutinas

La sentencia GOTO hemos visto que transfiere la ejecución del programa a otra parte del mismo, y si queremos regresar a donde estábamos debemos usar otro GOTO. Para evitar este mecanismo, podemos usar el manejo de subrutinas, que nos ayudará en la definición de partes del programa reutilizables en otros programas, usando las instrucciones GOSUB y RETURN.

Una subrutina es un trozo del programa que se ejecuta por si mismo, de manera independiente del resto del programa, y que podemos llamar cuando queramos, devolviendo el control al punto donde la hemos llamado de forma automática, sin necesidad de sabe desde que punto la hemos llamado. Voy ha convertir nuestro programa de cálculo de factoriales en una subrutina, y nos dará la diferencia entre el factorial de dos números:

100 REM -------------------------------------------------------------
110 REM - Calculo de diferencia de dos factoriales, JAVaqué 2012    -
120 REM -------------------------------------------------------------
130 INPUT "Primer Número: ";N        :REM Pedimos el primer número
140 GOSUB 1000                       :REM Llamamos a la subrutina
150 IF (R=-1) THEN GOTO 130          :REM No para negativos
160 LET N1=N : LET F1=R              :REM Guardamos el valor
170 INPUT "Segundo Número: ";N       :REM Pedimos el segundo número
180 GOSUB 1000                       :REM Llamamos a la subrutina
190 IF (R=-1) THEN GOTO 130          :REM No para negativos
200 LET N2=N : LET F2=R              :REM Guardamos el valor
210 PRINT ,N1;"! (";F1;")- ";N2;"! (";F2;") = ";F1-F2 
220 PRINT : PRINT                    :REM Dejamos línea en blanco
230 INPUT "¨Otro? (S/N): ";O$        :REM Preguntamos si seguimos o no
240 PRINT : PRINT                    :REM Dejamos línea en blanco
250 IF (O$="S") OR (O$="s") GOTO 130 :REM Si es si seguimos
260 IF (O$="N") OR (O$="n") GOTO 280 :REM Si es no salimos
270 PRINT "Responda S o N": GOTO 220 :REM Si no es si o no repetir pregunta
280 PRINT "Fin del programa"
290 STOP                             :REM Necesario para finalizar
1000 REM -------------------------------------------------------------
1010 REM - Subrutina de cálculo de un facTOrial.                     -
1020 REM - Pasamos en N el número a calcular                         -
1030 REM - Retorna en F el factorial, o -1 si no puede calcularlo    -
1040 REM -------------------------------------------------------------
1050 IF (N>=0) THEN GOTO 1090       :REM No para negativos
1060 PRINT "ERROR: No se puede calcular el factorial de un negativo"
1070 LET R=-1                       :REM Marcamos el error
1080 RETURN                         :REM Salimos
1090 LET R=1                        :REM En R tendremos el resultado
1100 FOR S=1 TO N                   :REM Bule de 1 a N
1110   LET R=S*R                    :REM Multiplicamos por el anterior
1120 NEXT S                         :REM Bucle
1130 RETURN                         :REM Salimos

Tras pedir el primer número, llamamos a la nueva subrutina en la línea en verde usando GOSUB nro_de_linea, esto equivale a hacer GOTO 1000, y hacemos el cálculo del número factorial. Si el número es negativo ponemos el resultado como -1 indicando error y retornamos a la llamada usando la instrucción RETURN, que en este caso sería como hacer un GOTO 150. Si el número es correcto, calculamos el factorial  y al final volvemos con otro RETURN, lo que nuevamente sería equivalente a hacer un GOTO 150. Luego pedimos el segundo número, y llamamos nuevamente a la subrutina, lo que equivale a hacer un GOTO 1000, pero cuando finalice la subrutina con el RETURN primero o con el segundo, hará esta vez un GOTO 190, por lo que podemos usar la misma subrutina desde dos partes de nuestro programa, sin preocuparnos de desde donde se llame, cuando finalice continúa el programa por donde estaba, lo que es una gran ventaja, ya que no hay que preocuparse de donde era ese lugar. 

Solo existe una limitación, hay una pila de llamadas a subrutinas, en donde el programa guarda la dirección de retorno de la misma, y esta pila tiene un tamaño limitado, dependiendo de la versión del BASIC serán mas o menos, el mínimo creo que son 7, por lo que no podemos usar llamadas anidadas a subrutinas en muchos niveles, para evitar esto. Por otro lado, siempre que se pueda es mejor hacer un salto a una subrutina que poner muchos GOTO, ya que mejora la legibilidad del programa, sobre todo pensando que se puede salir de una subrutina desde cualquier parte, sin pensar a donde regresamos, evitando muchos GOTO a la misma línea.

En esta entrada hemos aprendido a manejar los bucles FOR y las subrutinas. En la próxima entrada seguiré con los bucles hablando de bucles anidados, y mejoraré el control del programa usando ON GOTO y ON GOSUB (que no son del primer BASIC pero si están en casi todos), y mejoraré nuestra calculadora. Luego nos queda DEF FN y READ/DATA para terminar el repaso de los comandos estándar. Animaros a teclear estos programas y a idear nuevos, entenderlo bien, e intentar mejorarlo, solo se aprende a programar programando.


Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en mi mail o ver más cosas en mi blog

viernes, 28 de diciembre de 2012

Electrónica de Andar por Casa, Artículo 6: Montajes básicos 1

Artículo publicado en el número 5 de RetroWiki Magazine

MONTAJES


Hasta ahora no hemos visto más que componentes y algo de teoría, y vimos como usar un polímetro, y ahora vamos a hacer unos montajes básicos, que nos ayudarán a empezar a entender los circuitos y a manejarnos con los componentes. Solo indico tres circuitos muy sencillos en esta entrada, en la próxima veremos ya algo con transistores.

Componentes

Estos son todos los que usaremos, marco con una “T” cuando se usa en todos los montajes, y con un número el número del montaje en que se usa
  • (T)     Placa de prototipos sin soldaduras
  • (T)     Cablecillos para puentes
  • (T)     Pila de 9 voltios, con un conector apropiado
  • (1,2)  Diodo LED rojo
  • (1,2)  Resistencia 220Ohm, ¼ de watio
  • (2)     Potenciómetro de 100K Ohm
  • (3)     Diodo 1N4004 o similar

Montaje de circuitos de pruebas
Usaremos muy pocas cosas para estos montajes, pero lo principal es una base para hacerlos que nos evite problemas. Podemos montar los circuitos soldando los cables directamente, o incluso uniendo con cinta aislante, pero una forma sencilla y económica es una placa de prototipos sin soldaduras, como esta:


Los puntos van unidos entre sí en grupos de 5, los bordes marcados como “+” y “–“ lo están en la imagen en grupos horizontales, mientras que os interiores marcados como “a” hasta “l” lo están verticalmente. Los bordes externos se suelen usar como alimentación (por eso se marcan como  “+” y “–“), mientras que el interior se usa para el circuito. Los chips se deben ubicar con una fila de patitas en un lado del centro (fina “e”), y la otra fina en el otro lado (fila “f”), así dispondremos de todas las patas conectadas, dejando filas libres para otros componentes o cables, y sin cortocircuitarse entre sí ninguna. Para unir el resto usaremos cablecillos pelados con la punta estañada preferentemente, aunque sin abusar de estaño para que entren. Estas placas las hay de mucho tamaños, yo tengo una muy pequeña, suficiente para cualquier circuito de los que vamos a hacer.

Para alimentar nuestros circuitos podemos usar muchas cosas, pero lo más sencillo es usar una pila de 9Voltios, que proporciona suficiente corriente y voltaje para cualquiera de estos voltajes.

(1)    Encender un LED

El primer circuito siempre es el más sencillo, vamos a encender un LED. En estos componentes el terminal mas largo es el ánodo, que se conecta al lado positivo, mientras el terminal más corto es el cátodo que va al negativo. También la cabeza redonda del LED tiene una pequeña muesca en el lado del cátodo, pero recuerda que es un diodo, si lo conectas al contrario no lucirá. Los diodos LED funcionan con corrientes muy pequeñas, alrededor de 2voltios, por lo que si partimos de 9 voltios, debemos reducir el voltaje, para ello conectaremos en serie con el diodo una resistencia de 220Ohm, suficiente para protegerlo. El circuito que usaremos será el que se presenta a continuación. Por convención, para los cables de alimentación hay que usar el color rojo para el polo positivo, y el negro para el negativo. Los dos puentes necesarios están marcados con un hilo verde y otro morado. 


Podéis probar varias cosas, a cambiar el sentido del LED, veréis que no luce pero no se estropea, podéis poner la resistencia antes o después del LED, viendo que no afecta, y podéis jugar con una resistencia más grande, veréis que el LED luce menos, y si os pasáis dejará de lucir. Si os quedáis cortos con la resistencia, en lugar de lucir mas se quemará el LED.

Luego coge el tester y a medir, primero los voltajes entre el polo negativo de la pila (punto d) y los puntos a, b y c del circuito, viendo como se comporta. Después podéis medir la resistencia para ver como en un circuito en varios puntos, midiendo entre a y b, entre b y c, entre a y c, y la resistencia total entre a y d. Medir con y sin la pila en el circuito, y veréis como afecta su resistencia interna al mismo.

(2)    Manejo de un potenciómetro

Añadiremos uno de 100K a nuestro circuito, y veremos como va cambiando la cantidad de luz del LED al girarlo. El montaje es muy sencillo, solo hay que cambiar el puente que va al polo negativo, intercalándolo con el potenciómetro. En ellos, el terminal central es el que varía, siempre sobre los dos laterales que son indiferentes, en uno aumenta y en el otro disminuye el voltaje, y siempre la resistencia del potenciómetro variará entre cero y su valor como máximo (en el nuestro entre 0 y 100K Ohm), dependiendo de la posición del mando giratorio.. Podéis ver como responde conectando al punto A o al punto B del potenciómetro. Incluso se puede usar ambos para controlar que uno aumente y el otro disminuya. 



Luego coge el tester y a medir, en este circuito lo mas interesante es voltaje y resistencia entre los puntos c y d variando el potenciómetro lentamente para ver como va cambiando el valor de la señal, ya que entre estos dos puntos es donde mas se ve afectados el circuito por el potenciómetro, pero no dejéis de medir en todos los puntos, aprender cosas con la práctica es interesante.

(3)    Manejo de un Diodo

Sabemos que los diodos permiten que la corriente circule en un sólo sentido, por lo que podemos usar el circuito anterior para probarlo, conectando el diodo en uno u otro sentido, el LED lucirá o no. Para ello usaremos este circuito. En el hemos añadido un diodo del tipo de baja corriente, un 1N4004 o similar. Los diodos tienen una banda que marca el cátodo, por tanto es sencillo instalarlos. Podéis probar a conectarlo en sentido contrario, y el LED no lucirá.




En este circuito poco podemos medir, pero si que hay una cosa interesante, para ver si un diodo funciona, lo que se hace es poner el tester en modo medición de resistencias, y ver como se comporta la misma si medimos poniendo el terminal rojo en el punto c y el negro en el d, y luego al contrario. Vemos que la resistencia varía entre una pequeña y una muy grande, teóricamente infinita. Esto es por que el tester pone entre sus puntas una corriente, y por la ley de Ohm, conociendo la corriente que envías y la intensidad que circula, puedes conocer la resistencia en ese punto. Pero a una resistencia le da igual la polaridad de la corriente, pero no a un diodo, que no dejará pasar la corriente si circula en sentido inverso, por lo que la resistencia será infinita, pero dejará pasar casi toda en sentido directo, por lo que la resistencia interna será baja (la caída de voltaje será de 0.7 Voltios si el diodo es de cilicio, y de 0.2 Voltios si es de germanio).

Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en mi mail o ver más cosas en mi blog