dllbridge

AY_LPT_06_test

Mar 29th, 2026 (edited)
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.96 KB | None | 0 0
  1. //  Работает !
  2. // === ПОДКЛЮЧЕНИЯ ===
  3. // D0 YM -> D2 Arduino (PD2)
  4. // D1 YM -> D3 Arduino (PD3)
  5. // D2 YM -> D4 Arduino (PD4)
  6. // D3 YM -> D5 Arduino (PD5)
  7. // D4 YM -> D6 Arduino (PD6)
  8. // D5 YM -> D7 Arduino (PD7)
  9. // D6 YM -> D8 Arduino (PB0)
  10. // D7 YM -> D9 Arduino (PB1)
  11. // BC1   -> D11 Arduino (PB3)
  12. // BDIR  -> D12 Arduino (PB4)
  13. // CLOCK -> D10 Arduino (PB2)
  14. // RESET -> D13 Arduino (PB5)
  15.  
  16. // Определяем маски для порта B
  17. #define BDIR_BIT   (1 << 4)  // PB4 (D12)
  18. #define BC1_BIT    (1 << 3)  // PB3 (D11)
  19.  
  20. ///////////////////////////////////////////////////////////
  21. #define SET_DATA(value) { \
  22.   uint8_t  low_byte = (value) & 0x3F;                    \
  23.   uint8_t high_bits = ((value) >> 6) & 0x03;             \
  24.   PORTD = (PORTD & 0x03) | ((low_byte & 0x3F) << 2);     \
  25.   PORTB = (PORTB & 0xFC) | ((high_bits & 0x03) << 0);    \
  26. }
  27.  
  28. /////////////////////////////////////////////////////////////
  29. // ИСПРАВЛЕННЫЙ макрос SET_CTRL - без if, только битовые операции
  30. #define SET_CTRL(bdir, bc1) { \
  31.   PORTB = (PORTB & ~(BDIR_BIT | BC1_BIT)) | ((bdir) ? BDIR_BIT : 0) | ((bc1) ? BC1_BIT : 0); \
  32. }
  33.  
  34. const uint8_t ay_data_01[] = { 15, 0, 0x01, 0x50, 196, 16, 16, 16, 184, 0, 0, 0x50, 0, 1, 0, 48 };
  35.  
  36. //////////////////////////////////////////////////////////////
  37. void write_ym(uint8_t reg, uint8_t value) {
  38.   // --- Шаг 1: Выбор регистра (Address Latch) ---
  39.   SET_DATA(reg);                    // Выставляем номер регистра
  40.   SET_CTRL(1, 1);                   // BDIR=1, BC1=0
  41.   //asm volatile("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop");
  42.   //delayMicroseconds(10);
  43.   SET_CTRL(0, 0);                   // Возврат в нейтральное состояние
  44.  
  45.   // --- Шаг 2: Запись данных (Data Write) ---
  46.   SET_DATA(value);                  // Выставляем данные
  47.   SET_CTRL(1, 0);                   // BDIR=1, BC1=1
  48.   //asm volatile("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop");
  49.   //delayMicroseconds(10);
  50.   SET_CTRL(0, 0);                   // Возврат в нейтральное состояние
  51. }
  52.  
  53. /////////////////////////////////////////////////////////////////////////
  54. void setup() {
  55.   // --- 1. Настройка пинов как выходы ---
  56.   DDRD |= 0xFC;                     // D2-D7 (PD2-PD7) как выходы
  57.   DDRB |= 0x3F;                     // D8-D13 (PB0-PB5) как выходы
  58.  
  59.   // --- 2. Настройка тактового генератора 2 МГц на D10 ---
  60.   TCCR1A = _BV(COM1B0);             // Переключать OC1B (D10) при совпадении
  61.   TCCR1B = _BV(WGM12) | _BV(CS10);  // CTC, предделитель 1
  62.   OCR1A = 3;                        // Верхнее значение счетчика
  63.   //OCR1B = 3;                        // Обязательно для OC1B!
  64.  
  65.   // --- 3. Сброс YM2149F ---
  66.   pinMode(13, OUTPUT);
  67.   digitalWrite(13, LOW);  delay(10);
  68.   digitalWrite(13, HIGH); delay(10);
  69.  
  70.   // Небольшая задержка после сброса
  71.   delay(100);
  72.  
  73.   // --- 4. Инициализация регистров ---
  74.   for (int reg = 15; reg >= 0; reg--) {
  75.     write_ym(reg, ay_data_01[15 - reg]);
  76.     delayMicroseconds(100);
  77.   }
  78.   delay(1500);
  79.  
  80. }
  81.  
  82. ////////////////////////////////////////////////////////////////////////
  83. void loop() {
  84.   write_ym(15, 170);    delay(700); // 0xAA
  85.   write_ym(15,  85);    delay(700); // 0x55
  86.   write_ym(15, 240);    delay(700); // 0xF0
  87.  
  88.   write_ym(15,   1);    delay(700); // Port_B_AA: бит 0
  89.   write_ym(15, 128);    delay(700); // Port_B_55: бит 7
  90.   write_ym(15,   1);    delay(700);
  91.   write_ym(15, 128);    delay(4177);
  92. }
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125. /// 2026  mart 29
  126.  
  127. // Макросы для быстрого переключения пинов YM
  128. #define YM_PORT_DATA  (PORTD)
  129. #define YM_PIN_DATA_MASK 0xFC    // PD2–PD7: биты 2–7
  130. #define YM_PIN_DATA_SHIFT 2      // сдвиг на 2 бита
  131.  
  132. #define YM_PORT_CTRL  (PORTB)
  133. #define YM_PIN_BC1    (1<<3)      // PB3
  134. #define YM_PIN_BDIR   (1<<4)      // PB4
  135.  
  136. // Установка байта на D0–D7 (младший байт данных/адреса)
  137. static inline void ym_set_data(uint8_t data) {
  138.   // младшие 6 бит → PD2–PD7
  139.   uint8_t d_lower = (data & 0x3F) << YM_PIN_DATA_SHIFT;
  140.   // оставшиеся 2 бит → PB0,PB1
  141.   uint8_t d_high = (data & 0xC0) >> 6;  // 0x00, 0x01, 0x02, 0x03
  142.   PORTD = (PORTD & 0x03) | d_lower;
  143.   PORTB = (PORTB & 0xFC) | d_high;
  144. }
  145.  
  146. // Перейти в режим Address
  147. static inline void ym_mode_address() {
  148.   YM_PORT_CTRL |= YM_PIN_BDIR;    // BDIR = HIGH
  149.   YM_PORT_CTRL |= YM_PIN_BC1;     // BC1  = HIGH
  150.   delayMicroseconds(1);           // запас времени, чтобы YM увидел Address
  151. }
  152.  
  153. // Перейти в режим Write
  154. static inline void ym_mode_write() {
  155.   YM_PORT_CTRL |= YM_PIN_BDIR;    // BDIR = HIGH
  156.   YM_PORT_CTRL &= ~YM_PIN_BC1;    // BC1  = LOW
  157.   delayMicroseconds(1);           // запас времени, чтобы YM увидел Write
  158. }
  159.  
  160. // Запись байта в регистр YM2149F (регистр 0–15, data 0–255)
  161. void ym_write_register(uint8_t reg, uint8_t data) {
  162.   reg &= 0x0F;                    // YM имеет 16 регистров
  163.  
  164.   // 1) MODE ADDRESS
  165.   ym_mode_address();
  166.   ym_set_data(reg);               // на шину D0–D7 выставляем адрес
  167.  
  168.   // 2) MODE WRITE
  169.   ym_mode_write();
  170.   ym_set_data(data);              // теперь выставляем реальные данные
  171.  
  172.   // YM требует минимального времени удержания данных (tow ~300 нс),
  173.   // delayMicroseconds(1) после set_data уже достаточно.
  174.   asm volatile("nop" : : : "memory");  // антиматериал
  175. }
Advertisement
Add Comment
Please, Sign In to add comment