Jump to content

Видеокурс по AVR-микроконтроллерам для начинающих


 Share

Recommended Posts

40 минут назад, Alex сказал:

Вы хоть открывали даташит на МК, с которым работаете ? Или считаете, что это - ненужное убивание времени ?

А зачем Вы всё это спрашиваете?
Вы же ярлыков на меня навесили, сами же эти ярлыки раскритиковали...
У меня такое впечатление, что Вы разговариваете сами с собой, как говорится самообслуживание.
Зачем Вам мои ответы?
Тем более что я вам ещё "дал сдуру" лишний повод для насмешек ...
Продолжайте...
---------------------
А если всё-таки кто-нибудь захочет ответить "по сути", буду очень рад помощи.

Link to comment
Share on other sites

1 час назад, COKPOWEHEU сказал:

В даташите, естественно. Там и рекомендуемая частота АЦП указана, и время выборки, и время преобразования. Зачем еще и форум подобным засорять?

 

51 минуту назад, Юрий_Нд сказал:

 Ну да конечно, с такими советами можно форум вообще закрывать.
 А впрочем я не буду Вас переубеждать, это бесполезно.

Ну так относится к даташитам нельзя. К примеру, используемая в этих видеоуроках библиотека ПОЛНОСТЬЮ написана по данным даташита на Nokia 5110.

Мир не без добрых людей!

Link to comment
Share on other sites

31 минуту назад, gogaze сказал:

Ну так относится к даташитам нельзя.

А Вы можете что-то процитировать из того, что я сказал неуважительно про datasheet.
Только пожалуйста, не цитируйте мне ярлыки которые на меня понавесили.

Link to comment
Share on other sites

Разработка преобразователей на основе карбид-кремниевых приборов с помощью симулятора SpeedFit 2.0

Компания Wolfspeed разработала бесплатный онлайн симулятор SpeedFit 2.0, позволяющий разработчикам быстро и всесторонне оценить параметры основных процессов, происходящих в силовой части импульсных преобразователей электрической энергии, и сравнить между собой различные варианты реализации поставленного технического задания.

Подробнее

Мой пост выше посмотри. Тебе COKPOWEHEU сказал про даташит, а ты ответил:  "Ну да конечно, с такими советами можно форум вообще закрывать." В определенных кругах на это бы сказали: "Фильтруй базар!"
 

Edited by gogaze

Мир не без добрых людей!

Link to comment
Share on other sites

Приглашаем на вебинар «Необычное в обычном. Сравнительный анализ современных решений Recom» (27.01.2022)

Приглашаем 27/01/2022 всех желающих посетить вебинар, посвященный двум наиболее растущим сегментам интегрированных источников питания – AC/DC малой мощности (1-20Вт) и сегменту решений PoL без изоляции. На вебинаре рассмотрим проблему выбора AC/DC в бюджетном сегменте и концепцию тестирования ускоренного старения, проведем сравнительный анализ подходов к интеграции AC/DC модулей. Сделаем обзор решений концепции POL с доисторических времен до современных технологий и средств для разработки и тестирования.

Подробнее

Всё верно, не отказываюсь от своих слов. Могу только ещё раз повторить их.
Ты же в семнадцатом году не по datasheet-ам писал программу счётчика ампер-часов?
Или уже призабыл?
И вообще,  извини пожалуйста, но при всём моём уважении, эти пустые разговоры слишком много отнимают времени.
Ну не хочет человек делиться знаниями опытом, ну так и будет. Что тут поделаешь?
Это скорее вопрос не не к конкретному участнику форума или даже модератору, а к администрации форума.

Link to comment
Share on other sites

Способы повышения КПД и удельной мощности инверторов для солнечных электростанций

Какую элементную базу выбрать для проектирования инверторов для солнечных батарей – новую карбид-кремниевую или традиционную кремниевую? Специалисты Infineon приходят к неожиданному выводу: традиционная кремниевая может помочь достичь КПД 99%. Но для этого следует применить сравнительно новую схему многоуровневого преобразования, которая может оказаться непростой для начинающего разработчика.

Подробнее

12 минут назад, Юрий_Нд сказал:

эти пустые разговоры слишком много отнимают времени.

Согласен! Отваливаю из обсуждения.

15 минут назад, Юрий_Нд сказал:

не по datasheet-ам писал программу счётчика ампер-часов?

Потому что ни в одном даташите про это не написано.

Мир не без добрых людей!

Link to comment
Share on other sites

Разработка преобразователей на основе карбид-кремниевых приборов с помощью симулятора SpeedFit 2.0

Компания Wolfspeed разработала бесплатный онлайн симулятор SpeedFit 2.0, позволяющий разработчикам быстро и всесторонне оценить параметры основных процессов, происходящих в силовой части импульсных преобразователей электрической энергии, и сравнить между собой различные варианты реализации поставленного технического задания.

Подробнее

3 часа назад, Alex сказал:

И это говорит человек с тремя техническими "вышками" ? :rake:

Сдается мне, "вышки" он просто-напросто купил. Потому что чтобы их получить честно, нужно читать, и весьма немало.

3 часа назад, Alex сказал:

Вы хоть открывали даташит на МК, с которым работаете ? Или считаете, что это - ненужное убивание времени ?

Да зачем! Можно ведь на форуме вопрос задать, поклянчить "помогите люди добрые", авось какой дурак да сделает работу Юрий_Нд за него бесплатно.

3 часа назад, Юрий_Нд сказал:

Ну да конечно, с такими советами можно форум вообще закрывать.

То есть по-вашему форум это место, где бесплатно пересказывают даташит?

Нет, не угадали. Форум - это место, где рассматривают места, а документации НЕ освещенные или освещенные слабо.

---

Ладно, если вы упорно игнорируете ценные советы, не буду тратить силы попусту.

На всякий случай уточню: я не говорил, что не буду писать в этой теме и не говорил, что не буду издеваться над очередным воинствующим неучем.

Кстати! Юрий_Нд, вы там неких Ассемблера и pcmax (один на ЛОРе, второй на Киберфоруме) не знаете? А то очень похожи по стилю, только те двое код для stm32 пытались наклянчить, а вы, похоже, в железо ударились.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Link to comment
Share on other sites

5 часов назад, Юрий_Нд сказал:

А зачем Вы всё это спрашиваете?

Да потому, что любой образованный человек (тем более технарь !) первым делом, за ответами, идёт к литературе ! А для Вас она (литература), как для малышей, - обуза, в которую все и везде посылают.

Link to comment
Share on other sites

ни одна "вышка" не может дать ВЕСЬ объем информации.

поэтому главная задача любой "вышки" научить человека действовать самостоятельно и самообразовываться.

а если взять заочников, то они не слушают лекции и не пишут конспекты лекций - они полностью самообразовываются.

но тут все три "вышки" потратили время зря ...

и получить три красных диплома, не умея действовать самостоятельно - из области фантастики.

и еще, к тому же, категорический отказ действовать самостоятельно.

даже отправку почитать даташит называет отказом от помощи и нежеланием делиться опытом и знаниями.

научить его мы все равно не научим. самостоятельных действий мы все равно не дождемся, вопросы будут на каждое "телодвижение" и вопросы растянутся на несколько лет.

и, в общем, тут будет пустая трата нашего времени.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Link to comment
Share on other sites

12 часов назад, Starichok сказал:

получить три красных диплома, не умея действовать самостоятельно - из области фантастики.

Вовсе нет. :)

Есть и такой типаж. Встречал лично. Они прекрасно умеют сдавать экзамены. Но в том, что хоть незначительно отличается от этого процесса, вполне себе упешно "плавают".

Link to comment
Share on other sites

  • 1 month later...

Добрый день, попросили разобраться с программой, я сам в этом не соображаю, сможете помочь? Вот это устройство Тут есть программа, но есть 2 вопроса:
1. Зачем там нужна задержка 
2.И зачем там sei cei

 

Спойлер

//Подключаем библиотеки

#include <avr/io.h> //Библиотека ввода/вывода

#include <avr/interrupt.h> //Библиотека прерываний

 

//Перечисляем наши переменные

int x, s; //Переменные

#define R_division 1 //константа делителя для АЦП

unsigned int u=0; //Глобальная переменная с содержимым преобразования

#define nop() {asm("nop");} //Функция из ассемблера для задержки

 

//Перечисляем прототипы функций

void delay(int t); //Функция задержки

unsigned int getADC(); //Функция извлечения значения с АЦП

 

 

//Функция задержки

void delay(int t)

{

for (x=t; x>0 ;x--)

nop ();

}

 

//Считывание АЦП

unsigned int getADC(void)

{

unsigned int v;

ADCSRA|=(1<<ADSC); //Начать преобразование

while ((ADCSRA&_BV(ADIF))==0x00); //Дождатся окончания преобразования

v=(ADCL|ADCH<<8);

return v;

}

 

//Главная функция программы

int main (void)

{

DDRB = 0b11110011; //Конфигурирование направления данных портов

PORTB = 0xFE; //Присваиваем начальное значение порту

 

//Настройка таймера на генерацию сигнала 36кГц

TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);

TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10);

OCR1A = 111;

ICR1 = 222;

 

//Конфигурирование АЦП микроконтроллера

ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0);

//Включаем АЦП, тактовая частота бреобразователя =/8 от тактовой микроконтроллера

ADMUX=(1<<REFS1)|(1<<REFS0)|(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3);

//Внутренний источник опорного напряжения Vref=2,56, входом АЦП является PC0

 

sei(); //Глобальное разрешение прерываний

 

//Вечный цикл

while(1)

{

cli(); //Запрещение прерываний на время выполнения кода ниже

double voltage=0; //Переменная для напряжения на входе АЦП

u = getADC(); //Присваиваем переменной результат выполнения функции получения данных с АЦП

 

voltage= R_division*2.56*u*1.024; //Расчет напряжения

 

if(voltage>4) //Если напряжение выше 4Вольт

{PORTB = 0x00;} //тушим порт

else //Если нет

/*

if(voltage>2)

{PORTB = 0x30;}

else

if(voltage>3)

{PORTB = 0x70;}

else*/

{PORTB = 0xF0;} //Зажигаем порт

 

}

sei(); //Разрешаем глобально прерывания

 

}

 

Терпение и труд всё перетрут!

Link to comment
Share on other sites

22 минуты назад, NEOH сказал:

Тут есть программа

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

Edited by Огонёк
Link to comment
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

  • Сообщения

    • С какого перепугу должно увеличиться питание от питающей обмотки?) 
    • Чуть выше вы говорили что у вас один индикатор. Определитесь с начала какой именно общий анод или общий катод. Или хотите и тот и другой. Какое питание у контроллера? И если у вас два индикатора и динамическая индикация то ток через сегмент будет в два раза выше иначе упадет яркость. Соответственно для коммутации общих выводов ток соответственно будет ток сегмента умноженый на семь. Для комутации индикаторов  в любом случае потребуется транзистор. Если программу будете писать сами ставьте две MBI-ки и не мучайтесь. Будет все компактно и просто.  
    • Привет всем! Извиняюсь, совсем не видел ответов. Перемотал трансформатор с другим расчётом и другим проводом - теперь литц из жил 0,16мм на всех обмотках. Мотал под 4А/мм2. Индукция получилась 0,145T. Резонансная частота 89,1 кГц, максимальный Gain 1.3, m=5.55. Первичка 528 uH, индуктивность рассеивания 95 uH, делал с секционированием. Попробовал поменять выходные конденсаторы. Было 2 шт по 1800 реальных мкФ, LowESR, сейчас поставил один супер высокотоковый Epcos 1400 мкФ с ESR 3,5 мОм. Зашунтировал керамикой по 4,7 мкФ 50V - 5 штук. Добавил конденсатор на 1nF 2kV между горячей и холодной землёй. Поменял ключи в синхронном выпрямителе с IRL3705 (55V 86A 10мОм 3,6pF) на IPP032N06N3G (60V 120A 2.9мОм 10,6nF). Добавил дополнительно маломощные Шоттки между DS транзисторов (шунт внутреннего диода). В затворы воткнул по 3 Ом резистору. Замеры КПД и температур: Voltage: 27V; Current: 2A, 4A, 6A, 8A, 10A, 12A. Температура воздуха: 23С (без обдува и сквозняка); Замер и повышение нагрузки каждые 15 мин. 54W /// 59.76W = 90.88%  //  Mosfet 36   // Cap 29  //  Trans 42  //  FSFR 34  //  Bridge 30  //  Coil 34  //  PFC-Mos 31 108W / 116.30W = 92.86%  //  Mosfet 43  //  Cap 31  //  Trans 48  //  FSFR 38  //  Bridge 31  //  Coil 31  //  PFC-Mos 31 162W / 172.90W = 93.64%  //  Mosfet 51  //  Cap 39  //  Trans 50  //  FSFR 39  //  Bridge 36  //  Coil 36  //  PFC-Mos 35  216W / 229.75W = 94.02%  //  Mosfet 60  //  Cap 48  //  Trans 60  //  FSFR 46  //  Bridge 40  //  Coil 43  //  PFC-Mos 38 270W / 287.35W = 93.96%  //  Mosfet 69  //  Cap 52  //  Trans 80  //  FSFR 55  //  Bridge 45  //  Coil 45  //  PFC-Mos 43 324W / 345.80W = 93.70%  //  Mosfet 79  //  Cap 59  //  Trans 88  //  FSFR 65  //  Bridge 50  //  Coil 53  //  PFC-Mos 48 -------------------------------------------------------------------------------------------------------------------------- *Mosfet - радиатор выходных мосфетов SR *Cap - верхняя часть выходного конденсатора Epcos *Trans - самая горячая часть силового трансформатора - поверхность вторичной обмотки. *FSFR - радиатор контроллера LLC FSFR2100U *Bridge - радиатор входного моста *Coil - верхняя часть кольца APFC *PFC-Mos - радиатор мосфета и диода APFC ------------------------------------------------------------------------------------------------------------------- @sashka сделал для тебя замеры. Пульсации по большей части вызваны очень скромной ёмкостью корректора, всего 150 мкФ. Увы без сильных пульсаций на низкой нагрузке не получается (только если частоту не задрать), так что там работает пакетный режим. БП делается для светодиода, там мне не принципиальны пульсации такой величины.  
    • Дело не в мощности рассеяния. Была статья по реле, почему слаботочные плохо подходят для коммутации нагрузок УМЗЧ.
    • И такое бывает)  Пока ковырялся, нашёл ещё два битых резистора, в базах ВК. Но ТП всё равно не хочет выставляться. Сегодня после работы надеюсь добью его. Или выкину на фиг))))) 
    • @drubtsow зачем красить? для красоты?
    • @kurok а теперь правильно сформулируйте вопрос.
  • Similar Content

    • By Super Akk
      Здравствуйте, я работаю в Proteus и у меня возникла ошибка Simulation is not running in real time due to excessive CPU load
      Подскажите пожалуйста как её исправить
      Код прошивки:
      #include <lm3s300.h> // Graphic Display functions #include <glcd.h> // Font used for displaying text // on the graphic display #include <font5x7.h> // Declare your global variables here void main(void) { unsigned char odin[] = { 0x08, 0x00, 0x08, 0x00, #ifndef _GLCD_DATA_BYTEY_ 0x00, 0x10, 0x18, 0x14, 0x10, 0x10, 0x7C, 0x00, #else 0x00, 0x00, 0x48, 0x44, 0x7E, 0x40, 0x40, 0x00, #endif }; // Declare your local variables here // Variable used to store graphic display // controller initialization data GLCDINIT_t glcd_init_data; // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Port C initialization // Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0); // State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); // Port D initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Disconnected // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2A output: Disconnected // OC2B output: Disconnected ASSR=(0<<EXCLK) | (0<<AS2); TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20); TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (0<<CS20); TCNT2=0x00; OCR2A=0x00; OCR2B=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // Timer/Counter 2 Interrupt(s) initialization TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2); // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: Off EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00); EIMSK=(0<<INT1) | (0<<INT0); PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0); // USART initialization // USART disabled UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR1=(0<<AIN0D) | (0<<AIN1D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // SPI initialization // SPI disabled SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0); // TWI initialization // TWI disabled TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE); // Graphic Display Controller initialization // The KS0108 connections are specified in the // Project|Configure|C Compiler|Libraries|Graphic Display menu: // DB0 - PORTB Bit 0 // DB1 - PORTB Bit 1 // DB2 - PORTB Bit 2 // DB3 - PORTB Bit 3 // DB4 - PORTB Bit 4 // DB5 - PORTB Bit 5 // DB6 - PORTB Bit 6 // DB7 - PORTB Bit 7 // E - PORTC Bit 0 // RD /WR - PORTC Bit 1 // RS - PORTC Bit 2 // /RST - PORTC Bit 3 // /CS1 - PORTC Bit 4 // /CS2 - PORTC Bit 5 // Specify the current font for displaying text glcd_init_data.font=font5x7; // No function is used for reading // image data from external memory glcd_init_data.readxmem=NULL; // No function is used for writing // image data to external memory glcd_init_data.writexmem=NULL; glcd_init(&glcd_init_data); glcd_putimage(0,0, odin, GLCD_PUTCOPY); while (1) { // Place your code here } } Схема прикреплена ниже в архиве

      Схема.rar
    • By Н_Д_А
      Всем привет).
      Может, кому-то эта статья  сэкономит много времени и нервов. 
      Недавно  по работе встретился с интересной задачкой.
      Нужно было передать на железку по порту RS485 информацию для проверки работоспособности последней.
      Так как не всегда имеется в ремонте вся система, то для начала нужно было посмотреть, на заведомо исправной системе, что же там между ними (железками) передаётся.
      Логический анализатор показал что девайсы общаются по не совсем стандартному, а по  9ти битному протоколу (USART 9n1).
      А это усложняло задачу, так-так известные мне терминальные программы его не поддерживают.  И без бубна не обойтись))).
      Начались поиски решения.
      Через некоторое время стало понятно, что AVR позволяет это делать и даже в даташите подробно это описывает.
      Дело за малым. Реализация задуманного))). 
      Все регистры выставлены по документу………..Для Atmega8a.
      void USART_Init( unsigned int speed) //Инициализация модуля USART { UBRRH = (unsigned char)(speed>>8); UBRRL = (unsigned char)speed; UCSRB=(1<<RXEN)|( 1<<TXEN); //Включаем прием и передачу по USART UCSRB |= (1<<RXCIE); //Разрешаем прерывание при передаче UCSRA |= (1<<U2X); //удвоение скорости UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0); UCSRB |= (1<<UCSZ2); // Включаем 9bit режим // Обращаемся именно к регистру UCSRC (URSEL=1) // ассинхронный режим (UMSEL=0), без контроля четности (UPM1=0 и UPM0=0) // 1 стоп-бит (USBS=0), 8-бит посылка (UCSZ1=1 и UCSZ0=1) // если (UCSZ1=1 и UCSZ0=1 и UCSZ2=1) 9bit mode. // UCSRC |= (1<<UPM1);//четность } По даташиту передача 9го бита происходит установкой или сбросом TXB8. 
      То есть, установили бит, передаётся 1 в старшем 9ом разряде, сбросили – 0. 
      void USART_Transmit( unsigned int data ) // функция передачи 9ти бит из даташита. { /* Wait for empty transmit buffer */ while ( !( UCSRA & (1<<UDRE)) ) ; /* Copy ninth bit to TXB8 */ UCSRB &= ~(1<<TXB8); if ( data & 0x0100 ) //не понял, что они хотели этим сделать. UCSRB |= (1<<TXB8); /* Put data into buffer, sends the data */ UDR = data; } И вот незадача, числа размером до 1 байт передаются без проблем, а числа больше 0xFF (255) нет).
      А устройство передаёт числа до 510.
      Предлагаю решение.  Может и не самое лучшее, но вполне работоспособное.
      int main(void) { USART_Init (103);//9600 //------------------------------------------------------------------------------------ while(1) { for (i=0; i<22; i++) { code_simbol = simbol[i]; //символ из массива //-------------------------------------отправка в UART-------------------------------- if (code_simbol > 255) { pr=1; // флаг передачи символа больше 0xff (255 десятичное) } else { pr=0; // флаг передачи символа меньше 0xff } USART_Transmit(code_simbol,pr);//собственно сама функция отаравки } } } А теперь и сама функция передачи .
      void USART_Transmit( unsigned char data, uint8_t prisnak ) //Функция отправки по USART { while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема if (prisnak==1) { UCSRB |= (1<<TXB8); //устанавливаем для передачи еденицы в старшем разряде } else { UCSRB &= ~(1<<TXB8); //сбрасываем старший разряд } /* Put data into buffer, sends the data */ UDR = data; //Начало передачи данных asm volatile ("nop"); Соответственно если число для предачи мньше 256 мы передаём его при нулевом 9ом бите.
      Ну а если больше то 9й бит выставляем в единицу.
      А вот и результат.

       
    • By France de Vague
      Здравствуйте.
      Я собрал схему для генерации звуков на AVR по материалам вот этой статьи на Хабре.
      Использовал ATMega328P. В этом проекте частота ШИМ 31250 Гц, так что я собрал фильтр - RC-цепь, где R = 510 Ом, а С = 0.1 мкФ приложил схему к посту (эти значения я рассчитал на предложенном в статье калькуляторе ШИМ-фильтров (приложил скриншот); нагрузкой поставил динамик с сопротивлением 8 Ом, на схему подал 5В питания с лабораторного БП.
      Я загрузил в микроконтроллер демо-код, который должен проигрывать последовательность звуков. Фьюзы, вроде бы, стандартные, но я на всякий случай приложил скриншот и с ними.
       
      В общем, проблема в том, что звук, который он должен воспроизводить звучит приглушенно, зато блин стоит какой-то монотонный писк, иногда почти скрип и вот он очень громкий. 
      Я подумал, что проблема в неправильно рассчитанном фильтре или какой-нибудь наводке. Собрал их сто тысяч разных, но писк только приглушался вместе со всем остальным, когда я большие сопротивления ставил, а по частоте на слух не менялся(не уверен, должен ли был), хотя емкости я пробовал тоже очень разные.
      Я немного почитал код, попробовал отключить функцию подавления щелчка при сменах нот (это ничего не изменило). Код довольно сложный, чтобы пытаться всерьез искать там какие-нибудь ошибки, да и я подозреваю, что там их нет.
      Не могу понять в чем проблема уже пару дней. Возможно, кто-то уже собирал этот проект или что-нибудь подобное и сталкивался с таким? Подскажите, если так. 
      Так же, я не уверен, может быть, проблема физическая и она в микроконтроллере, думаю стоит попробовать попробовать другой камень.
      Заранее спасибо.



    • By fander36
      Здравствуйте. Возник ниже стоящий вопрос.
      Cуществующие технологии отладочных плат для AVR.
      Хотелось бы узнать больше об этом, но в интернете не нашел ничего дельного.
    • By eyuw
      Б/у контролеры холодильной установки: 1) Eliwell 974LX  на atmega16A-PU , 3 реле - характеристики на фото.Цена 15 бел.руб. 2) Eliwell IDPlus974  на atmega32A-PU, 3 реле - характеристики на фото.Цена 18 бел.руб. Корпуса без передней панели закрывающей цифровой индикатор, без датчиков температуры! г.Толочин, Витебская обл. Отправка по Беларуси наложенным платежом. Покупатель также оплачивает почтовые расходы. 


×
×
  • Create New...