Se recuerda a los Nuevos Usuarios Registrados que es obligatorio pasarse por el hilo de Presentaciones y que, para poder descargar archivos,
se han de escribir un mínimo de cuatro mensajes en el Foro. Muchas gracias por vuestra colaboración y un saludo.
New Registered Users are reminded that it is mandatory to visit the Introductions thread and that, in order to be able to download files,
a minimum of four messages must be written in the Forum. Thank you very much for your collaboration and best regards.
se han de escribir un mínimo de cuatro mensajes en el Foro. Muchas gracias por vuestra colaboración y un saludo.
La Administración
.New Registered Users are reminded that it is mandatory to visit the Introductions thread and that, in order to be able to download files,
a minimum of four messages must be written in the Forum. Thank you very much for your collaboration and best regards.
The Administration
.Lista de mejores mensajes
Clasificar mensajes
-
- Mensaje
- Agradecido
- Autor
- Valoración
-
-
01 Jul 2022 17:21 Re: ¡Felicidades droman! 01 Jul 2022 17:21 Re: ¡Felicidades droman!
Muchas felicidades!! Que pases un buen dia. - 1 Agradecido
- tun40 Autor
- Valoración Valoración: 7.69%
-
-
-
25 Nov 2018 00:03 Re: Como meter un A1200 en una torre. 25 Nov 2018 00:03 Re: Como meter un A1200 en una torre.
A la placa de mi A1200 le he tenido que cambiar los zócalos de la ROM, los originales estaban cedidos. Pienso que haciendo esto puedo eliminar problemas en el futuro.
https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/20160612_224502_result.jpg
Recuerdo que este es el segundo intento de hacer la Torre. En el intento anterior se vio todo frustrado por la aceleradora.
Era una ACA 1232/33 y parece que se llevaba mal con la mediator.
A esta placa le realicé varios mods que aconsejaban para dar estabilidad a la misma. Era quitar algunos condensadores y sustituir unas resistencias por unas ferritas.
Lo primero que tengo que hacer es adaptar el panel trasero a su nueva ubicación, no será complicado pero si laborioso ya que sólo cuento con una Dremel para cortar la chapa.
https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/WP_20150503_15_44_37_Pro_039BE334B8.jpg
Para el vídeo tengo una Indivision AGA cr, para el almacenamiento cuento con una Fast ATA y para el teclado usaré un Sum 1200.
Para el resto de expansiones tengo la Mediator donde pondré estas tarjetas PCI:
Gráfica Ati 9200 con 256 MB de Ram.
https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/20160613_091224_result.jpg
Sound Blaster Live 5.1.
https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/20160613_091253_result.jpg
Spider USB:
https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/20160613_091121_result.jpg
Tarjeta de red y otra SCSI.
https://www.winuaespanol.com/almacenphpbb/pintza/A1200T/20160613_091147_result.jpg
Más o menos es todo lo que tengo, me falta lo más importante ...................... la aceleradora. - 1 Agradecido
- pintza Autor
- Valoración Valoración: 7.69%
-
-
-
04 Ago 2022 23:09 Re: Ghouls 'N Ghosts 04 Ago 2022 23:09 Re: Ghouls 'N Ghosts
Qué pedazo de aporte. Es un juego que suelo usar en cualquier plataforma para probar.
En amiga , creo que necesitaba 1mg, incluso de chip, no de fast. Pero bueno, quizás fuese la versión que "me llegó" a mi.
Recuerdo jugar a él en los salones de recreativas.
Tiene algo que engancha. No sé ¿quizás el tema zombi? .... - 1 Agradecido
- Santiago-H Autor
- Valoración Valoración: 7.69%
-
-
-
02 Oct 2022 14:59 Re: ZX Turbo Games 02 Oct 2022 14:59 Re: ZX Turbo Games
Un segundo lote.
353 juegos, 147 a 4500bds y 196 a 3500bds, es decir el 44,47% a 4.500bds ... :hurra1:
20220929_ZXTurboGames.7z
Espero que os guste.
:hola1:
NOTA: Descargad siempre el último lote ya que contiene los juegos de los anteriores y los que voy añadiendo.
pa la cacharrería, gracias :gamer1: - 1 Agradecido
- Alki Autor
- Valoración Valoración: 7.69%
-
-
-
24 Ene 2019 14:35 Re: Problemas con Blizzard 1230 IV 24 Ene 2019 14:35 Re: Problemas con Blizzard 1230 IV
Vaya...estoy muy contento con mi Amiga 1200 ahora.....arranca perfectamente a la primera, todo va como se le espera....esta ¡genial!
- 1 Agradecido
- Bone Autor
- Valoración Valoración: 7.69%
-
-
-
10 Nov 2022 21:53 Re: MegaDuino - MaxDuino basado en Mega2560 Pro Embed 10 Nov 2022 21:53 Re: MegaDuino - MaxDuino basado en Mega2560 Pro Embed
Muchas gracias, en cuanto lo tenga todo soldado e impreso subo como ha quedado todo! - 1 Agradecido
- NacherasTM Autor
- Valoración Valoración: 7.69%
-
-
- 1 Agradecido
- Sup3rH4L Autor
- Valoración Valoración: 7.69%
-
-
28 May 2019 23:59 Re: Coffin en WinUAE 28 May 2019 23:59 Re: Coffin en WinUAE
...
sobrado, pero se ve apetecible como opción gratuita.
¿Precisa del Workbench para ser instalado o es propietario?
Es una version "alegal" del AmigaOS 3.1 con mogollon de software/parches/utilidades/demos/...
Vamos que con el casi ya no tienes que descargar nada (execpto nuevas cosas que salgan).
Tan solo lo vuelcas en una SD/USB de 32GB (o necesita 64GB no recuerdo) y yastá, te deberia arrancar sin "muchos" porblemas, ten en cuenta qu esta "preparada" para las Vampire, asi que el sistema (libs/comandos/parches) esta "especialmete" tuneado para ella.
Soy de amigaaaaaaaaaaaaaaaaaaaaaaaaargh!!!! - 1 Agradecido
- javierdlr Autor
- Valoración Valoración: 7.69%
-
-
-
08 Jul 2019 18:59 AmigaOS 3.1.4.1 08 Jul 2019 18:59 AmigaOS 3.1.4.1
Actualización a AmigaOS 3.1.4 lanzado
http://www.hyperion-entertainment.com/images/stories/OS3.1.4/005.png
Hyperion Entertainment CVBA nos anuncia de la disponibilidad inmediata de AmigaOS 3.1.4.1 como una actualización gratuita de AmigaOS 3.1.4 lanzada en septiembre de 2018.
Desde entonces, se encontraron algunos errores y se revisó la funcionalidad. Por lo tanto, proporcionan actualizaciones que abordan esos problemas para mejorar la experiencia del usuario y también agregan más soluciones para mejorar la compatibilidad con algunos programas de comportamiento extraño.
Esto es principalmente una actualización de corrección de errores para AmigaOS 3.1.4, sin embargo, algunas características pequeñas lograron incluirse:
Catálogos de AmigaOS en danés (dansk) y suecos (svenska).
Setpatch ahora tiene la capacidad de cargar tanto un dispositivo de audio como una actualización de Shell-Seg.
El servicio de audio consiguió una compatibilidad mejorada con algunas prácticas de programación no estándar.
HDToolBox ahora sugiere tamaños de bloque más adecuados para unidades grandes.
CrossDOS ahora es más tolerante a las listas de montaje mal configuradas y a los juegos de caracteres extranjeros.
Por supuesto, han logrado abordar muchas más correcciones de errores. El registro de cambios tiene más de 260K y cubre componentes como el CDFileSystem, el nuevo soporte de intution, dispositivo de audio, soporte de disco (Format, FastFileSystem y HDToolBox), Shell, varios comandos de AmigaDOS, DiskDoctor y muchos más componentes.
AmigaOS 3.1.4.1 está disponible como descarga gratuita desde el área de descarga restringida para todos los clientes registrados de AmigaOS 3.1.4.
Hyperion Entertainment CVBA nos desea enviar felicitaciones a todas esas personas involucradas por hacer que esta actualización se realice.
¡Gracias chicos! - 1 Agradecido
- Pingui Autor
- Valoración Valoración: 7.69%
-
-
-
29 Ene 2023 19:03 Re: TZX-TSX 29 Ene 2023 19:03 Re: TZX-TSX
MSXVR ... algo que compré con mucha ilusión y que, al poco de tenerlo, me desencantó profundamente. A eso le sumas la postura de los "desarrolladores" y el resultado es ese ... en una estantería ...
Todo lo contrario que con el Omega MSX2+ ... tardé tiempo en decidirme, pero ha sido una de mis grandes compras en los últimos tiempos. ¿Mejorable? Como todo, pero de por sí, es un pedazo de MSX que te pasas de vueltas.
:gamer1: - 1 Agradecido
- merlinkv Autor
- Valoración Valoración: 7.69%
-
-
-
25 Jul 2019 15:07 Programación en C/C++ 25 Jul 2019 15:07 Programación en C/C++
Bueno, parece que esto me va gustando :)
Estoy instalando compiladores de C/C++ para empezar a trastear y por ahora, he instalado Lattice 5.02 y SAS/C 6.50
El editor de Lattice (Golden ED v4) parece muy bueno y tiene reconocimiento de sintaxis. Pero creo que es bastante más sencillo de manejar el SAS/C.
Al Lattice hay que crearle una caterva de ASSIGN en Startup-Sequence para que funcionen las cosas, que no es ni medio normal XD por llo menos para los que hace una semana sabemos que significa eso jajaja.
¿Alguien tiene experiencia en este tema? ¿Me recomienda algún procedimiento u otro compilador?
Gracias chicos. - 1 Agradecido
- droman Autor
- Valoración Valoración: 7.69%
-
-
-
05 Sep 2019 13:46 Re: Proceso de fabricación de PCB 05 Sep 2019 13:46 Re: Proceso de fabricación de PCB
Merlinkv Te lo agradezco :)
He cambiado el circuito de prueba.... se me ha ocurrido hacer uno que pueda freir la red de mi casa... si no no tiene gracia.
Un interruptor de Ethernet a través de Arduino.
La idea es poder dejar sin acceso a internet a mis hijos, por ejemplo, para que no se conecten a internet sin mi permiso. El switch que tengo en casa no es de los baratitos, pero activar o desactivar un puerto es un latazo inconmensurable.
Es muy simple (aquí viene donde arde todo) Dos conectores RJ45 donde cada cable (excesivo... lo sé) se habilita mediante un optoacoplador controlado por Arduino (el que uso para la domótica y que se maneja mediante WEB).
Como véis. mi sistema cumple con el estándar Plug And Prey.
Menos risas... que no tengo ni idea de electrónica a este nivel y es mi primer circuito hecho con KiCad.
Editado: He corregido el texto y he puesto un jpg de la placa con los zócalos donde se aprecia la serigrafía un poco mejor. - 1 Agradecido
- droman Autor
- Valoración Valoración: 7.69%
-
-
-
24 Feb 2023 09:41 Re: Indiana Jones y la última Cruzada 24 Feb 2023 09:41 Re: Indiana Jones y la última Cruzada
Pues perfecto. Pero si, esto de las protecciones es para volverse loco. Como el maldito amc. Siempre tropezamos con alguno que te da dolor de cabeza.
Pero bueno. Asi al menos avanzamos mejor. Sino lo saca uno lo saca el otro. - 1 Agradecido
- DaRaSCo Autor
- Valoración Valoración: 7.69%
-
-
- 1 Agradecido
- merlinkv Autor
- Valoración Valoración: 7.69%
-
-
17 Ene 2023 21:52 Bombuzal 17 Ene 2023 21:52 Bombuzal
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_01.jpg
Bombuzal tiene que hacer estallar bombas en pequeñas islas en este juego de rompecabezas. Para avanzar al siguiente nivel, todas las bombas deben detonar. Hay varios tamaños de bombas. Los más grandes tienen un radio de explosión tan grande que Bombuzal no puede dispararlos directamente; en cambio, primero tiene que explotar bombas más pequeñas y provocar una reacción en cadena. Entonces, como uno podría imaginar, los niveles posteriores se convierten en fuertes explosiones que deben planificarse cuidadosamente.
Además, los niveles posteriores presentan todo tipo de peligros y trucos adicionales, como pisos de hielo, bombas móviles, baldosas que desaparecen y mucho más. Nadie dijo que ser un pirómano sea fácil.
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_02.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_03.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_04.jpg
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_05.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/Bombuzal - 1988/Bombuzal - 1988_06.jpg
Año de lanzamiento: 1988
Idiomas: Inglés
Chipset: OCS-ECS
Discos: 1
Instalación HDD: No
Bombuzal - 1988.7z Bombuzal - Manual.7z - 1 Agradecido
- merlinkv Autor
- Valoración Valoración: 7.69%
-
-
-
04 Mar 2023 15:25 North & South 04 Mar 2023 15:25 North & South
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_01.jpg
Basado en el cómic belga, "Les Tuniques Bleues", este juego de estrategia te permite reproducir la Guerra Civil Estadounidense tanto desde el lado norte como desde el sur.
En la parte de estrategia del juego, puedes mover tus tropas en un mapa de los EE. UU. Si dos ejércitos opuestos entran en el mismo estado, la batalla se desarrolla en una secuencia de acción. Se deben realizar secuencias de acción adicionales al capturar un fuerte o tren enemigo.
El juego también ofrece un modo de dos jugadores.
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_02.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_03.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_04.jpg
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_05.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_06.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_07.jpg
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_08.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_09.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_10.jpg
https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_11.jpg https://www.winuaespanol.com/almacenphpbb/merlinkv/AmigaSCP/North & South - 1989/North & South - 1989_12.jpg
Año de lanzamiento: 1989
Idiomas: Español , Inglés , Francés , Alemán e Italiano
Chipset: OCS
Discos: 1
Instalación HDD: No
North & South M5 - 1989.7z North & South - Docs.7z - 1 Agradecido
- merlinkv Autor
- Valoración Valoración: 7.69%
-
-
-
24 Oct 2019 01:17 De compras por la web 24 Oct 2019 01:17 De compras por la web
El otro día compré un bonito lote al mismo vendedor al que compré el Commodore 128.
Esta mañana llegó el paquete, todo perfectamente embalado, bueno, tengo que decir que este ordenador lo compré como averiado.
Pero con esperanzas de que sea relativamente sencilla su reparación, ya que muestra vídeo y aparece en pantalla un mensaje de Out of memory error. Lo que apunta directamente a la Ram:
Primero el unboxing.
En una buena caja de cartón y debidamente protegido con papeles de periódico.
IMG-024263682f4b77799f877e2bf786e7d7-V.jpg
Lo primero que veo es que hay varias cajas de discos de los grandotes, :loco2: es una sorpresa ya que no sabía que los incluía en el lote.
Los papeles de periódico no me dejan ver que más hay dentro de la caja, es hora de quitarlos.
Y ya puedo sacar al pequeñín.
IMG-12ecda8671732453169e52e4dd22177f-V.jpg
Mi nueva adquisición una auténtica panera.
Acompaña al lote el manual en ingles del ordenador, un complemento cojonudo.
IMG-60478e19266921c8710cc070c0b1a667-V.jpg
Pero vamos con los discos, que hay dentro de las cajas:
IMG-dd770e65629973a902f9cd79d1209d30-V.jpg IMG-02baddb0e1a6b607a81495993a9e174b-V.jpg IMG-7e352a3599890843dcfbfc62df9bd3b8-V.jpg IMG-e5ee845498b8d807c08c03f92351ce6a-V.jpg
Un total de 47 discos :loco4:
Ahora si que si que tengo que comprar una disquetera.
La panera viene dentro de una bolsa de plástico.
IMG-4b43830d1675b21bd816f378c329972a-V.jpg
Tiene muy buena pinta, además a este lote lo acompaña su fuente de alimentación, de las de cuña.
IMG-0936f947e5b64ee5610d0fee2e12e90f-V.jpg
Ahora toca ver su funcionamiento:
IMG-137ede2829c7f1c737abec50549eff45-V.jpg
Es lo que me comentó el vendedor, un mensaje de error y cuadraditos por la pantalla.
Y con el cartucho de diagnóstico
IMG-4bfcf243f613774768d3a667f96dd2ee-V.jpg
Se para en la Ram, no queda duda, la Ram está frita.
Continuará ................................................................................................ - 1 Agradecido
- pintza Autor
- Valoración Valoración: 7.69%
-
-
-
28 Mar 2023 13:27 Re: Emulando un Amiga con WinUAE 28 Mar 2023 13:27 Re: Emulando un Amiga con WinUAE
Me gusta ver las cosas bonitas... - 1 Agradecido
- Pingui Autor
- Valoración Valoración: 7.69%
-
-
-
28 Oct 2019 21:39 Re: Heimdall (español) 28 Oct 2019 21:39 Re: Heimdall (español)
Hace unos días que tengo el juego en casa.
Primero, el sistema anti copia.
Es de los de tipo coñazo, te hace buscar una palabra en el manual y si por lo que sea fallas, el juego se reinicia.
Con lo que te toca localizar una nueva palabra.
He intentado hacer una copia de respaldo con el X-Copy Pro, pero no lo hace bien, falla siempre en el primer sector.
También intenté usarlo con el WHDLoad pero la versión en castellano no está soportada.
Lo único que se me ocurre es mandar los discos originales a bone que tiene el cryoflux y el que saque la versión .ipf.
Esos ipfs mandarlos a quién se encargue de mantener el Heimdall en WHDLoad. Y lógicamente distribuirlos libremente desde aquí y otros sitios. También hacer una copia del manual, pero de eso me puedo encargar yo, que tengo un scaner casi sin estrenar.
Recordar que el juego como es el original está sin craquear. - 1 Agradecido
- pintza Autor
- Valoración Valoración: 7.69%
-
-
-
02 May 2023 23:03 Re: MegaDuino - MaxDuino basado en Mega2560 Pro Embed 02 May 2023 23:03 Re: MegaDuino - MaxDuino basado en Mega2560 Pro Embed
Los Gerbers no me interesan, me interesa el .ino y el esquema por si puedo implementar en mi diseño algo parecido.
¿Los puedes poner aquí? Es que, salvo causas de fuerza mayor, paso de registrarme en otra página ...
Por cierto, los mismos juegos CAS del mensaje de antes, he vuelto a probar y todos han cargado a 3.850 bds sin problemas.
perdona, no recordaba que había tenido que registrarme.
fichero datarec.ino
codigo:
//------------------------------------------------------------
// DIY DATA RECORDER
// for ATmega328 5V 16MHz(Arduino Pro)
// by takuya matsubara
// 3 modos
// ・Modo PLAY: Convierta el archivo binario (CAS/P6) en la tarjeta SD para emitir un pitido y enviar
// ・Modo REMOTE PLAY: Reproduce un pitido cuando REMOTE está ON
// ・Modo REC: convierte el sonido recibido en un archivo binario y lo guarda en la tarjeta SD
// Terminal de casete de PC-6001mkII(4)CMTOUT --> DATIN D2(PD2)
// Terminal de casete de PC-6001mkII(5)CMTIN <-- DATOUT D3(PD3)
// Terminal de casete de PC-6001mkII(6)REMOTE+ --> REMOTE D9(PB1)
// Terminal de casete de PC-6001mkII(7)REMOTE- --- GND
// Terminal de casete de PC-6001mkII(2)GND --- GND
// Terminal de casete de PC-6001mkII(8)GND --- GND
// El REMOTO no tiene polaridad, por lo que +/- inversa está bien
// SDCARD SDI <-- D11(PB3)
// SDCARD SDO --> D12(PB4)
// SDCARD CLK <-- D13(PB5)
// SDCARD CS <-- D4(PD4)
// AQM1602XA SCL <-- D19(PC5)
// AQM1602XA SDA <-- D18(PC4)
// SPEAKER <-- D14(PC0)
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#define DATIN 2 //pin number:data input "activada la función de grabación"
//#define DATIN 0 //pin number:desactivada la función de grabación
#define REMOTE 9 //pin number:remote "terminal"
//#define REMOTE 0 //pin number:remote "desactivar terminal"
#define SPEAKER 14 //pin number:speaker
//#define SPEAKER 0 //pin number:"desactivar altavoz"
#define DATOUT 3 //pin number:data output
#define BTN_UP 5 //pin number:up button
#define BTN_DOWN 6 //pin number:down button
#define BTN_PLAY 7 //pin number:play button
#define BTN_STOP 8 //pin number:stop button
#define CPUHZ 16000000
#define PRS1 8
#define PRS2 64
char seq = 0; //menu seq(Comience con la selección de modo)
char targetfile[14]; //nombre de archivo 8+.1+extensión 3+null1
unsigned int targetsize; //tamaño archivo
unsigned int pion; //contador de pitidos
unsigned int tape_counter; //contador de cinta
unsigned int pulse_work;
unsigned char pulse_waveform;
#define RINGBUFMAX 64
unsigned char ringbuff[RINGBUFMAX]; //buffer de anillo o "ring"
volatile char ring_a = 0; //RINGBUFFER contador A
volatile char ring_b = 0; //RINGBUFFER contador B
unsigned int idx = 0; //read file index
//------------------------------------------------------------
//Interrupción cambio pin DATIN subida/bajada
SIGNAL (PCINT2_vect)
{
char onebit;
int hz;
if(digitalRead(DATIN)==HIGH){ //rising
#if SPEAKER!=0
digitalWrite(SPEAKER, HIGH);
#endif
TCNT1 =0;
}else{
hz = ((CPUHZ/PRS1)/2)/TCNT1; //falling
#if SPEAKER!=0
digitalWrite(SPEAKER, LOW);
#endif
if(hz<600)return;
if(hz>1800){
pulse_waveform <<= 2;
pulse_waveform |= 0b10; //2400Hz(1)
}else{
pulse_waveform = 0b1100; //1200Hz(0)
}
if(pulse_waveform & 0b1000){//1bit recepcion
if(pulse_waveform == 0b1100) onebit=0; else onebit=1;
if(pulse_work == 0xFFFF){ //startbit espera
if(onebit==0)pulse_work = 0x7FFF; //startbit deteccion
}else{
//0b111dddddddd01111
pulse_work >>= 1;
if(onebit)pulse_work |= 0x8000;
if((pulse_work & (1<<4))==0){//12bit envio terminado
ringbuff_push((pulse_work >> 5) & 0xFF);
pulse_work = 0xFFFF;
}
}
pulse_waveform = 0;
}
}
}
//------------------------------------------------------------
// Interrupción del temporizador 4800 veces/seg.
SIGNAL (TIMER1_OVF_vect)
{
char state;
TCNT1 = 0x10000-((CPUHZ/PRS1)/4800);
if(tape_counter == 0xffff)return;
if(pulse_work == 0x0000){ //Transmisión de 1 byte (12 bits) completada
#if REMOTE!=0
if(seq==5){
if( digitalRead(REMOTE) == HIGH){
pion = 0; // contador de pitidos (o tiempo de pitido)
return; //REMOTE terminal OFF
}
}
#endif
if(((pion>=0)&&(pion<340))||((pion>=356)&&(pion<456))){
//Pite durante 3,4 segundos antes de enviar datos 3,4 segundos/(12bit/1200hz)=340
//Pitido durante 1 segundo después de enviar 16 bytes de datos 1/(12/1200)=100
pulse_work = 0b111111111111; //12bit
}else{
if(ringbuff_datacnt()==0){ //si el bufer circular (anillo) está vacio
return;
}
pulse_work = ringbuff_pop(); //los siguientes datos
pulse_work = (pulse_work | 0b11100000000)<< 1; //12bit
tape_counter++; //incrementa contador de cinta
}
if(pion < 0xffff)pion++;
}
if(pulse_waveform==0){ //1bit=1/1200sec progreso
if(pulse_work & 1){
pulse_waveform = 0b1010; // 2400Hz(1)
}else{
pulse_waveform = 0b1100; // 1200Hz(0)
}
pulse_work >>=1;
}
if((pulse_waveform & 1)==0) state=HIGH; else state=LOW;
digitalWrite(DATOUT, state);
#if SPEAKER!=0
digitalWrite(SPEAKER, state);
#endif
pulse_waveform >>= 1;
}
//------------------------------------------------------------
//RING BUFFER:PUSH numero de datos
int ringbuff_datacnt(void)
{
if(ring_a < ring_b){
return((ring_a + RINGBUFMAX) - ring_b);
}else{
return(ring_a - ring_b);
}
}
//------------------------------------------------------------
//RING BUFFER:PUSH "hacer"
void ringbuff_push(unsigned char pushdata)
{
ringbuff[ring_a] = pushdata;
ring_a = (ring_a+1) & (RINGBUFMAX-1);
}
//------------------------------------------------------------
//RING BUFFER:POPする
unsigned char ringbuff_pop(void)
{
unsigned char work;
if (ring_a==ring_b)return(0x00); //no data
work = ringbuff[ring_b];
ring_b = (ring_b+1) & (RINGBUFMAX-1);
return(work);
}
//------------------------------------------------------------
//AQM1602XA:init
void lcd_init(void)
{
#define LCDCNTR 12 //contrast(0-63)
Wire.begin();
delay(150);
lcd_cmdwrite(0x38); //function set(normal instruction)
lcd_cmdwrite(0x39); //function set(extension instruction)
lcd_cmdwrite(0x14); //internal osc freq.
lcd_cmdwrite(0x70+(LCDCNTR & 0xF)); //contrast set
lcd_cmdwrite(0x54+(LCDCNTR >> 4)); //power/icon/contrast control
lcd_cmdwrite(0x6C); //follower control
lcd_cmdwrite(0x38); //function set(normal instruction)
lcd_cmdwrite(0x01); //clear display
lcd_cmdwrite(0x08+4+2+1); //display on/off control(disp=on/cursor=on/blink=on)
}
//------------------------------------------------------------
//AQM1602XA
void lcd_write(unsigned char temp1,unsigned char temp2)
{
#define LCDADDR (0x7C >> 1) //slave address // canviar por el puerto del display I2C (segun fabricante es el puerto 0x3C)
Wire.beginTransmission(LCDADDR);
Wire.write(temp1);
Wire.write(temp2);
Wire.endTransmission();
}
//------------------------------------------------------------
//AQM1602XA:locate
void lcd_locate(char x,char y){
unsigned char cmd=0x80;
if((x>=16)||(y>=2))return;
cmd += x;
cmd += (0x40*y);
lcd_cmdwrite(cmd);
}
//------------------------------------------------------------
//AQM1602XA:write character
void lcd_cmdwrite(unsigned char command)
{
lcd_write(0x00,command);
delay(1);
}
//------------------------------------------------------------
//AQM1602XA
void lcd_datawrite(unsigned char data)
{
lcd_write(0x40,data);
delay(1);
}
//------------------------------------------------------------
//AQM1602XA
void lcd_cls(void)
{
char i;
lcd_locate(0,0);
for(i=0;i<16;i++){
lcd_datawrite(' ');
}
lcd_locate(0,1);
for(i=0;i<16;i++){
lcd_datawrite(' ');
}
}
//------------------------------------------------------------
//AQM1602XA
void lcd_putstr(char x,char y,char *p)
{
lcd_locate(x,y);
while(*p!=0){
lcd_datawrite(*p++);
}
}
//------------------------------------------------------------
//AQM1602XA:pantalla decimal de 5 digitos
void lcd_putnum(char x,char y,unsigned int num)
{
unsigned int keta=10000;
char temp;
lcd_locate(x,y);
while(keta>0){
temp = (num/keta)% 10;
lcd_datawrite('0'+temp);
keta /= 10;
}
}
//------------------------------------------------------------
PROGMEM const unsigned char message[12][16]={
"DATA RECORDER", //0
"SD CARD ERROR", //1
"FILE OPEN ERROR", //2
"WRITE ERROR", //3
"MENU", //4
"PLAY MODE", //5
"REC MODE", //6
"PLAY LIST", //7
"SELECT NUMBER", //8
"PLAYING...", //9
"RECORDING..", //10
"REMOTE PLAY" //11
};
void lcd_putmessage(int x,int y,int number)
{
PGM_P pSrc;
unsigned char ch;
pSrc = message[number];
lcd_locate(x,y);
while(1){
ch = pgm_read_byte(pSrc++);
if(ch==0)break;
lcd_datawrite(ch);
}
}
//------------------------------------------------------------
//"sin usar o sin uso" send 1byte
void pulsesend(int work){
char bitcnt;
char pulse;
int hz;
work <<= 1; //start bit(0)
work |= (0b111 << 9); // stop bit
digitalWrite(DATOUT, 1);
TCNT2 = 0;
for(bitcnt=0; bitcnt<12; bitcnt++){
if(work & (1<<bitcnt)){
hz = 2400; //2400Hz(1)
pulse = 4;
}else{
hz = 1200; //1200Hz(0)
pulse = 2;
}
while(pulse>0){
if(TCNT2 >= (((CPUHZ/PRS2)/2)/hz)){
TCNT2 = 0;
digitalWrite(DATOUT, digitalRead(DATOUT) ^ 1);
pulse--;
}
}
}
digitalWrite(DATOUT, 0);
}
//------------------------------------------------------------
// receive 1byte de "sin uso"
// +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
// pulsecnt| -1 |00 01|02 03|04 05|06 07|08 09|10 11|12 13|14 15|16 17|18 19|20 21|
// +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
// |start| bit0| bit1| bit2| bit3| bit4| bit5| bit6| bit7| stop| stop| stop|
int pulserecv2(void){
char pulsecnt=-1;
unsigned char work=0;
unsigned int hz;
static int edge=0;
int edgenow;
unsigned long timeout;
timeout=0;
hz = 0;
while(pulsecnt < 22){
edgenow = digitalRead(DATIN);
if(edge != edgenow){ //find pin change
edge = edgenow;
if(edge){
TCNT1 = 0; //pulse start
}else{
hz = ((CPUHZ/PRS1)/2)/TCNT1; //pulse end
}
}else{
timeout ++;
if(timeout == 0xfffff)return(-1);
}
if(hz==0)continue;
if(pulsecnt ==-1){ //find start bit(1200Hz)
if(hz > 1800){
pulsecnt = -1; //error
continue;
}
if(hz < 600){
pulsecnt = -1; //error
continue;
}
pulsecnt = 0;
}else if(pulsecnt < 16){ // b0-b7
if(hz > 1800){
work |= (1<<(pulsecnt>>1)); //2400Hz
pulsecnt += 1;
}else{
pulsecnt += 2; //1200Hz
}
}else{ //stop bit
pulsecnt += 1;
}
hz = 0;
}
return(work);
}
//------------------------------------------------------------
//sin usar receive
void recvtest(void) {
int cmd;
char pos=0;
while(1){
if (pos==0) Serial.write('\n');
cmd = pulserecv2(); //get command
if (cmd==-1){ //timeout
pos = 0;
}else{
Serial.print(cmd >> 4, HEX);
Serial.print(cmd & 0x0f, HEX);
Serial.write(' ');
pos = (pos+1)% 16;
}
}
}
//------------------------------------------------------------
// record image file
void recimagefile(void) {
File myFile;
unsigned char tempbyte;
char gomiflag=1; //Indicador de eliminación de polvo (1 = detección de polvo) supongo que se refiere a "ruido"
lcd_cls();
myFile = SD.open(targetfile, FILE_WRITE);
if (myFile==0) { //error
lcd_putmessage(0,0,3);
delay(1000);
return;
}
lcd_putmessage(0,0,10);
PCMSK2 |= (1<<PCINT18); //Interrupción de cambio de pin DATIN
PCICR |= (1<<PCIE2); // Interrupción de cambio de pin enable
pulse_work = 0xFFFF;
pulse_waveform = 0;
tape_counter = 0;
sei();
while(1){
if (digitalRead(BTN_STOP) == LOW)break; //cancelar con el botón STOP
if(ringbuff_datacnt() == 0){
lcd_putnum(0,1,tape_counter); //contador de cinta
continue;
}
tempbyte = (unsigned char)ringbuff_pop();
if(gomiflag){//deteccion de ruido (o polvo/basura)
if(tempbyte != 0xD3)continue; //si no comienza con D3 se considera basura
gomiflag = 0;
}
// Serial.print(tempbyte >> 4, HEX); //debug
// Serial.print(tempbyte & 0x0f, HEX); //debug
// Serial.write(' '); //debug
myFile.write(&tempbyte, 1); //write sd card
tape_counter++;
}
myFile.close();
// cli();
PCICR &= ~(1<<PCIE2); // interrupción de cambio de pin "disable"
targetsize = tape_counter;
lcd_putnum(0,1,tape_counter); //contador de cinta
delay(1000);
}
//------------------------------------------------------------
// SD CARD FILENAME
void getfilename(int index) {
File myFile;
str_copy(targetfile,"");
myFile = SD.open("/");
if(myFile==0){
lcd_putmessage(0,1,2);//ERROR
delay(1000);
return;
}
while(targetfile[0]==0) {
File entry = myFile.openNextFile();
if (! entry) {
// no more files
break;
}
// Serial.println(entry.name()); //debug
if (entry.isDirectory()) { //skip
} else {
if (index==0){
str_copy(targetfile,entry.name()); //copy file name
targetsize = entry.size();
}
index--;
}
entry.close();
}
myFile.close();
}
//------------------------------------------------------------
void str_num2str(char *p,unsigned int num)
{
unsigned int keta=10000;
char temp;
while(keta > 0){
temp = (num/keta)% 10;
*p++ = ('0'+temp);
keta /= 10;
}
}
//------------------------------------------------------------
// string:copy
//pSrc:origen de la copia
//pDst:destino de la copia
void str_copy(char *pDst,char *pSrc)
{
while(1){
*pDst = *pSrc;
if(*pDst == 0)break;
pDst++;
pSrc++;
}
}
//--------------------------------------------------------------
// string:Compare
char str_ncmp(char *p1,char *p2,char cnt)
{
while(*p1 == *p2)
{
cnt--;
if(cnt <= 0)return(0); //equal
p1++;
p2++;
}
return(1); //not equal
}
//------------------------------------------------------------
// string:upper case
unsigned char str_ucase(unsigned char chrcode)
{
if((chrcode >= 'a')&&(chrcode <= 'z'))
chrcode -= 0x20;
return(chrcode);
}
//------------------------------------------------------------
//play Tape image
void playimagefile(void)
{
File myFile;
char i;
lcd_cls();
myFile = SD.open(targetfile);
if (myFile == 0) {
lcd_putmessage(0,0,2);//ERROR
delay(1000);
return;
}
lcd_putmessage(0,0,9); //PLAYING
lcd_putnum(11,1,targetsize);
for(i=0;i<16;i++){
if (myFile.available()) {
ringbuff_push(myFile.read()); //lectura de tarjetas SD
}
}
pion = 0; // contador de pitidos
pulse_work = 0;
pulse_waveform = 0;
tape_counter = 0;
TCNT1 = 0x10000-((CPUHZ/PRS1)/4800);
TIMSK1 |= (1<<TOIE1); // Interrupción de desbordamiento del temporizador 1 "enable"
sei();
while(1){
if(ringbuff_datacnt() < RINGBUFMAX-3){
if(myFile.available()){
ringbuff_push(myFile.read());
}
}else{
lcd_putnum(0,1,tape_counter); //contador de cinta
}
if(ringbuff_datacnt()==0)break; //buffer anillo vacio
if(tape_counter >= targetsize)break; //end of tape
if(digitalRead(BTN_STOP) == LOW)break; //cancelar con el botón STOP
}
myFile.close();
lcd_putnum(0,1,tape_counter); //contador de cinta
tape_counter = 0xffff;
// cli();
TIMSK1 &= ~(1<<TOIE1); // Interrupción de desbordamiento del temporizador 1 desactivado (disable)
delay(1000);
}
//------------------------------------------------------------
void swoffwait(void)
{
while(1){
delay(10);
if (digitalRead(BTN_UP) == HIGH){
if (digitalRead(BTN_DOWN) == HIGH){
if (digitalRead(BTN_PLAY) == HIGH){
if (digitalRead(BTN_STOP) == HIGH){
break;
}
}
}
}
}
}
//------------------------------------------------------------
void setup() {
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
pinMode(BTN_PLAY, INPUT_PULLUP);
pinMode(BTN_STOP, INPUT_PULLUP);
#if DATIN!=0
pinMode(DATIN, INPUT); //Con función de grabación
#endif
pinMode(DATOUT, OUTPUT);
digitalWrite(DATOUT, LOW);
#if SPEAKER!=0
pinMode(SPEAKER, OUTPUT); //con altavoz
digitalWrite(SPEAKER, LOW);
#endif
#if REMOTE!=0
pinMode(REMOTE, INPUT_PULLUP); //con REMOTE
#endif
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
lcd_init();
if (!SD.begin(4)) {
lcd_putmessage(0,0,1); //ERROR
delay(1000);
return;
}
TCCR1A = 0;
TCCR1B = 2;
// 0 No clock source (Timer/Counter stopped).
// 1 clkI/O/1 (No prescaling)
// 2 clkI/O/8 (From prescaler)
// 3 clkI/O/64 (From prescaler)
// 4 clkI/O/256 (From prescaler)
// 5 clkI/O/1024 (From prescaler)
// TCNT1 = 0;
// TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
// TIFR1 |= (1<<TOV1);
TCCR2A = 0;
TCCR2B = 4;
// 1 clk/(No prescaling)
// 2 clk/8 (From prescaler)
// 3 clk/32 (From prescaler)
// 4 clk/64 (From prescaler)
// 5 clk/128 (From prescaler)
// 6 clk/256 (From prescaler)
// 7 clk/1024 (From prescaler)
lcd_putmessage(0,0,0);
delay(1000);
}
//------------------------------------------------------------
void loop() {
switch(seq){
case 0: //mode select 1
case 1: //mode select 2
case 2: //mode select 3
#if DATIN==0
seq=4; //Si no hay función de grabación, se verá forzado al PLAY MODE
break;
#endif
lcd_cls();
lcd_putmessage(0,0,4);
if(seq==0) lcd_putmessage(0,1,5); //PLAY MODE
if(seq==1) lcd_putmessage(0,1,11); //remote PLAY MODE
if(seq==2) lcd_putmessage(0,1,6); //rec MODE
swoffwait();
while(1){
delay(100);
if(digitalRead(BTN_UP) == LOW){
seq++;
if(seq>2)seq=0;
break;
}
if(digitalRead(BTN_DOWN) == LOW){
if(seq==0)seq=2; else seq--;
break;
}
if(digitalRead(BTN_PLAY) == LOW){
if(seq==0)seq=4; //start play mode
if(seq==1)seq=5; //start remote play mode
if(seq==2)seq=6; //start rec mode
break;
}
}
break;
case 4: //play mode
getfilename(idx);
delay(200);
swoffwait();
if(targetfile[0]==0){//Error al obtener el nombre del archivo
idx=0;
break; //retry
}else{
lcd_cls();
lcd_putmessage(0,0,7); //PLAY LIST
lcd_putnum(10,0,idx); //index
lcd_putstr(0,1,targetfile);
}
while(1){
delay(100);
if (digitalRead(BTN_UP) == LOW){ //index+1
idx++;
break;
}
if (digitalRead(BTN_DOWN) == LOW){ //index-1
idx--;
break;
}
if (digitalRead(BTN_PLAY) == LOW){
playimagefile(); //play image file
break;
}
if( digitalRead(BTN_STOP) == LOW){
seq = 0; //back to mode select
break;
}
}
break;
case 5: //remote play mode
#if REMOTE==0
seq=4; //Fuerza PLAY MODE si no hay función REMOTE
break;
#endif
getfilename(idx);
delay(200);
swoffwait();
if(targetfile[0]==0){//error al obtener el nombre de archivo
idx=0;
break; //retry
}else{
lcd_cls();
lcd_putmessage(0,0,7); //PLAY LIST
lcd_putnum(10,0,idx); //index
lcd_putstr(0,1,targetfile);
}
while(1){
delay(100);
if (digitalRead(BTN_UP) == LOW){ //index+1
idx++;
break;
}
if (digitalRead(BTN_DOWN) == LOW){ //index-1
idx--;
break;
}
if (digitalRead(REMOTE) == LOW){ //REMOTE es ON
playimagefile(); //play image file
break;
}
if( digitalRead(BTN_STOP) == LOW){
seq = 1; //back to mode select
break;
}
}
break;
case 6: //rec mode
#if DATIN==0
seq=4; //Si no hay función de grabación, se verá forzado al PLAY MODE
break;
#endif
str_copy(targetfile,"SAV*****.CAS");
str_num2str(targetfile+3,idx);
lcd_cls();
lcd_putmessage(0,0,8); //SELECT NUMBER
lcd_putstr(0,1,targetfile);
delay(100);
swoffwait();
while(1){
if (digitalRead(BTN_UP) == LOW){
idx++;
break;
}
if (digitalRead(BTN_DOWN) == LOW){
idx--;
break;
}
if (digitalRead(BTN_PLAY) == LOW){
recimagefile(); //record image file
break;
}
if( digitalRead(BTN_STOP) == LOW){
idx = 0;
seq = 2; //back to mode select
break;
}
}
break;
}
}
//hasta aqui.
esquema
[P6mkII] Peeper Sound Player 3_PCBWay Community.png
la foto de la pantallita utilizada:
K-08896.JPG
saludos
AE-AQM1602-I2C_sch_castellano.pdf - 1 Agradecido
- msxmakers Autor
- Valoración Valoración: 7.69%
-