==================================== Demonstration vidéo Brassens Daniel Coulom - 6 juin 2015 ==================================== Ci-dessous le programme Basic à exécuter sur l'ordinateur Thomson, et le sketch à charger sur l'Arduino. La carte SD doit contenir le fichier brassens.sd, disponible à la page sdanim3-brassens de la section Programmes du site dcmoto. Pour plus d'informations sur le montage, consultez l'article "Streaming à 58824 octets/seconde" à la page Bricolage du site dcmoto. 1 '================================ 2 ' SDANIM3 3 '================================ 10 SCREEN7,0,0:LOCATE0,0,0:CLS 20 A=&H9000 30 READX$:IFX$="**"THEN99 40 POKEA,VAL("&H"+X$):A=A+1:GOTO30 99 EXEC&H9000:END 100 DATA 34,7F,1A,50,8E,1F,40,E6 101 DATA 84,63,84,E1,84,27,14,63 102 DATA 84,86,A7,1F,8B,96,C0,8A 103 DATA 01,97,C0,8E,00,00,7F,90 104 DATA 52,20,0D,86,E7,1F,8B,96 105 DATA C3,8A,01,97,C3,8E,40,00 106 DATA 4F,5F,DD,CE,C6,7F,DD,CC 107 DATA 8A,04,97,CE,97,CF,84,3F 108 DATA 97,CD,D6,CC,27,07,8A,40 109 DATA 97,CD,3A,20,09,8A,40,97 110 DATA CD,8E,40,00,20,00,84,3F 111 DATA 97,CD,D6,CC,8A,40,97,CD 112 DATA E7,84,84,3F,97,CD,96,CC 113 DATA 97,CD,2A,D2,35,FF,** /**************************************************\ * S D A N I M 3 * * (c) 2015 - Daniel Coulom * * http://dcmoto.free.fr/ * * http://forum.system-cfg.com/ * *--------------------------------------------------* * Ce code est distribue gratuitement dans l'espoir * * qu'il sera utile, mais sans aucune garantie et * * sans engager la responsabilité de l'auteur. * * Vous pouvez l' utiliser, le modifier et le * * diffuser librement, en conservant cette licence * * et les références de l'auteur dans toutes les * * copies. L'exploitation commerciale est interdite.* \**************************************************/ /*************************************************** * Version 2015.06.03 * **************************************************** Historique 2015.06.03 optimisation du code 2015.06.02 desactivation des interruptions 2015.05.23 n'utilise plus SimpleSDAudio.cpp 2015.05.19 premiere version operationnelle Communication parallele avec un ordinateur Thomson Lecture des donnees dans un fichier sur carte SD Envoi des octets sur le port D a destination du port manettes de l'ordinateur Thomson. Connexion module Catalex pour carte micro SD GND --> GND SCK --> D13 MISO --> D12 MOSI --> D11 VCC --> VCC (5V) CS --> D10 Connexion DB9 de la manette 0 1 --> D0 (RX) 2 --> D1 (TX) 3 --> D2 4 --> D3 5 --> VCC (+5V) 6 --> D8 7 --> non connecte 8 --> non connecte 9 --> GND Connexion DB9 de la manette 1 1 --> D4 2 --> D5 3 --> D6 4 --> D7 5 --> non connecte 6 --> non connecte 7 --> non connecte 8 --> non connecte 9 --> non connecte This sketch uses the SimpleSDAudio library for SD card access. Visit SimpleSDAudio website for more information: http://www.hackerspace-ffm.de/wiki/index.php?title=SimpleSDAudio */ #include #include #include #define SD_FILE "brassens.sd" uint8_t SD_L1_CardCommand(uint8_t cmd, uint32_t arg); SD_L2_File_t AudioFileInfo; uint8_t string[1024]; void setup() { int i; // compteur de boucle int index; //index dans le buffer int wait0xfe; // indicateur d'attente octet 0xfe //desactiver les interruptions noInterrupts(); // Configure pin8 as an input (thomson request) pinMode(8, INPUT); // Configure port D as an output PORTD = 0x00; DDRD = 0xff; // Initialize SD card SD_L0_CSPin = 10; SD_L2_Init(string); SD_L0_SpiSetHighSpeed(); // Search for file SD_FILE in Rootdir (=cluster 0), // search shortname files only (0x00,0x18) SD_L2_SearchFile((uint8_t *)SD_FILE, 0UL, 0x00, 0x18, &AudioFileInfo); // send CMD18 (multiblock read) uint32_t offset = AudioFileInfo.ActSector; // offset = secteur if (SD_L1_GetCardType() != SD_CARD_TYPE_SDHC) // si carte non SDHC offset <<= 9; // offset = octet SD_L1_CardCommand(18, offset); // lance CMD18 while(SD_L0_SpiRecvByte() != 0xfe); // attente octet $FE de debut de bloc uint32_t count = 0; // compteur d'echantillons while(count < AudioFileInfo.Size) // tant qu'il reste des echantillons { // remplir le buffer avec deux octets a chaque boucle // (512 octets de donnees et 2 octets de CRC) // et envoyer un seul octet par boucle sur le port D index = 0; for(i = 0; i < 257; i++) // boucle 257 fois { string[index++] = SD_L0_SpiRecvByte(); // octet lu sur la carte while(digitalRead(8) == LOW); // wait Thomson acknowledge string[index++] = SD_L0_SpiRecvByte(); // octet lu sur la carte PORTD = string[i]; // write byte to output port while(digitalRead(8) == HIGH); // wait Thomson request } // envoyer les octets suivants (lus dans le buffer) // tout en attendant l'octet 0xfe wait0xfe = 1; for(i = 257; i < 512; i++) { while(digitalRead(8) == LOW); // wait Thomson acknowledge if(wait0xfe) if(SD_L0_SpiRecvByte() == 0xfe) // lire un octet, tester 0xfe wait0xfe = 0; // raz flag d'attente 0xfe PORTD = string[i]; // load byte to send while(digitalRead(8) == HIGH); // wait Thomson request } count += 512; // 512 echantillons par boucle } } void loop(void) { }