Jump to content

Вопросы от начинающих по МК


Recommended Posts

А по-моему, к Вам нужно адресовать всё те же вопросы, которые я только что задал Eddy_Em.
Вернитесь чуть назад, прочитайте пожалуйста.
А то я опять "нарвусь" на замечание модератора.

 

Link to comment
Share on other sites

1 hour ago, Юрий_Нд said:

к Вам нужно адресовать

On 11/5/2021 at 10:18 AM, Юрий_Нд said:

После  (1<<0) получается 0bххххххх1,

Число 1 в человеческом десятичном понимании, а для процессора в двоичном виде равно 0b00000001. То есть не крестики, а обычные нули.

Поэтому после сдвига такого числа влево на ноль позиций в результате получим точно такое же значение 0b00000001

 

On 11/6/2021 at 1:08 PM, Юрий_Нд said:

можно количество значащих цифр

Тип float даёт 7 значащих цифр.

Edited by Yurkin2015
Link to comment
Share on other sites

 

11 часов назад, Eddy_Em сказал:

А если есть проблемы собственно с С, советую Кернигана и Ритчи почитать

На гражданина это заклинание не действует. Проверено.

Edited by LiVit
Link to comment
Share on other sites

Транзисторы OptiMOS с ориентацией кристалла истоком вниз могут стать новым стандартом в изготовлении MOSFET

Традиционно производители дискретных силовых полупроводниковых приборов добиваются улучшения ключевых характеристик за счет усовершенствования кристалла. Однако специалисты компании Infineon добились впечатляющих результатов, сориентировав кристалл в корпусе истоком вниз. Такая ориентация кристалла применена, например, в серии MOSFET OptiMOS.

Подробнее

26 minutes ago, LiVit said:

На гражданина это заклинание не действует

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

Edited by Eddy_Em
Link to comment
Share on other sites

Новейшая архитектура Σ-Δ-АЦП предотвращает нарушение потока данных во время синхронизации распределенных систем

Критически важные распределенные системы требуют синхронного преобразования во всех подсистемах и непрерывного потока данных. Распределенные системы сбора данных могут быть синхронизированы как на основе АЦП последовательного приближения, так и на основе сигма-дельта (∑-Δ)-АЦП. Новый подход, основанный на преобразователе частоты дискретизации (SRC), содержащемся в микросхемах линейки AD7770 производства Analog Devices, позволяет достигать синхронизации в системах на основе сигма-дельта-АЦП без прерывания потока данных.

Подробнее

Yurkin2015, зачем ворошить старое.
По-моему, я достаточно ясно сказал, что в этой теме я разобрался и принёс извинения Всем участникам форума:

06.11.2021 в 03:37, Юрий_Нд сказал:

1. Извиняюсь, был неправ, заблуждался.
Теперь я знаю почему (1<<0) = 0b0000 0001. И теперь я в это не просто верю, как делал это раньше, а точно знаю это и могу объяснить/пояснить любому желающему.
2. Интернетом не пользовался, книжки умные по этому вопросe не читал, просто взял листочек с карандашиком и написал:
(1<<6)=(16<<2)=(4<<4)=64 
верно?
3. LiVit, как Вы думаете Керниган и Ричи могут мне сказать что-либо новое и неизвестное именно по этому вопросу?

----------

Уважаемый LiVit, а от Вас я ждал хоть какой-то реакции на мой анализ относительной погрешности в переменных типа float. 
Жаль, что так и не дождался...

 

8 часов назад, Yurkin2015 сказал:

float даёт 7

... а почему не 8 значащих цифр?

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

Как улучшить параметры преобразователей с помощью карбид-кремниевых модулей WolfPACK

Необходим быстродействующий преобразователь питания средней мощности с высоким КПД? Он должен быть компактным и недорогим? Решение – карбид-кремниевые модули средней мощности WolfPACK производства Wolfspeed. В статье рассмотрены основные особенности модулей WolfPACK и показано, что переход на эту универсальную и масштабируемую платформу позволяет не только быстро разработать новые устройства, но и без значительных затрат времени и средств модернизировать уже существующие схемы на традиционной элементной базе.

Подробнее

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

Уважаемый LiVit, а от Вас я ждал хоть какой-то реакции на мой анализ относительной погрешности в переменных типа float. 
Жаль, что так и не дождался...

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

И лично меня убивает эта чУдная математика 2.20000005 + 1.10000002 = 3.30000019

И это при том, что вам не нужны эти float. Я могу понять, когда их используют в каких-нибудь сложных ЦОС (цифровая обработка сигналов), но при измерении тока, напряжения, времени....

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

Edited by LiVit
Link to comment
Share on other sites

LI/PR2 – надежные и недорогие ИП от MORNSUN на DIN-рейку

Компания Mornsun выпустила три серии источников питания с креплением на DIN-рейку в форм-факторе Home Automation на популярные значения выходной мощности 30, 60 и 100 Вт (серии LI30-20/PR2, LI60-20/PR2, LI100-20/PR2). Эти источники питания относятся ко второму поколению продукции (R2) и характеризуются высокой надежностью и хорошей стоимостью.

Подробнее

08.11.2021 в 19:11, Юрий_Нд сказал:

Допустим число нужно умножить на 0.384.
Вы предлагаете умножить на 384, а потом разделить на 1000?

LiVit, а это Вы поддерживаете?

08.11.2021 в 19:38, Eddy_Em сказал:

... нужно умножить на пять и разделить на 13.

Что Вы по этому поводу можете сказать?

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

14 часов назад, Огонёк сказал:

Си есть си, какая разница?

В AVR модификатор const не означает размещение во флеш, нужен еще PROGMEM.

32 минуты назад, Юрий_Нд сказал:
08.11.2021 в 20:11, Юрий_Нд сказал:

Вы предлагаете умножить на 384, а потом разделить на 1000?

LiVit, а это Вы поддерживаете?

Вариантов много. Самый простой - да, умножить на 384 и делить на 1000 - тогда коэффициент можно задать в человеко-читаемом виде. Если же это просто число, чье представление не несет особого смысла - коэффициент резистивного делителя, например - можно умножить на 98 и поделить на 256. Или умножить на 25166 и поделить на 65536.

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

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

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

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

Link to comment
Share on other sites

1 hour ago, Юрий_Нд said:

Что Вы по этому поводу можете сказать?

Могу сказать, что налицо полный профан. Тут, похоже, не только С надо изучать, но и элементарный матан!

Я уже писал, что там, где нет флоатов, заменяю умножение на некую нормировочную константу двумя действиями: умножением и делением. Однако, в STM32F0 даже деления нет, поэтому для них лучше эту операцию реализовать как умножение и сдвиг, пусть даже uint32_t может понадобиться расширить до uint64_t. Правда,  считать коэффициенты так лихо не получится. Вот, допустим, хочу я с точностью до 0.001 получить значения числителя и знаменателя для коэффициентов 1.23, 3.25 и 7.11. Я просто в октаве пишу:

[n d]=rat([1.23 3.25 7.11], 0.001)
	n =
	    16    13   711
	d =
    13     4   100

Вот и сразу три числителя и три знаменателя. Можно проверить:

n./d
ans =
   1.2308   3.2500   7.1100

- просто превосходно!

Однако, в случае, когда деление хочется заменить сдвигом, придется покумекать, т.к. через цепные дроби подбирать эти числа нереально! Могу разве что предложить последовательный перебор. Вот так:

K=1.23; for x=0:31; N=round(K*bitshift(1,x)); printf("a*%g approx a*%d>>%d (*%g)\n",K, N, x, bitshift(10000*N,-x)/10000); endfor
a*1.23 approx a*1>>0 (*1)
a*1.23 approx a*2>>1 (*1)
a*1.23 approx a*5>>2 (*1.25)
a*1.23 approx a*10>>3 (*1.25)
a*1.23 approx a*20>>4 (*1.25)
a*1.23 approx a*39>>5 (*1.2187)
a*1.23 approx a*79>>6 (*1.2343)
a*1.23 approx a*157>>7 (*1.2265)
....

Можно функцию написать, которая будет подбирать коэффициенты с наибольшей точностью. Вот так:

function [N Shift] = findNR(K, dk)
    N = 1; Shift = 1; delta = 1;
    Ngood = 1; Shiftgood = 1; deltagood = 1;
    Nmax = bitshift(1,32)-1;
    for Shift = 3:31;
        N = round(K*bitshift(1,Shift));
        if(N > Nmax) break; endif
        delta = abs(bitshift(1e6*N, -Shift)/1e6 - K);
        if(delta < dk) break; endif
        if(delta < deltagood)
            deltagood = delta; Ngood = N; Shiftgood = Shift;
        endif
    endfor
    if(delta > dk)
        printf("tolerance %g not found, use %g\n", dk, deltagood);
        Shift = Shiftgood; N = Ngood;
    endif
endfunction

И в этом случае:

[N S] = findNR(1.23, 0.001)
N = 315
S = 8

Т.е. можно было бы просто умножить на 315 и сдвинуть вправо 8 раз! А вот если я захочу 10¯⁶ получить, то уже может быть переполнение uint64_t, так что придется точность понизить:

[N S] = findNR(1.23, 1e-6)
tolerance 1e-06 not found, use 1e-05
N = 40305
S = 15
Edited by Eddy_Em
Link to comment
Share on other sites

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

COKPOWEHEU, а Вы видели мою тему

Я много ваших тем видел. Смысла они обычно не несут.

8 часов назад, Eddy_Em сказал:

Вот, допустим, хочу я с точностью до 0.001 получить значения числителя и знаменателя для коэффициентов

Эти коэффициенты - теоретические константы или калибровки, специфичные для конкретной железяки?

8 часов назад, Eddy_Em сказал:

Однако, в случае, когда деление хочется заменить сдвигом

Зачастую можно выбрать сдвиг на 1, 2, 3 и т.д. байтов в зависимости от требуемой точности.

8 часов назад, Eddy_Em сказал:

Я просто в октаве пишу:

Вот использование стороннего софта для генерации констант мне не нравится:

//доступно для изменения юзеру
#define KOEFF1 1.23
#define KOEFF2 3.25

//внутренние константы, рассчитываемые препроцессором
#define KOEFF1_8 ((unsigned int)((KOEFF1)*256))
#define KOEFF2_16 ((unsigned long)((KOEFF2)*65536))
  
...
x = (x*KOEFF1_8)>>8;
y = (y*KOEFF2_16)>>16;

 

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

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

Link to comment
Share on other sites

3 minutes ago, COKPOWEHEU said:

Эти коэффициенты - теоретические константы или калибровки, специфичные для конкретной железяки?

Второе — калибровки по платиновому термометру, сглаженные, аппроксимированные полиномом пятой или шестой степени и в соответствии с желаемой точностью (±0.5℃ — все равно NTC лучше никогда не даст) разложенные кусочно-линейной аппроксимацией.

4 minutes ago, COKPOWEHEU said:

Вот использование стороннего софта для генерации констант мне не нравится:

Октава - свободный софт, так что все ОК. Не на пытхоне же [censored] писать! Но кое-что я рассчитывал и на сях, и прямо в репу вкладывал в отдельную директорию сишный файлик, который компилируется даже без Makefile'а (просто gcc file.c) и позволяет в случае необходимости нужный заголовочный файл сгенерировать.

Еще, бывает, баш-скрипты вкладываю: для того, чтобы сгенерировать, допустим, заголовочный файл с макросами, позволяющими удобно шрифты описывать (в виде X___XX_X, а не менее наглядных 0b10001101). Ну или просто в комментах содержимое этих скриптов пишу: вдруг в другой раз (или кому-то еще) захочется что-то подобное сделать...

Link to comment
Share on other sites

  • 3 weeks later...

Здравствуйте !

История такая -

инициализация прерываний по компаратору:

 ldi temp,(0<<ADEN) out ADCSRA,temp                       ; 0<<ADEN выключение АЦП
in temp,SFIOR sbr temp,(1<<ACME) out SFIOR,temp                 ; 1<<ACME подключенгие инвертирующего входа AIN1 к входу АЦП
ldi temp,(0<<MUX3)+(0<<MUX2)+(0<<MUX1)+(0<<MUX0)out ADMUX,temp  ; AIN1 к входу АЦП (ADC0) 23 нога/(ADC1) 24 нога
ldi temp,(0<<ACD)+(1<<ACBG)+(1<<ACIE)+(0<<ACIS1)+(0<<ACIS0) out ACSR,temp

инициализация  АЦП:

ldi temp,(1<<REFS1)+(1<<REFS0)+(1<<adlar)+(1<<MUX2)+(0<<MUX1)+(0<<MUX0); Выбор ADC4(27н), выравнивание влево, ИОН=2.56
out ADMUX, temp
ldi  temp,(1<<ADEN)+(1<<ADSC)+(1<<ADPS1)+(1<<ADPS2) out  ADCSRA,temp   ; 8МГц:64=125 кГц  включение и однократный запуск
sbic ADCSRA,ADSC  rjmp PC-1  ожидание конца преобразования

in temp ,ADCH

 

Основной вопрос - правильно ли при инициализации АЦП с однократным преобразованием - сначала переключать канал ,  а потом включать сам АЦП и преобразование ?

Проблема в том, что АЦП хватает мусор более 4-10% от максимальной шкалы , но не всех процессорах , а на некоторых .

процессор - ATmega8

Edited by dodik
Link to comment
Share on other sites

  • 2 weeks later...
В 08.11.2021 в 13:13, Юрий_Нд сказал:

Вполне приемлемая для моих расчётов ошибка в одну сотую даёт погрешность 0.3 процента. 
Тогда какое мне дело, что ошибка, связанная с типом переменных даёт относительную погрешность 5-6 миллионых процента.
Наверное это может интересовать только тех, кто собирается решать систему уравнений из 50 неизвестных.
Хотя не уверен, насколько это важно для них. Ответ на это вопрос нужно спрашивать у "чистых математиков".

Я конечно извиняюсь что поднял столь древний пост, но... я делал решатель систем уравнений до 20 порядка, так вот при размере уравнения в 20 неизвестных ошибка "ответа" составляла в несколько единиц!!! Попробуете догадаться почему? Использование 192-битного числа с плавающей запятой в вычислениях снизило ошибку до сотых долей единиц... но это по прежнему чудовищно много.
Проблема не в самой погрешности, а в том что ОНА НАКАПЛИВАЕТСЯ по мере вычислений. Мощность вы вычисляете произведением двух величин, погрешность здесь будет тысячные доли процента. Теперь вы просуммировали 1000 раз это произведение и... погрешность увеличилась ровно в 1000 раз! Причем она увеличится больше чем в 1000 раз, 1000 раз - это только на произведениях, а есть ещё и сумма, которая тоже даёт погрешность. Любая ваша операция с плавающим числом накапливает погрешность. И то что она изначально не очень большая нивелируется количеством операций. Float хватит чтобы умножить два числа, или сложить. Ну пусть даже 1000 раз, но на миллионе он уже даст ощутимую погрешность. И для каждой величины есть число меньше которого сумма не будет меняться. Т.е. 1.0 + 1Е-30 будет по прежнему равен 1.0 это иногда тоже выплывает неожиданно для программиста. И хоть миллион раз прибавь...

Учение - изучение правил. Опыт - изучение исключений.

Link to comment
Share on other sites

1 hour ago, Alexeyslav said:

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

Загадочная фраза. Я, конечно, извиняюсь, но вы в курсе, что означает термин "порядок уравнения"?

Если же речь о решении систем уравнений, то слышали ли вы о сходимости численных методов решения?

Link to comment
Share on other sites

В контексте этой темы это не важно. Да  имне тогда было это не важно, нужно было решать лишь СЛАУ до 8 неизвестных, а 20 - это предел удобства ввода на одном экране, пробовал чисто только потому что можно было. И результат запомнился.

 

Учение - изучение правил. Опыт - изучение исключений.

Link to comment
Share on other sites

  • 2 weeks later...
  • 1 month later...

Скачал прошивку в .бин для аттини 13  автор пишет что в прошивке сразу епром и флешь прошивка как их разделить ? программатор прошивает файл только не правильно так как не работает устройства. Программатор юсбасп  прошивку заливаю программой AVRDUDEPROG фьюзы прошиваю  SinaProg 

 

Tuner_SONY_+eeprom.BIN

Edited by blackflash2007
Link to comment
Share on other sites

Здравствуйте. Собираю штуку на атмега8а. К прошивке идет такой скрин,как выставить правильно фьююзы.Такой программы нету,есть avrdude. Как правильно выставить фьюзы в ней? я попробовал выставить какие были пункты и залочил мк.

fuses.jpg

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.

  • Сообщения

    • С ЭДП тема хорошая, запаха нет, да, нужен объем и не слабый В части яхтеного лака, покрывал дерево, гляну может еще не высохли остатки, можно и им залить.  
    • Пришли полимерные конденсаторы 25х470 - попробую заменить в фильтре 25х1000,  проверить как пойдет Пока на тестах - выпрямитель в БП мостовой со средней точкой, дроссели 2х33 мкГн конденсаторы 2 по 25х1000, вторая ступень дроссели 2х1 мкГн конденсаторы 2 по  25х2200 переделывать без средней точки - конденсаторы тогда нужны на 50 В, хотя дросселей тогда 2 вместо 4 БП 330 Вт - 30 В 10 А греется только диодный мост 4 диода 20200 тут я перестраховался 20100 можно было поставить, но запаса по  обратному напряжению нет удачи
    • Мусора не должно быть. Посмотрите осциллографом если уровни меняются то анализатор должен так же принимать.
    • Чего-то не догоняю... база ВТ14 куда подключена? Хрень там написана. Объяснил? Перепелкин тоже не сразу всё знал и умел, понимать надо.
    • Прошу прощения, в спешке попутал полярность питания. Заработало. Осциллограф показал два сигнала под 90 градусов. Вопрос остался как подавить "мусор" на логическом анализаторе. Ведь оптический диск может быть поврежден а осциллографом этого не поймать. Установить подтягивающие резисторы к "0" на вход? У меня по умолчанию состояние входов "HI" то есть высокий логический уровень. Надо ставить какой то инвертор логических уровней?
    • Зря вы так сказали. Без этого - была хоть какая-то надежда, что вам действительно нужны ответы, и вы с уважением относитесь к тем, кто может вам помочь. Теперь не вижу в этом ничего удивительного. ильнур22 улетел в "Игнор". Больше я вас своими ответами не побеспокою.
    • Пермаллой лучше использовать, он бОльше для экранирования годится.
  • 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 eyuw
      Б/у контролеры холодильной установки: 1) Eliwell 974LX  на atmega16A-PU , 3 реле - характеристики на фото.Цена 15 бел.руб. 2) Eliwell IDPlus974  на atmega32A-PU, 3 реле - характеристики на фото.Цена 18 бел.руб. Корпуса без передней панели закрывающей цифровой индикатор, без датчиков температуры! г.Толочин, Витебская обл. Отправка по Беларуси наложенным платежом. Покупатель также оплачивает почтовые расходы. 


    • By АртемК
      Уже весь интернет прошерстить, помогите найти, или где он приставует, чтоб его достать нужен очень срочно, или может у кого то есть куплю!

    • By Эдик Ибрагимов
      Использовать микроконтроллер семейства 8951
       
×
×
  • Create New...