8-канальный логический анализатор Saleae Logic.

Posted by Reason89 | Posted in ,

    В Китае был приобретен 8 канальный Логический анализатор в качестве настольного инструмента для отслеживания сигналов. Шикарная вещь, для людей, который часто работают с цифровыми протоколами передачи данных.
    Когда заказывал даже не представлял о возможностях, которые он в себе содержит.
    Начинка стандартная, тот же контроллер CY7C68012A, что и стоит во всех подобных анализаторах. Буфер на микросхеме LVC245A и память ATMLH53602.
    Поддерживает огромное количество цифровых протоколов, принимает обрабатывает и расшифровывает то, что передается по линии. Вполне наглядно можно видеть, какая посылка на  передается по линии, когда у нас что то не работает. Вплоть до скорости обмена.
    Вроде как у оригинального анализатора, который скопировали в поднебесной на плате еще установлена всевозможная защита по каналам и.т.д. Но ценник у него чуть ли не в 10 раз больше.  А возможности одинаковые.
    В комплекте сам анализатор, USB шнурок для питания и шлейф для подключения к плате.  Вскрывается легко, пайка хорошая, плата чистая(никаких следов флюса не обнаружено). Но плата в корпусе сидит не жестко, поэтому желательно в нескольких точках зафиксировать ее герметиком.
    Работать должен с такими программами как Saleae Logic и USBee Suite, но я пробовал только с первой, до второй руки так и не дошли, так как и с первой меня все более чем устроило. При подключении анализатора к ПК, он сам устанавливает все необходимые драйвера.
    В программе Saleae Logic все просто, выставляет время замера, у каждого канала выставляем назначение вывода, который мы к нему подцепили SCL, SDA, TX, RX и.т.д. Если не назначать, то он все так же прекрасно покажет, но уже не будет наглядной расшифровки передаваемых посылок. Выставлять по какому фронту срабатывать ну и много много других настроек. Частота дискретизации 24МГц, что в 99% случаев за глаза хватает. Ну и нажимаем Start.
Купить 8 Канальный логический анализатор Saleae Logic

Xmega & MAX6633 (TWI)

Posted by Reason89 | Posted in , , ,

    MAX6633 - интегральный датчик температуры с I2C интерфейсом, либо TWI кому как удобно.
    Микросхема простая до невозможности, на запрос температуры присылает  2 байта информации. Сдвигаем на три бита вправо, получаем 12 битное значение температуры плюс 1 знак(+/-).
    1 бит это 0,0625 градуса. Мне точность важна не так сильно, потому я просто полученное значение делил на 16 и получал уже температуру в привычных градусах.
    Теперь относительно TWI  в Xmega, на первый взгляд кажется дремучим лесом. Но на деле, все не так сложно. Для начала лучше всего изучить теорию TWI(I2C), если усвоить алгоритм работы протокола, то вопросов в разы будет меньше.
     Я надолго завис над одной проблемой, когда при чтении старшего байта температуры получал NAK в конце посылки. При более детальном изучении теории, я понял, что оказывается при чтении я формирую ответ, а не ведомой устройство.
    Проблему удалось быстро решить благодаря Логическому анализатору. Подпаялся к SCL и к SDA, поймал посылку. Программа, которая шла в комплекте сразу расшифровала посылку и я увидел в чем была моя проблема. Потому если у вас еще нет такого помощника, обязательно заказывайте у проверенного продавца.
    Ну и собственно исходный код инициализации и приема передачи. Делал без прерываний, так как в них не было необходимости:
// Инициализация TWI
void TWIC_init(void)
{
 TWIC.CTRL = 0;
 TWIC.MASTER.BAUD = 0x23;     // При 8 Мгц, на 100кГц = 35(0x23)
 TWIC.MASTER.CTRLA = TWI_MASTER_ENABLE_bm;
 TWIC.MASTER.CTRLB = 0;
 TWIC.MASTER.CTRLC = 0;
 TWIC.MASTER.STATUS = TWI_MASTER_RIF_bm | TWI_MASTER_WIF_bm | TWI_MASTER_ARBLOST_bm | TWI_MASTER_BUSERR_bm | TWI_MASTER_BUSSTATE0_bm;
}

// Отправка данных по TWI
void TWIC_Transiver()
{
 TWIC.MASTER.ADDR = MAX_ADDR | MAX_WRITE ;   // Отправляю адрес с командой на запись 0b10000000 
 while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm));
    
 TWIC.MASTER.DATA = MAX_Command;     // Отправляю команду 0b00000000
 while(!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm));
 
 TWIC.MASTER.ADDR = MAX_ADDR | MAX_READ ;   // Еще раз отправляю адрес с командой на чтение 0b10000001
 
 while(!(TWIC.MASTER.STATUS & TWI_MASTER_RIF_bm));  // Считываю старший байт температуры
 MSB_temp = TWIC.MASTER.DATA;
 
 TWIC.MASTER.CTRLC = 0x02;     // Выставляю ACK на линии
 
 while(!(TWIC.MASTER.STATUS & TWI_MASTER_RIF_bm));  // Считываю младший байт температуры
 LSB_temp = TWIC.MASTER.DATA;
 
 TWIC.MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;// Отправляю стоп бит
 TWIC.MASTER.CTRLC = 0;      // Обнуляю регистр NAC-ACK
 
}


Переходник USB-RS485

Posted by Reason89 | Posted in , ,


    Постепенно начал обзаводиться всевозможными электронными модулями с Китая.
Соответственно буду выкладывать не большие обзоры по работе с ними и разбор, когда как.

    Данный адаптер USB-RS485 приобретал здесь. Доставка быстрая, качество меня вполне устроило. Оба переходника пришли рабочими. Вполне компактные и удобные в обращении.
    Сам испробовал работу на скорости 1000000 бод/с(больше необходимости не было) все прекрасно работает.
     Вскрытие показало, что работает на микросхеме MAX485. Качество пайки добротное. Кому необходима более детальная информация по скоростям работы, то можете открыть даташит на нее, и увидите все характеристики.
    Для работы удобно пользоваться терминалом от Br@y++.
    С драйверами под Windows никаких проблем не возникало. Грубо говоря все работает с коробки.
    На момент покупки цена была 55р. за штуку. В наших магазинах электроники, микросхемы RS485 стоят от 80 р., причем это без USB контроллера. Поэтому считаю что дешевле купить и не заморачиваться.
    Из минусов, разве что могли что нибудь по солиднее этого зеленого терминала придумать.

Xmega: АЦП(ADC)

Posted by Reason89 | Posted in , ,

    В микроконтроллерах Xmega используется 12 разрядный АЦП, который позволяет делать нескольких сигналов одновременно. Так же в  АЦП есть усилитель, который можно использовать с целью измерения маленьких напряжений в дифференциальном режиме.
    Преобразование может производиться как в знаковом, так и без знаковом режиме.  Стоит помнить, что если АЦП использует дифференциальные входы, то должен использоваться знаковый режим, а с входами других типов можно использовать оба режима, как знаковый, так и без знаковый.
    Из таких явных неудобств, стоит обратить внимание на то, что режим преобразования устанавливается на весь АЦП, а не индивидуально для каждого канала. То есть когда один из каналов использует дифференциальный вход, АЦП должен быть введен в знаковый режим.
    На входе АЦП стоит мультиплексор, который позволяет нам оцифровывать 4 внутренних сигнала, таких как: датчик температуры, выход ЦАП, деленное на 10 напряжение питания VCC и источник опорного напряжения, плюс 16 внешних сигналов. В AVR такого и близко не было.
    Преобразование АЦП может быть запущено либо программно, запись в определенный регистр заданного значения, либо через систему событий.
    Можно использовать 4 режима измерения:
- дифференциальный вход
- дифференциальный вход с усилением
- несимметричный вход
- внутренний вход
     В качестве опорного напряжения АЦП (VREF) можно выбрать следующие напряжения:
- Точное внутреннее напряжение INT1V 1В.
- Внутреннее напряжение INTVCC VCC/1.6В.
- Внешнее напряжение, поданное на вывод AREF порта А.
- Внешнее напряжение, поданное на вывод AREF порта B.
     Описание всех регистров можно найти в документации на Xmega. Настроек на самом деле огромное количество. В сравнении с предыдущими поколениями, Xmega  позволяет настраивать все более тонко, соответственно и количество регистров здесь гораздо больше.
    Привожу функцию инициализации АЦП:

void ADC_init()
{
    ADCA.CTRLB = ADC_RESOLUTION_12BIT_gc;             // 12 бит дискретизация
    ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;  // CH0 настроен на внешний нессимметричный вход
    ADCA.PRESCALER =ADC_PRESCALER_DIV32_gc;           // Переферийная частота работы АЦП
    ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | 0x02;        // Опорное напряжение 1 В.
    ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN3_gc;         // Настраиваем как положительный вывод порта для АЦП
    ADCA.CTRLA = ADC_ENABLE_bm;                       // Активирую АЦП
} 

Xmega: AWEX

Posted by Reason89 | Posted in , ,

    Прежде чем начать работать с модулем AWEX, изучите его наличие в вашем микроконтроллере. Когда я начинал изучать AWEX я столкнулся с тем, что документация на ATXmega256A3 разнилась, в одном документе было написано что их два, на PORTC и на PORTE. После того, как мои попытки завести AWEX на PORTE не увенчались успехом. Я нашел другой доумент, где было написано, что AWEX есть только на PORTC.
  AWEX это некое расширение модуля таймера-счетчика. Используется для аппаратной генерации импульсов. Очень удобно использовать для генерации ШИМ сигнала для управления инверторами и шаговыми двигателями. Имеется возможность вставлять паузу мертвого времени и.т.д.
    Собственно простой пример:
int main(void)
{
    ClockExt8MHz();
    PORTC.DIRSET = 0xFF;
    PORTC.OUTCLR = 0xFF;
    
    TCC0.CTRLB      = TC_WGMODE_SS_gc | TC0_CCAEN_bm;
    TCC0.PER        = 512;
    TCC0.CCA        = 256;
    TCC0.CTRLA      = TC_CLKSEL_DIV1_gc;
    
    AWEXC.CTRL      = AWEX_DTICCAEN_bm;
    AWEXC.DTBOTH    = 48;
    AWEXC.OUTOVEN   = 0x03;
        
while (1)
    {
    }
}
AWEXC.CTRL = AWEX_DTICCAEN_bm  - здесь разрешаем использование на канале А, паузы неперекрытия.
AWEXC.DTBOTH - Общий регистр паузы неперекрытия
AWEXC.DTHS и AWEXC.DTLS Регистры паузы неперекрытия верзнего и нижнего уровня
AWEXC.OUTOVEN - Регистр разрешения перекрытия выходов
TCC0.CTRLB  =  TC_WGMODE_SS_gc | TC0_CCAEN_bm - запускаем режим генерации импульсов с однонаправленным счетом и активируем канал A.
    Данный пример управляет с помощью PORTC.0 и PORTC.1 двумя транзисторами в плечах преобразователя.
    Так как MOSFET транзисторы запираются не сразу, и не возникло ситуации, когда оба транзистора открыты. Необходимо выставлять паузы неперекрытия, чтобы транзистор наверняка  заперся.
Больше технической русскоязычной документации здесь