Страница 8 из 17 Первая ... 678910 ... Последняя
Показано с 141 по 160 из 335

Тема: Самодельная замена процессора ЛПМ для SONY TC-K730ES

  1. #1 Показать/скрыть первое сообщение.
    Завсегдатай
    Автор темы
    Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,722

    По умолчанию Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Поскольку разбирать этот аппарат я раздумал, то решил попробовать себя на ниве процессоро-строения.
    Точнее построению функционального аналога MB88517B-228N. Так сказать набраться опыта.
    Пока заводскую плату решил сохранить полностью.
    Заменил только кварц X701 на 8МГц. И ещё вакуумный дисплейчик счётчика ленты тоже дал дуба (перегретая нить накала). Его пока временно заменил на 4-х строчный LCD дисплей. В окончательном варианте думаю поставить 2-х строчный OLED (2х16). По размерам примерно подходит.
    Тут удачно пригодился проект линейного счётчика ленты из другой темы.

    ---------- Сообщение добавлено 21:04 ---------- Предыдущее сообщение было 21:01 ----------

    ЛПМ уже работает, счётчик считает.
    Из новых плюшек можно упомянуть сохранение состояния счётчика и RT при выключении питания.

    ---------- Сообщение добавлено 21:06 ---------- Предыдущее сообщение было 21:04 ----------

    Ещё сделал снятие с ПАУЗЫ кнопками PLAY или PAUSE. Давно хотел, чтобы так было.
    Автостоп, конечно, уже работает.

    ---------- Сообщение добавлено 21:09 ---------- Предыдущее сообщение было 21:06 ----------

    Кнопки управления режимами ЛПМ сохранены заводские. Т.е. с помощью АЦП считывается напряжение с управляемого делителя.

    ---------- Сообщение добавлено 21:12 ---------- Предыдущее сообщение было 21:09 ----------

    В данном ЛПМ нашёлся режим поиска по паузам. Это когда после включения обоих электромагнитов ЛПМ (HEAD PM и BRAKE PM) обесточить первый из них. Т.е. головки и прижимные ролики отводятся немного. Так что этого мне уже не избежать. Будет поиск.

    ---------- Сообщение добавлено 21:23 ---------- Предыдущее сообщение было 21:12 ----------

    Нажмите на изображение для увеличения. 

Название:	sony1.jpg 
Просмотров:	1282 
Размер:	190.7 Кб 
ID:	402351
    Нажмите на изображение для увеличения. 

Название:	sony3.jpg 
Просмотров:	1165 
Размер:	250.6 Кб 
ID:	402348
    Нажмите на изображение для увеличения. 

Название:	sony2.jpg 
Просмотров:	1180 
Размер:	251.0 Кб 
ID:	402352
    Нажмите на изображение для увеличения. 

Название:	proc_zam1.jpg 
Просмотров:	1241 
Размер:	162.5 Кб 
ID:	402349
    Нажмите на изображение для увеличения. 

Название:	proc_zam2.jpg 
Просмотров:	1180 
Размер:	171.3 Кб 
ID:	402350

    ---------- Сообщение добавлено 21:24 ---------- Предыдущее сообщение было 21:23 ----------

    Поскольку случай единичный, то специальную плату делать не планирую.
    Процессор взят из тумбочки, тоже никуда был не нужен. Уже раритет, но по количеству ног сгодился.

    ---------- Сообщение добавлено 21:29 ---------- Предыдущее сообщение было 21:24 ----------

    Осталось сделать функционал записи и REC_MUTE.
    И красивые менюшки.
    Потом хотелось бы сюда же и ATRS добавить, но ног уже не хватает. Возможно потребуется какой-то расширитель. Свободной памяти ещё вагон.

    Аппараты из этой темы и другой про счётчик разные. Один 700ES другой 730ES. Чтобы не было вопросов.

    ---------- Сообщение добавлено 21:45 ---------- Предыдущее сообщение было 21:29 ----------

    Три скорости ведущего вала думаю сделать здесь упрощённо. Просто коммутировать 3 разных кварца. Счётчик к 3-м скоростям уже адаптирован.

    ---------- Сообщение добавлено 21:52 ---------- Предыдущее сообщение было 21:45 ----------

    Переменную скорость перемотки тоже надо попробовать. Сейчас в режиме перемотки примерно 5,5В. Думаю до 9 поднять в начале процесса.

    ---------- Сообщение добавлено 22:04 ---------- Предыдущее сообщение было 21:52 ----------

    При попытке включения REC с выломанным язычком блокировки REC_LED быстро мигает в течении 2 сек и гаснет.

    ---------- Сообщение добавлено 13.08.2021 в 10:37 ---------- Предыдущее сообщение было 12.08.2021 в 22:04 ----------

    Провел опыт повышения питания мотора перемотки до 9В. Одна сторона кассеты С-110 стала перематываться за 1:50. А было 2:50. Солидная экономия.

    ---------- Сообщение добавлено 10:45 ---------- Предыдущее сообщение было 10:37 ----------

    При соотношении т/т=2.0 напряжение возвращал к штатному, чтобы не порвать ракорд. Считаю можно ещё поднять ступенями до 12В. Также ступенями потом и понижать. В соответствии с показаниями т/т.
    Последний раз редактировалось Turbo_man; 21.08.2021 в 17:45.

  2. #141
    Завсегдатай
    Регистрация
    20.04.2016
    Адрес
    Minsk
    Возраст
    22
    Сообщений
    5,588

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Вычисление констант на этапе компиляции - удобная штука. Когда делал дистанционку для Technics RS-B965, надо было сымитировать нажатие кнопок клавиатуры на резистивном делителе. Делал это с помощью ШИМ, формировал такое напряжение, какое будет при нажатии той или иной кнопки. Чтобы не высчитывать и не измерять эти напряжения, просто внес в текст программы номиналы резисторов делители из схемы:

    Key.h

    Код:
    //----------------------------------------------------------------------------
    
    //Декодер ДУ для Technics RS-B965 - модуль обработки кнопок, заголовочный файл
    
    //----------------------------------------------------------------------------
    
    #ifndef KeyH
    #define KeyH
    
    //----------------------------------------------------------------------------
    
    #include "Pwm.h"
    
    //----------------------------- Константы: -----------------------------------
    
    //Номиналы резисторов в делителях кнопок, кОм:
    
    #define R1  10.0
    #define R2  0.82
    #define R3  1.0
    #define R4  1.2
    #define R5  1.5
    #define R6  1.8
    #define R7  2.2
    #define R8  3.3
    #define R9  4.7
    #define R10 6.8
    #define R11 12.0
    
    //Преобразование номиналов делителя в код PWM:
    
    #define R2CODE(x, y) ((char)(MAX_PWM * (y) / ((x) + (y)) + 0.5))
    
    //Коды PWM для кнопок управления:
    
    //Выход OUT1 (pin 6):
    
    #define KEY_CRESET  R2CODE(R1, 0)
    #define KEY_CMODE   R2CODE(R1, R2)
    #define KEY_RANGE   R2CODE(R1, R2+R3)
    #define KEY_MREPEAT R2CODE(R1, R2+R3+R4)
    #define KEY_MSTOP   R2CODE(R1, R2+R3+R4+R5)
    #define KEY_OPEN    R2CODE(R1, R2+R3+R4+R5+R6+R7)
    #define KEY_MONITOR R2CODE(R1, R2+R3+R4+R5+R6+R7+R8)
    #define KEY_DIRECT  R2CODE(R1, R2+R3+R4+R5+R6+R7+R8+R9)
    #define KEY_CAL     R2CODE(R1, R2+R3+R4+R5+R6+R7+R8+R9+R10)
    #define KEY_APRS    R2CODE(R1, R2+R3+R4+R5+R6+R7+R8+R9+R10+R11)
    
    //Выход OUT2 (pin 9):
    
    #define KEY_STOP    R2CODE(R1, 0)
    #define KEY_FF      R2CODE(R1, R2)
    #define KEY_REW     R2CODE(R1, R2+R3)
    #define KEY_PLAY    R2CODE(R1, R2+R3+R4)
    #define KEY_REC     R2CODE(R1, R2+R3+R4+R5)
    #define KEY_PAUSE   R2CODE(R1, R2+R3+R4+R5+R6)
    #define KEY_DBX     R2CODE(R1, R2+R3+R4+R5+R6+R7)
    #define KEY_DOLBYC  R2CODE(R1, R2+R3+R4+R5+R6+R7+R8)
    #define KEY_DOLBYB  R2CODE(R1, R2+R3+R4+R5+R6+R7+R8+R9)
    #define KEY_MPX     R2CODE(R1, R2+R3+R4+R5+R6+R7+R8+R9+R10)
    
    //Коды RC-5 для кнопок управления:
    
    #define RC5_STOP    0x01
    #define RC5_FF      0x21
    #define RC5_REW     0x19
    #define RC5_PLAY    0x09
    #define RC5_REC     0x20
    #define RC5_PAUSE   0x11
    #define RC5_DBX     0x3a
    #define RC5_DOLBYC  0x12
    #define RC5_DOLBYB  0x03
    #define RC5_MPX     0x0a
    #define RC5_CRESET  0x13
    #define RC5_CMODE   0x1b
    #define RC5_RANGE   0x02
    #define RC5_MREPEAT 0x2b
    #define RC5_MSTOP   0x33
    #define RC5_OPEN    0x00
    #define RC5_MONITOR 0x28
    #define RC5_DIRECT  0x0b
    #define RC5_CAL     0x23
    #define RC5_APRS    0x3b
    #define RC5_ARM     0x30
    #define RC5_MSFF    0x31
    #define RC5_MSREW   0x29
    #define RC5_NO      0x08
    
    //------------------------- Прототипы функций: -------------------------------
    
    void Key_Init(void);          //инициализация модуля
    void Key_Exe(bool t, char c); //обработка кнопок
    
    //----------------------------------------------------------------------------
    
    #endif
    [свернуть]


    Затем их использовал при анализе принятых команд ДУ. Никаких вычислений делать вручную не пришлось..

    Key.c


    Код:
    //----------------------------------------------------------------------------
    
    //Декодер ДУ для Technics RS-B965 - модуль обработки кнопок
    
    //----------------------------------------------------------------------------
    
    #include "Main.h"
    #include "Key.h"
    #include "RC5.h"
    
    //----------------------------- Константы: -----------------------------------
    
    #define KEY_HOLD  120    //время удержания кнопки
    
    //----------------------------- Переменные: ----------------------------------
    
    static char Key;         //код команды
    static char PKey;        //код пост-команды
    static int KeyTimer;     //таймер удержания кнопки
    
    //------------------------- Прототипы функций: -------------------------------
    
    void Key_Release(void);  //отпускание всех кнопок
    
    //-------------------------- Инициализация: ----------------------------------
    
    void Key_Init(void)
    {
      Key = CMD_NOP;
      PKey = CMD_NOP;
      KeyTimer = 0;
      Key_Release();
    }
    
    //----------------------- Отпускание всех кнопок: ----------------------------
    
    void Key_Release(void)
    {
      Pwm_Set(OUT1, MAX_PWM);
      Pwm_Set(OUT2, MAX_PWM);
      Port_KEY_Z;
    }
    
    //------------------------- Обработка команд: --------------------------------
    
    void Key_Exe(bool t, char c)
    {
      if(t)
      {
        if(KeyTimer) KeyTimer--;
          else
          {
            Key_Release();
            if(PKey != CMD_NOP)
            {
              KeyTimer = ms2sys(KEY_HOLD);
              switch(PKey)
              {
              case RC5_FF:  Pwm_Set(OUT2, KEY_FF);  break;
              case RC5_REW: Pwm_Set(OUT2, KEY_REW); break;
              }
              PKey = CMD_NOP;
            }
            else
            {
              __sleep();
            }
          }
      }
      if(c != CMD_NOP)
      {
        if(PKey == CMD_NOP)
          KeyTimer = ms2sys(KEY_HOLD);
        if(c != Key)
        {
          Key = c;
          Key_Release();
          switch(Key & ~RC5_CTRL)
          {
          case RC5_STOP:    Pwm_Set(OUT2, KEY_STOP);    break;
          case RC5_FF:      Pwm_Set(OUT2, KEY_STOP);    PKey = RC5_FF;  break;
          case RC5_REW:     Pwm_Set(OUT2, KEY_STOP);    PKey = RC5_REW; break;
          case RC5_PLAY:    Pwm_Set(OUT2, KEY_PLAY);    break;
          case RC5_REC:     Pwm_Set(OUT2, KEY_REC);     break;
          case RC5_PAUSE:   Pwm_Set(OUT2, KEY_PAUSE);   break;
          case RC5_DBX:     Pwm_Set(OUT2, KEY_DBX);     break;
          case RC5_DOLBYC:  Pwm_Set(OUT2, KEY_DOLBYC);  break;
          case RC5_DOLBYB:  Pwm_Set(OUT2, KEY_DOLBYB);  break;
          case RC5_MPX:     Pwm_Set(OUT2, KEY_MPX);     break;
          case RC5_CRESET:  Pwm_Set(OUT1, KEY_CRESET);  break;
          case RC5_CMODE:   Pwm_Set(OUT1, KEY_CMODE);   break;
          case RC5_RANGE:   Pwm_Set(OUT1, KEY_RANGE);   break;
          case RC5_MREPEAT: Pwm_Set(OUT1, KEY_MREPEAT); break;
          case RC5_MSTOP:   Pwm_Set(OUT1, KEY_MSTOP);   break;
          case RC5_OPEN:    Pwm_Set(OUT1, KEY_OPEN);    break;
          case RC5_MONITOR: Pwm_Set(OUT1, KEY_MONITOR); break;
          case RC5_DIRECT:  Pwm_Set(OUT1, KEY_DIRECT);  break;
          case RC5_CAL:     Pwm_Set(OUT1, KEY_CAL);     break;
          case RC5_APRS:    Pwm_Set(OUT1, KEY_APRS);    break;
          case RC5_ARM:     Port_KEY_0;                 break;
          case RC5_MSFF:    Pwm_Set(OUT2, KEY_PLAY);    PKey = RC5_FF;  break;
          case RC5_MSREW:   Pwm_Set(OUT2, KEY_PLAY);    PKey = RC5_REW; break;
          }
        }
        //MCUCR |= (1 << SE);               //TODO sleep enable
      }
    }
    
    //----------------------------------------------------------------------------
    [свернуть]

  3. #142
    Завсегдатай
    Автор темы
    Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,722

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Честно говоря, малопонятно. Но круто наверно.

    Offтопик:
    Листинги СИ вводят в ступор. Нахрена там столько закорючек?
    Я думаю у вас именно поэтому и депресняк от написания софта. Вернитесь в АСМ. И жизнь заиграет новыми красками.

  4. #143
    Завсегдатай
    Регистрация
    20.04.2016
    Адрес
    Minsk
    Возраст
    22
    Сообщений
    5,588

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES


    Offтопик:
    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Листинги СИ вводят в ступор. Нахрена там столько закорючек?
    Я думаю у вас именно поэтому и депресняк от написания софта. Вернитесь в АСМ. И жизнь заиграет новыми красками.
    Шутить изволите? Посмотрел сейчас свои старые исходники на asm - там черт ногу сломит. При том, что логика программ была гораздо примитивней. Нет уж, обратно совсем не хочется.

  5. #144
    Завсегдатай
    Автор темы
    Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,722

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Не смог придумать лучше, как сделать проверку флага SREG,Z
    Но тоже работает.
    Код:
    	inc	DLIT
    	in	temp,SREG
    	sbrs	temp,fz
    	rjmp	PC+3
    	ldi temp,(1<<EST_TIMEOUT)
    	or	FLAG,temp
    Как лучше сделать? Красным уже обсудили. Понял.
    Сказывается профдеформация от ПИКов.

    ---------- Сообщение добавлено 30.09.2021 в 00:04 ---------- Предыдущее сообщение было 29.09.2021 в 23:53 ----------


    Offтопик:
    Цитата Сообщение от Leoniv Посмотреть сообщение
    Шутить изволите?
    Конечно. Но в каждой шутке есть только доля шутки.
    На новой базе знаний всё будет совсем иначе.

  6. #145
    Завсегдатай
    Регистрация
    20.04.2016
    Адрес
    Minsk
    Возраст
    22
    Сообщений
    5,588

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Не смог придумать лучше, как сделать проверку флага SREG,Z
    Копировать содержимое SREG в регистр не надо. Для проверки флага под номером Flag в регистре SREG есть свои команды:

    BRBC Flag - переход если Flag = 0
    BRBS Flag - переход если Flag = 1

    Можно также выполнить условный переход по любому биту командами SBIC, SBIS.

    Более того, для каждого флага из SREG есть своя команда:

    BRCS - переход если C = 1
    BRCC - переход если C = 0
    Для этого флага даже две команды, еще есть:
    BRLO - переход если меньше (C = 1)
    BRSH - переход если равно или больше (C = 0)
    C - флаг переноса. Используется еще в операциях сдвига.

    BREQ - переход если равно (Z = 1)
    BRNE - переход если не равно (Z = 0)
    Флаг Z устанавливается, если результат выполняемой операции равен нулю.

    BRMI - переход если отриц. результат (N = 1)
    BRPL - переход если полож. результат (N = 0)
    Флаг N устанавливается, если в результате арифметической операции старший разряд результата равен единице.

    BRVS - переход если переполнение (V = 1)
    BRVC - переход если нет переполнения (V = 0)
    Флаг V - переполнение числа в дополнительном коде.

    BRLT - переход если меньше со знаком (S = 1)
    BRGE - переход если равно или больше со знаком (S = 0)
    Флаг S - это исключающее ИЛИ между флагами N и V, этот флаг устанавливается если результат оперции меньше нуля (отрицательный).

    BRHS - переход если перенос между тетрадами (H = 1)
    BRHC - переход если нет переноса между тетрадам (H = 0)

    BRTS - переход если пользовательский флаг установлен (T = 1)
    BRTC - переход если пользовательский флаг сброшен (T = 0)

    BRIE - переход если прерывания разрешены (I = 1)
    BRID - переход если прерывания запрещены (I = 0)

    В AVR в системе команд много синонимов одних и тех же команд для более удобной и наглядной записи:

    Синонимы команд


    Код:
    Пишем           Выполняется
    -------------------------------
    tst r		and r,r
    clr r		eor r,r
    cbr r,k		andi r,(0xFF-k)
     
    clc		bclr SREG,0
    clz		bclr SREG,1
    cln		bclr SREG,2
    clv		bclr SREG,3
    cls		bclr SREG,4
    clh		bclr SREG,5
    clt		bclr SREG,6
    cli		bclr SREG,7
     
    brcc k		brbc SREG,0
    brsh k		brbc SREG,0
    breq k		brbc SREG,1
    brpl k		brbc SREG,2
    brvc k		brbc SREG,3
    brge k		brbc SREG,4
    brhc k		brbc SREG,5
    brtc k		brbc SREG,6
    brid k		brbc SREG,7
     
    ser r		ldi r,0xFF
    sbr k		ori r,k
     
    sec		bset SREG,0
    sez		bset SREG,1
    sen		bset SREG,2
    sev		bset SREG,3
    ses		bset SREG,4
    seh		bset SREG,5
    set		bset SREG,6
    sei		bset SREG,7
     
    brcs k		brbs SREG,0
    brlo k		brbs SREG,0
    brne k		brbs SREG,1
    brmi k		brbs SREG,2
    brvs k		brbs SREG,3
    brlt k		brbs SREG,4
    brhs k		brbs SREG,5
    brts k		brbs SREG,6
    brie k		brbs SREG,7
     
    lsl r		add r,r
    rol r		adc r,r
     
    st xyz,r	std xyz+0,r
    ld r,xyz	ldd xyz+0,r
    [свернуть]

  7. #146
    Завсегдатай
    Автор темы
    Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,722

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Спасибо за ваши хлопоты.

    Нашёл, наконец, подробное описание всех команд:
    http://ww1.microchip.com/downloads/e...set-manual.pdf
    Теперь буду изучать. Жаль его нет в пдф-ке на ATmega88. Видимо, слишком большой файл получился бы.
    С него бы и начинать было бы нужно.
    Сейчас увидел, что по brbc и brbs переход ограничен всего на +63/-64 адреса. Что не очень удобно. И я уже столкнулся с таким ограничением. Пришлось передвигать кусок поближе.
    Последний раз редактировалось Turbo_man; 30.09.2021 в 11:59.

  8. #147
    Завсегдатай
    Регистрация
    20.04.2016
    Адрес
    Minsk
    Возраст
    22
    Сообщений
    5,588

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Нашёл, наконец, подробное описание всех команд
    Так в хэлпе AVRStudio прекрасное описание команд, которое всегда под рукой, вызывается по F1.

    Нажмите на изображение для увеличения. 

Название:	help.gif 
Просмотров:	49 
Размер:	47.8 Кб 
ID:	405461

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Сейчас увидел, что по brbc и brbs переход ограничен всего на +63/-64 адреса. Что не очень удобно. И я уже столкнулся с таким ограничением. Пришлось передвигать кусок поближе.
    Так у любого условного ветвления. Можно использовать комбинацию Skip и Jump.

    Кстати, у меня остались со старых времен записки по AVR:

    AVR Hints


    Код:
    1. В командах sbr и cbr нужно применять не номер бита, а маску.
       Надо писать (1<<Bit) или exp2(Bit).
    
    2. В команде lpm Z операнд должен иметь значение метки * 2. 
       Память программ организована как слова, а lpm работает с байтами.
       Нужно загружать Z так: ldi ZL,low(Label*2) ldi ZH,high(Label*2).
    
    3. Для сброса флага прерывания нужно в него записать 1.
    
    4. У AVR нет приоритетов прерываний. То, что зависит от адреса вектора,
       и что обычно называют приоритетами, всего лишь порядок обработки прерываний
       при ОДНОВРЕМЕННОМ поступлении запросов. Если бы существовали приоритеты,
       то обработчик менее приортетного прерывания мог бы быть прерванным обработчиком
       более приоритетного. Но это аппаратно не реализовано (в отличие, например, от MCS-51).
       Реализовать приоритеты прерываний можно программно. В простейшем случае,
       когда требуются всего два уровня приоритета, в обработчиках менее
       приоритетных прерываний нужно разрешать вложенные прерывания командой SEI.
       В IAR для этого служит ключевое слово __nested.
    
    5. Питание портов, на которых расположены входы АЦП, осуществляется от
       AVCC/AGND. Если не подключить эти пины, то не будет работать и цифровой IO.
    
    6. В ранних AVR для EEPROM лучше не использовать ячейку 0. После операций
       с EEPROM адрес оставлять = 0. Желательно использовать внешний супервизор питания.
    
    7. Прямой операнд sbr, cbr, ldi, ori, andi, subi, sbci возможен с регистрами R16 - R31.
    
    8. Побитовая работа с портами sbi, cbi возможна в диапазоне адресов 00 - 1F.
    
    9. ADIW, SUBIW работают только с R24, 26, 28, 30.
    
    10. MOVW работает с парами четный:нечетный регистр R0:R1 и т.д.
    
    11. Команды INC/DEC не устанавливают флаг переноса.
    
    12. Команды с автоинкрементом (автодекрементом) адреса не изменяют старший байт
        регистра адреса в устройствах с памятью до 256 байт. ADIW, SUBIW - изменяют.
    
    13. Директива DB должна описывать четное количество байт, иначе добавятся 00h.
    
    14. При переходе с маленьких контроллеров без стека не забывать инициализировать стек.
    
    15. Запись в EEPROM time-controlled, надо запрещать прерывавания.
    
    16. У некоторых кристаллов (ATmega8, например) надо специально разрешать не только
        выключение WDT, но и его перепрограммирование. Эти операции time-controlled,
        надо запрещать прерывавания.
    
    17. Для 16-разрядных регистров таймера читать первым надо L, записывать первым - H.
    
    18. Если у кристалла есть JTAG, то его надо выключать фузом, иначе не работает
        соответствующие порты.
    
    19. Чтение ножки порта делается через регистр PINx, а не PORTx.
    
    20. ATmega128 программируется через RXD, TXD (это у нее SPI).
    
    21. ATmega128 имеет OC2 и OC1C на одной ноге, использовать их совместно нельзя.
    
    22. У новых ATMega UART имеет FIFO, в котором сохраняются данные и флаги ошибок (FE, DOR).
        Поэтому UDR нужно читать только один раз на один принятый байт. Флаги ошибок нужно читать
        ПЕРЕД чтением UDR.
    
    23. При использовании SPI в режиме мастера нельзя использовать вывод SS как вход для
        других целей.
    
    24. У новых кристаллов часть SFR перенесена в память. В файлах inc это отражено как
        MEMORY MAPPED. Вместо in, out нужно использовать sts, lds. Но эти команды длиннее
        на цикл. И самое главное, обращение к таким портам перестало быть атомарной операцией!
    
    25. Максимальный ток защитных диодов - 1 мА (документ AVR182).
    
    26. Чтобы сбросить пин OC после события Set OCxx on Compare Match, надо его перенастроить
        на Clear OCxx on Compare Match и дождаться события. Или инициировать событие программно
        с помощью бита Force Output Compare.
    
    27. ATmega48 не имеет поддержки бутлоадера.
    
    28. ATmega168 в отличие от ATmega48/88 имеет длину векторов прерываний 2 слова,
        а также имеет команды CALL, JMP. Все это требует перекомпиляции проекта.
    
    29. При генерации сигналов с помощью PWM нужно учесть, что допустимый диапазон
        кодов не 0..65535, а на единицу меньший.
    
    30. У новых ATmega и ATtiny при установке бита регистра PINx командой SBI
        производится инвертирование ножки порта (инвертирование бита в PORTx).
        В каких именно - надо смотреть DS, в структуре порта должен быть сигнал WPx.
        В старых кристаллах для инвертирования ножки порта надо было минимум 4 слова и 4 такта:
        in Rx,PORTx
        ldi Ry,1 << PINX
        eor Rx,Ry
        out PORTx,Rx
    
    31. Во время действия сигнала сброса потребление AVR примерно как в активном режиме,
        но может быть даже больше. Это одни из граблей при питании AVR от маломощных источников.
    
    32. В новых ATmega есть General Purpose I/O Registers: GPIOR0, GPIOR1, GPIOR2.
        Эти регистры можно использовать по своему усмотрению: для хранения глобальных
        переменных, флагов и т.д. Они бит-адресуемы и к ним могут применяться инструкции
        SBI, CBI, SBIS, и SBIC.
        Подобным образом для нужд программы можно использовать регистры периферии, которая
        не используется.
    
    33. Команды установки/сброса битов в регистре SBR, CBR влияют на регистр статуса,
        а команды установки/сброса битов в IO SBI, CBI - не влияют.
    
    34. Когда в прерывании таймера читаем АЦП, затем запускаем его и т.д., то может
        показаться, что всё нормально. Но если в системе есть другие прерывания,
        то прерывание таймера может быть отложено. Вроде бы, это не страшно,
        так как интервал на преобразование АЦП только удлиняется. Но ведь
        следующий интервал будет короче, преобразование не успеет завершиться и тогда
        прочитаем ошибочное значение. Поэтому таймер нужно сбрасывать после старта АЦП,
        чтобы получить гарантированное время для преобразования.
    
    35. В AVRStudio есть галочка "Wrap Relative Jumps" (Project->Project Settings->Code Generation).
        Дело в следующем. В теле команды RJMP/RCALL содержится 12-битное поле
        (11 бит + знак), значение которого в момент исполнения такой команды знаково
        суммируется с текущим значением програмного счетчика. Результат суммирования
        записывается обратно в програмный счетчик, который, например, в ATmega8 имеет
        длину 12 бит (4096 слов), т.е. суммирование идет в этом случае по модулю 4096.
        Если метка перехода отстояла от места ее вызова более чем на -2048/+2047,
        то ассемблер должен сообщать об ошибке типа "Relative jump too large".
        Но если разрешить "Wrap Relative Jumps", то вместо кода, эквивалентного
        RJMP PC-3456 (что некорректно), будет сгенерирован код RJMP PC+(4096-3456),
        т.е. RJMP (PC+640)mod 4096, и все будет корректно. Это можно разрешать абсолютно
        безболезненно для всех AVR с длиной Flash 4 КБ и более, а для меньшего размера Flash
        это просто не будет иметь смысла.
    
    36. При добавлении однобайтового числа к двухбайтовому обычно используют дополнительный
        обнуленный регистр:
        add zl,xl
        adc zh,r3 ;r3=0
        Можно обойтись без этого регистра:
        add zl,xl
        adc zh,xl
        sub zh,xl
    
    37. Для проверки 16-разрядного значения на ноль можно использовать такой код:
        sbiw R28,0
        breq is_zero
        Если "sbiw" не поддерживается, то:
        cpi R28,0 ;здесь можно использовать sub вместо cpi
        sbci R29,0
        breq is_zero
        Или:
        mov R16,R29
        or R16,R30
        breq is_zero
        Если исходного содержимого не жалко, то:
        or R28,R29
        breq is_zero
    
    38. Для проверки 16-разрядного значения на $FFFF можно использовать такой код:
        movw R16,R29
        adiw R16,1
        breq is_ffff
        В этом требуется свободный верхний регистр:
        mov R16,R29
        cpi R28,$FF
        sbci R16,$FF
        breq is_ffff
        В этом требуется любой регистр:
        mov R16,R28
        and R16,R29
        inc R16
        breq is_ffff
    
    39. Сформировать импульс, длительность которого можно регулировать с дискретностью
        в один такт, можно так:
        ldi xl,5 ;длительность импульса (r3=0)
        ldi zl,Low(stab)
        ldi zh,High(stab) 
        add zl,xl 
        adc zh,r3 
        sbi portb,1 ;начало импульса
        ijmp
        stab: nop
        nop
        nop
        nop 
        nop
        nop
        nop
        nop
        nop
        ...
        nop
        nop
        nop
        nop
        nop
        strob: cbi portb,1 ;конец импульса
    
    40. В AVRASM2 имеется C-style preprocessor, 
        работа с константами может выглядеть двумя способами:
        Alternative 1:
        ----------------------------------
        .equ Fclk = 16000 ;Fclk, kHz
        .equ Tbas = 5 ;time base, mS
    
        .equ T1Div = Fclk*Tbas
        .equ MAXWORD = 0xFFFF
    
        .if T1Div > MAXWORD
        .error "out of range constant"
        .endif
        -----------------------------------
    
        Alternative 2:
        -----------------------------------
        #define Fclk  16000  //Fclk, kHz
        #define Tbas  5      //time base, mS
    
        #define T1Div  Fclk*Tbas
        #define MAXWORD  0xFFFF
    
        #if T1Div > MAXWORD
        #error "out of range constant"
        #endif
        -----------------------------------
    
        Выражения с константами вычисляются в 64-разрядной сетке. Поддерживаются
        выражения с константами с плавающей запятой, хотя сами символы могут быть
        только целыми. Для приведения к целым числам есть ряд функций: int(), frac(),
        q7(), q15(), abs().
    [свернуть]

  9. #148
    Завсегдатай
    Автор темы
    Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,722

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Leoniv Посмотреть сообщение
    которое всегда под рукой, вызывается по F1.
    У меня другой современный пакет. Там этого теперь нет. Ну неважно. Теперь есть описание у меня в пдф-ке.
    Цитата Сообщение от Leoniv Посмотреть сообщение
    Так у любого условного ветвления. Можно использовать комбинацию Skip и Jump.
    Тут не понял. Можно пояснить?
    Цитата Сообщение от Leoniv Посмотреть сообщение
    Кстати, у меня остались со старых времен записки по AVR
    Спасибо. Много полезного.
    Вот это сильнее всего доставило:
    "3. Для сброса флага прерывания нужно в него записать 1." С ужасом это увидел пару дней назад.

    ---------- Сообщение добавлено 13:13 ---------- Предыдущее сообщение было 13:06 ----------

    Ещё с удивлением увидел, что флаги прерываний сами сбрасываются при исполнении. Или не так понял?

    The flag is cleared when the interrupt routine is executed.
    Alternatively, the flag can be cleared by writing a logical one to it.

  10. #149
    Завсегдатай
    Регистрация
    20.04.2016
    Адрес
    Minsk
    Возраст
    22
    Сообщений
    5,588

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Тут не понял. Можно пояснить?
    Вместо условного перехода можно использовать команду SBRC или SBRS по нужному биту SREG, за которой следует JUMP. Тогда в случае выполнения условия JUMP пропускается, а иначе выполняется переход без ограничения на расстояние.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    "3. Для сброса флага прерывания нужно в него записать 1." С ужасом это увидел пару дней назад.
    Это сделано для удобства. Вручную сбрасывать флаги прерывания есть потребность только при разрешении прерываний, чтобы очистить отложенные прерывания. И сделать это можно записью одного и того же числа в регистр флагов и регистр масок. Где в числе единицы, те флаги сбросятся и те маски установятся.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Ещё с удивлением увидел, что флаги прерываний сами сбрасываются при исполнении. Или не так понял?
    А что удивляет? Все логично - начал выполнятся обработчик, флаг сбросился.

  11. #150
    Завсегдатай
    Автор темы
    Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,722

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Leoniv Посмотреть сообщение
    Это сделано для удобства.
    только так и остаётся, раз нет побитного сброса у этих регистров.
    Цитата Сообщение от Leoniv Посмотреть сообщение
    Где в числе единицы, те флаги сбросятся и те маски установятся.
    А запрет?

    ---------- Сообщение добавлено 14:15 ---------- Предыдущее сообщение было 14:14 ----------

    Цитата Сообщение от Leoniv Посмотреть сообщение
    А что удивляет?
    Многое. Для привыкших к командам PIC. Получаются многие вещи инвертированы. Как будто нарочно они договаривались. Например флаг С при выполнении вычитаний.

  12. #151
    Завсегдатай
    Регистрация
    20.04.2016
    Адрес
    Minsk
    Возраст
    22
    Сообщений
    5,588

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    А запрет?
    Запрет прерывания делается записью 0 в нужной позиции в регистр маски.

  13. #152
    Завсегдатай
    Автор темы
    Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,722

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Логично. Только неудобно сделать.

    Добавлю табличку кодов SIRC для 4-х пультов SONY в своей нотации битов. Так удобнее работать.
    Вдруг кто-то тоже решит сам сделать приёмник-декодер.
    Вложения Вложения

  14. #153
    Завсегдатай
    Регистрация
    20.04.2016
    Адрес
    Minsk
    Возраст
    22
    Сообщений
    5,588

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Логично. Только неудобно сделать.
    Запрещение прерываний таймера 0 получается как-то так:

    in temp,TIMSK
    andi temp,~(1<<TOIE0)
    out TIMSK,temp

    Если закорючками, то так:

    TIMSK &= ~(1<<TOIE0);

  15. #154
    Завсегдатай
    Автор темы
    Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,722

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Проверил в железе свой великий труд.
    1. Все 4 пульта работают как надо. Уже хорошо.
    2. Из неработающего: пока почему-то не срабатывает дезактивирование пультов. Сколько ни держи нажатой кнопку STOP. Буду искать ошибку.
    3. Из непонятного: подтяжки при старте подключаются по-любому. Надо разбираться с этими регистрами портов. Их там всего три на каждый порт или всё же больше?
    4. Из ещё не сделанного: чтение и запись регистра вкл/выкл ДУ в EEPROM.

  16. #155
    Завсегдатай
    Регистрация
    20.04.2016
    Адрес
    Minsk
    Возраст
    22
    Сообщений
    5,588

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    3. Из непонятного: подтяжки при старте подключаются по-любому. Надо разбираться с этими регистрами портов. Их там всего три на каждый порт или всё же больше?
    На каждый порт 3 регистра: PORTx, DDRx, PINx. После сброса во всех этих регистрах нули, поэтому порты включены на ввод и подтяжки выключены. Если подтяжки включаются, значит где-то есть запись 1 в PORTx.

    Есть еще возможность выключить все подтяжки разом - если установить бит PUD = 1 в регистре MCUCR.

  17. #156
    Завсегдатай
    Автор темы
    Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,722

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Leoniv Посмотреть сообщение
    значит где-то есть запись 1 в PORTx.
    Да, конечно. Сам виноват.
    Код:
    Вот так было:
    	mov	temp,VIHOD_B
    	andi temp,0b00111110
    	out	DDRB,temp
    	com	temp
    	out	PORTB,temp
    ;---------------------------------
    Переделал на так, должно по идее помочь:
    	mov	temp,VIHOD_B
    	andi temp,0b00111110
    	out	DDRB,temp
    ;---
    	com VIHOD_B
    	in	temp,PORTB
    	and	temp,VIHOD_B
    	out	PORTB,temp
    	com VIHOD_B
    Последний раз редактировалось Turbo_man; 30.09.2021 в 20:05.

  18. #157
    Завсегдатай
    Регистрация
    20.04.2016
    Адрес
    Minsk
    Возраст
    22
    Сообщений
    5,588

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    and temp,PORTB
    Транслятор такое не пропустит, это команда регистр-регистр.

    Если я правильно понял задачу, то как-то так.
    Регистр Rem_Outs_B портится, можно сделать ему PUSH - POP, или задействовать temp1, если есть.

    Код:
    .equ	MASK_B = 0b00111110
    .def    Rem_Outs_B      = r22
    
    	mov temp,Rem_Outs_B			;активные выходы = 1
    	andi temp,MASK_B			;маска портов, используемых ДУ
    	out DDRB,temp				;вывод 0 на активные порты
    	com Rem_Outs_B				;неактивные выходы = 1 (где нужны подтяжки)
    	andi Rem_Outs_B,MASK_B		;маска портов, используемых ДУ
    	in	temp,PORTB				;чтение порта B
    	andi temp,~MASK_B			;обнуление битов портов ДУ
    	or temp,Rem_Outs_B			;добавление битов подтяжек
    	out	PORTB,temp				;вывод в порт подтяжек, остальное не трогаем

  19. #158
    Завсегдатай
    Автор темы
    Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,722

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Leoniv Посмотреть сообщение
    Транслятор такое не пропустит, это команда регистр-регистр.
    Да, вы правы не до той точки сделал UNDO. Текст выше поправил.
    Свой вариант переделки сейчас проверю в железе и напишу.

    ---------- Сообщение добавлено 20:40 ---------- Предыдущее сообщение было 20:06 ----------

    Пишу. По моему поправленному варианту всё вышло.
    Я не хотел использовать новые РОНы, т.к. уже нет свободных.
    В моём поправленном варианте нет маски на VIHOD_B перед отправкой в PORTB, но это поправлю, если будет нужно.

    ---------- Сообщение добавлено 20:47 ---------- Предыдущее сообщение было 20:40 ----------

    VIHOD_B или VIHOD_C содержат только 1-цу нажатой кнопки в нужном бите. При отпускании обнуляются. В старом ПИКовском варианте были триггерные выходы тоже. Поэтому могло быть несколько 1-ц. А сейчас только 1 или 2, если 1 кнопка ДУ на 2 выхода МК транслируется.

    ---------- Сообщение добавлено 22:29 ---------- Предыдущее сообщение было 20:47 ----------

    Почему-то не пропускает компилятор эту команду:
    sbr VIHOD_B,(1<<PLAY)
    где .def VIHOD_B = r1
    Что не так?

    Приходится делать так:
    ldi temp,(1<<PLAY)
    or VIHOD_B,temp
    -------------------------------------
    А эту пропускает:
    sbr RC_OK,(1<<EST_RC_CD)
    .def RC_OK = r25

    ---------- Сообщение добавлено 01.10.2021 в 00:48 ---------- Предыдущее сообщение было 30.09.2021 в 22:29 ----------

    Всё починил. Но вопрос выше остался.
    Осталось только сделать чтение/запись ЕЕ-пром.

    ---------- Сообщение добавлено 01:20 ---------- Предыдущее сообщение было 00:48 ----------

    файл *.eep не создаётся, хотя 1 ячейка .eseg задана.
    Код:
    ;----------------------------------------------------------------------------
    ;EEPROM:
    .eseg
    .org	0
    .db		15
    ;-------------------------------------------------------------------------
    Последний раз редактировалось Turbo_man; 30.09.2021 в 22:45.

  20. #159
    Старый знакомый Аватар для DrLithium
    Регистрация
    24.12.2006
    Адрес
    SPb
    Сообщений
    664

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Почему-то не пропускает компилятор эту команду:
    sbr VIHOD_B,(1<<PLAY)
    где .def VIHOD_B = r1
    Что не так?
    sbr требует hreg, а ваш r1 ни разу не старший - просто reg. Младшие r0-r15 с урезанным применением, в справочнике можно заметить, что далеко не все команды с ними работают. Часто аргумент через Temp(r16) приходится бросать в команду при дефиците свободных hreg. Где-нить например, в динамической индикации.

    З.Ы. Не могу не съязвить: Turbo_man-а на AVR ассемблер развели! Ура ё-маё!

  21. #160
    Завсегдатай
    Регистрация
    20.04.2016
    Адрес
    Minsk
    Возраст
    22
    Сообщений
    5,588

    По умолчанию Re: Самодельная замена процессора ЛПМ для SONY TC-K730ES

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Почему-то не пропускает компилятор эту команду:
    sbr VIHOD_B,(1<<PLAY)
    где .def VIHOD_B = r1
    Что не так?
    Пункт 7 из AVR tips.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    файл *.eep не создаётся, хотя 1 ячейка .eseg задана.
    Файл .eep в AVRStudio создается автоматически при использовании сегмента eseg (по крайней мере, у меня так). Если просто зарезервировать память, то файл будет пустой.

    .ESEG
    EVar1: .byte 1

    Если задать начальные значения, то они попадут в этот файл.

    .ESEG
    EVar1: .db 25

    Но смысла использовать файл eep я не вижу, если только там не планируется хранить какие-то большие массивы данных, для которых жалко места в памяти программ. Обычно значения по умолчанию для EEPROM храню в памяти программ, для прошивки устройства хватает одного hex. В любом устройстве, где используется EEPROM, очень желательно иметь функцию "Вернуться к настройкам по умолчанию". Это будет невозможно, если инициализаторы EEPROM хранятся в отдельном файле. Тогда для сброса в dafault потребуется программатор, что абсурд. Поэтому инициализаторы должны быть в памяти программ. При первом старте проверяется или контрольная сумма EEPROM, или сигнатура (что проще и вполне достаточно). Если инициализации не было, записываю начальные значения.

    В Си отдельный файл для EEPROM создается, когда значения EEPROM-переменных инициализированы. Но я специально от этого отказываюсь, объявляя их как __no_init __eeprom int EVar;

    Цитата Сообщение от DrLithium Посмотреть сообщение
    З.Ы. Не могу не съязвить: Turbo_man-а на AVR ассемблер развели! Ура ё-маё!
    Еще бы на Си развести. Тогда не надо было бы разбираться со всей этой ерундой типа "верхние регистры", "нижние регистры" и т.д. Негоже человеку тратить свою жизнь на такие вещи, пусть этим занимается бездушная машина.

Страница 8 из 17 Первая ... 678910 ... Последняя

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •