Jump to content

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


 Share

Recommended Posts

Guest shindax

Как Вы считаете, что произойдет после исполнения следующего кода?

if(v==3) PORTB.2 = 0; PORTB.3 = 0; PORTB.4 = 1;

 

Link to comment
Share on other sites

Я так понимаю, что третье нажатие кнопки приведет к исполнению этой строки, результатом которой будет отсутствие свечения светодиодов портов PB2, PB3 и загорится светодиод порта PB4. И будет гореть до 4 нажатия кнопки. В результате 4 нажатия выполнится по команде: if(v==4)v=0; переход на команду: if(v==0) PORTB.2 = 0; PORTB.3 = 0; PORTB.4 = 0; , которая должна погасить все светодиоды.

Благодарю за помощь. Только начал изучать.

Link to comment
Share on other sites

  • 3 weeks later...

Не могу избавиться от минусов для измерения температуры(по моему урок 8):

Вопрос снимаю нашел ошибку.

было for (int i=0;i<40;i++)
    {
        ADCSRA |=(1<<ADSC);
        while (ADCSRA &(1<<ADSC)){}
        tmp=tmp+ADC;
    }
    
    return tmp/40;

нужно for (int i=0;i<20;i++)
    {
        ADCSRA |=(1<<ADSC);
        while (ADCSRA &(1<<ADSC)){}
        tmp=tmp+ADC;
    }
    
    return tmp/20;

но не понимаю почему такая зависимость от числа измерений

 

 

 

Edited by uuu000
Link to comment
Share on other sites

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

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

Подробнее

6 часов назад, uuu000 сказал:

не понимаю почему такая зависимость от числа измерений

Ну, наверное потому, что tmp переполняется при 40 суммированиях, и не переполняется при 20.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Link to comment
Share on other sites

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

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

Подробнее

  • 5 months later...

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

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

Подробнее

Всем  привет, в этом видеоуроке когда мы делаем подключение кнопки в работу бегущей строки светодиод который подключен к выводу PORTB0  в режиме "с низу в верх"   не издает свечение, ошибка в коде? или с чем это связано. На видео находиться с 9:09 до 9:25.

Спасибо за внимание

Link to comment
Share on other sites

  • 1 month later...

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

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

Подробнее

Доброго времени суток, по шестому уроку вопрос. При подключении LCD дисплея у меня компилятор показывает ошибку

// ATmega8A

#include <avr/io.h>
#define F_CPU 8000000
#include "n5110.h"

void preset(){
    
 Lcd_init();
 Lcd_clear();
    
    
}

int main(void)
{
    preset();
    
    while(1)
    {
     Lcd_prints(0, 3, FONT_1X,(unsigned char *)PSTR("Hellow"));
     Lcd_prints(0, 3, FONT_1X,(unsigned char *)PSTR("Привет"));
     Lcd_update();
    
    
    
    }
Ошибка компилятора:

Error    1    undefined reference to `Lcd_init()'    E:\proect\Lessons\Les6\GccApplication6\GccApplication1\Debug/.././GccApplication1.cpp    9    1    GccApplication1
Error    2    undefined reference to `Lcd_clear()'    E:\proect\Lessons\Les6\GccApplication6\GccApplication1\Debug/.././GccApplication1.cpp    10    1    GccApplication1
Error    3    undefined reference to `Lcd_prints(unsigned char, unsigned char, LcdFontSize, unsigned char const*)'    E:\proect\Lessons\Les6\GccApplication6\GccApplication1\Debug/.././GccApplication1.cpp    21    1    GccApplication1
Error    4    undefined reference to `Lcd_prints(unsigned char, unsigned char, LcdFontSize, unsigned char const*)'    E:\proect\Lessons\Les6\GccApplication6\GccApplication1\Debug/.././GccApplication1.cpp    22    1    GccApplication1
Error    5    undefined reference to `Lcd_update()'    E:\proect\Lessons\Les6\GccApplication6\GccApplication1\Debug/.././GccApplication1.cpp    23    1    GccApplication1
 

 

При изменении #include "n5110.h" на #include "n5110.с" компилятор работает но тогда показывает такую ошибку. Я так понимаю что память перегружена но чем?(Если надо скрин могу кинуть)

Error    1            Program Memory Usage     :    6866 bytes   83,8 % Full
                Data Memory Usage         :    1054 bytes   102,9 % Full    (Memory Overflow)    GccApplication1    0    0    GccApplication1

 

Link to comment
Share on other sites

  • 2 weeks later...
12.01.2021 в 00:22, M83 сказал:

Доброго времени суток, по шестому уроку вопрос.

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

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

Link to comment
Share on other sites

  • 3 months later...

Делаю что-то похожее на ИК пульт. Использовал атмегу8 и 8МГц кварц. Настроил Таймер_2 в режим СТС. Настроил Таймер 2 на частоту 36кГц. И проверил осциллографом - все работает. 36кГц есть на порте.
Была у меня идея первый таймер использовать для генерации частоты а второй для того чтобы им первый включать и выключать с определенными задержками для создания "пакетов" данных. Но подумал немного и что-то мне стало жалко использовать аж целых два таймера только для одного этого задания. И решил попробовать сделать на одном таймере. Написал функцию которая посылает сначала стартовый длинный пакет импульсов, а потом берет массив в котором находятся 1 и 0 (код который нужно отправить), и в зависимости от того 1 или 0  отправляет пачки импульсов определенной длины добавляя задержки между ними. For и Loop не использовал чтобы процессор "не зависал" в прерывании на долго и успевал выполнять другие задачи.
Все сделано проверками IF и еще несколько статических переменных и там же в векторе ISR(TIMER0_OVF_vect) инвертирую порт.
Правильно ли я поступил?

На время разработки я запустил таймер_2 который генерирует несущую частоту 36кГц на постоянно. Но в дальнейшем когда программа будет закончена буду запускать его кнопкой только на время передачи импульсов и по он окончанию самостоятельно выключиться.


Таймер_2 работает на прямую от генератора 8МГц то есть - на частоте процессора.

void timer2_init () {
    TIMSK |= (1<<OCIE2); //Timer/Counter2 Output Compare Interrupt Enable
    //Разрешение прерывания по совпадению таймера/счетчика2
    TCCR2 |= (1<<CS20) | (1<< WGM21); // clkT2S/1024 (From prescaler) AND Clear Timer On Compare - CTC
    OCR2 = 110; // Output Compare Register – OCR2 continuously compared with the counter value (TCNT2)
}

 

А таймер 0 для других заданий так clkT2S/128 (From prescaler)

void timer0_init(){
	TIMSK |= (1<<TOIE0);
	TCCR0 |= (1<<CS00) | (1 << CS02) ;
	//TCNT0 = 60;
	//PORTD |= (1<<7);
}

 

Так вот код в OVF таймера _0 не выполняется когда запущен таймер_2

ISR(TIMER0_OVF_vect){
	//code
	//code
}

 

То есть если превысить некий лимит команд в прерывании таймера_2 то код в прерывании таймера_0 не выполняется.
Я все правильно понимаю?

Это потому что таймер_2 работает на частоте процессора и забирает все его время и производительность на себя?
И код в основном цикле тогда тоже не будет выполняться если таймер_0 будет все время прерываться с частотой тактирования процессора?

Если i < 11 таймер_0 не работает.  Если  i < 10 то еще работает.

ISR(TIMER2_COMP_vect){
	//fire_act();
	for(int i = 0; i < 11; i++){asm("nop");}
}//ISR

Я понимаю это так. Что время выполнения кода прерывания или равно или превышает время между вызовами этого же прерывания.
Правильно?

Screenshot_1.png

 

Только что заметил что ошибся с темой. А удалить сообщение уже нельзя ...

Edited by Vit@lik
Link to comment
Share on other sites

  • 4 months later...

Я правильно понимаю, что в шестом уроке, где показывается использование LCD дисплеев 5110 или 3310 используется библиотека только конкретно для этих дисплеев. А допустим использование других дисплеев требует других библиотек.
1. Это верно?
Ещё вопросы:
2. Кто разрабатывает эти библиотеки? Производители дисплеев или это конкретно "труд радиолюбителя/разработчика"?
3. Если эти библиотеки разрабатывает производитель, тогда где их брать?
4. Использование других библиотек как-то влияет на процесс программирования, конкретно на код. Я имею в виду сам текст программы, а не подключаемые библиотеки.

Edited by Юрий_Нд
Link to comment
Share on other sites

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

2. Кто разрабатывает эти библиотеки?

Кому надо, тот и разрабатывает.
Вот мне сейчас босс велел поставить в устройство дисплей на основе ILI9488. Взял pdf на него, настроил регистры, вывел на экран закрашеный прямоугольник. Всё, основная часть работы сделана.
А дальше - как уж тебе самому надо. Знакогенератор напишешь, шрифты нарисуешь (или сконвертируешь).

А можно как адруинщики поступить. Взять готовую библиотеку (которую кто-то уже написал и не факт, что ей удобно пользоваться лично тебе), немного подшаманить, запустить, а потом бегать и спрашивать всех, как заставить выводить UTF-8 и прочие unicode символы.

Link to comment
Share on other sites

18 часов назад, LiVit сказал:

босс велел поставить в устройство дисплей на основе ILI9488. Взял pdf на него, настроил регистры, вывел на экран закрашеный прямоугольник. Всё, основная часть работы сделана.

... случайно нашёл у себя дисплей LC1628.
Как думаете, реально найти для него библиотеку.
Или самому придётся "ваять"?
---
По поводу "ардуинщиков".
Я правильно понимаю, что "ардуинщики" отличаются от всей братии только тем, что им не нужно заниматься пайкой.
Всё железо они покупают, а уже дальше, что "ардуинщик", что другой радиолюбитель, сталкивается с теми же проблемами написания кода, прошивками и всё такое.
---
... насколько я понимаю, в этой теме железом не занимаются?
Подскажите пожалуйста, на этом форуме есть место/ раздел, где обучают "железу" по АВР.

Link to comment
Share on other sites

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

раздел, где обучают

Вы не правильно понимаете, для чего существуют форумы. Никак не для обучения. Учиться вы должны сами. А форумы для советов, помощи в непонятных вопросах, консультациях. Поглумиться могут над очень уж тупыми вопросами. :)

 

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

реально найти для него библиотеку

Ищите, никто за вас этим заниматься не будет.

Link to comment
Share on other sites

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

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

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

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

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

Link to comment
Share on other sites

36 минут назад, andrusha152 сказал:

Вы не правильно понимаете, для чего существуют форумы.

Прошу прощения что неправильно выразился. 
Полностью могу подписаться под теми словами, в которых Вы говорите, для чего существуют форумы.

Постараюсь впредь более корректно выражаться.
-------------------------------------------------------------------------------------------------------------------------------------------------

33 минуты назад, Starichok сказал:

"ардуинщики" ... пользуются библиотеками.

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

Link to comment
Share on other sites

2 часа назад, Starichok сказал:

в даташитах на дисплеи.

Это понятно, но я имел в виду исключительно наш форум.
 Есть ли здесь где-то место, где исключительно обсуждаются вопросы создание библиотек для дисплеев?

Edited by Юрий_Нд
Link to comment
Share on other sites

  • 2 weeks later...

 Доброй ночи Всем.
 Подскажите пожалуйста, почему в примере урока всё работает только с одной библиотекой, а мне необходимо подключать две библиотеки?
 И почему так сильно "забита" память, в отличие от примера?
Часто нажимал клавишу "Сохранить всё".
Может, поэтому память "забита"?
Но это рекомендовал автор, я так понял.
Спасибо ____________ Юрий.

п.с. undefined reference to "Lcd_init()"

1 - Обменник - 96.png

1 - Обменник - 95.png

1 - Обменник - 94.png

Edited by Юрий_Нд
Link to comment
Share on other sites

Как было-бы круто, если бы руководители нанимающие специалистов по электронике, вот таким вот образом пытались сделать что-то сами, а потом поняв, как это непросто, решали - "А, к чёрту, пойду в проститутки найму нормального специалиста и буду платить ему нормальные деньги".
Но нет. Практика показывает, что эти граждане считают что там всё просто. Взял буратину, накачал скетчей и вуаля - всё работает!

P.S. если что - у меня нормальный работодатель, понимающий.

Link to comment
Share on other sites

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

Интересно, а Вы лично себя к какой группе специалистов причисляете?

А вам зачем? Нанять хотите? Не хватит денег.

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.

  • Сообщения

    • Точно так - один с общим анодом, второй с общим катодом. Отладочная плата под  МК Atmega 8/48/88/168/328  DIP. Питание 5 или 3,3. С динамической индикацией на этой плате играться не планирую.
    • А корректор с каким коэф пульсаций рассчитывался? Пакетный режим должен перестать работать с мин нагрузкой. LLC не айс для музычки, имхо. 
    • Чуть выше вы говорили что у вас один индикатор. Определитесь с начала какой именно общий анод или общий катод. Или хотите и тот и другой. Какое питание у контроллера? И если у вас два индикатора и динамическая индикация то ток через сегмент будет в два раза выше иначе упадет яркость. Соответственно для коммутации общих выводов ток соответственно будет ток сегмента умноженый на семь. Для комутации индикаторов  в любом случае потребуется транзистор. Если программу будете писать сами ставьте две 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 мкФ. Увы без сильных пульсаций на низкой нагрузке не получается (только если частоту не задрать), так что там работает пакетный режим. БП делается для светодиода, там мне не принципиальны пульсации такой величины.  
    • Дело не в мощности рассеяния. Была статья по реле, почему слаботочные плохо подходят для коммутации нагрузок УМЗЧ.
  • 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...