UART в ATtiny13 или Как вывести данные из МК за 52р

    (цена за 10 шт магазина Чип и Дип на момент публикации)

    Я никогда не мог удержаться от покупки разных электронных штук, и однажды у меня стало на 10 очень мелких МК больше. Я люблю ATtiny13 — дешево и сердито. Когда я их покупал, я твердо помнил, что у них «Даже АЦП есть, не то что таймер!» и сильно радовался их малой цене.
    Однако, когда я столкнул ATtiny13 с реальной задачей, оказалось что одной очень важной штуки в нем нету, а именно, интерфейсов для передачи данных (разумеется, не считая GPIO). Ну а если GPIO есть, то написать все что угодно можно! Подумал я и пошел гуглить… И красивого готового решения под avr-gcc не нагуглил… О создании (надеюсь) такого решения, данная статья — добро пожаловать под кат.

    На самом деле, нагуглилось примерно три варианта, но в одном пишут на БЭЙСИКЕ (я вообще не знал что так можно), в другом под CVAVR (привет моему первому мигающему светодиоду) и вообще там весь смысловой код на страшном ассемблере, а вот третий вариант вроде бы подходит… Но какой-то очень странный код… Но заработал сполпинка. Но жииирный…
    Program Memory Usage: 508 bytes 49,6 % Full

    Ну да ладно, главное работает и вмещается, а там уже можно и почитать, и порефакторить… JumpStart состоялся — это главное.



    После вдумчивого чтения кода становится ясно, что его автор достоин глубокого уважения… Этот код похож на код человека, который программирует ОЧЕНЬ недавно, а задача то решена вполне мощная. Работает же. Очень хотелось для начинающих описать несколько тривиальных ошибок, но после третьей понял что сильно оффтоп, так что, увы…

    В оригинале, код занимался и приёмом и отправкой данных, но реально, моя задача не требует приёма (тем более, в главном цикле). Мне достаточно просто отловить Pin Change Interrupt на любой ноге и выплюнуть результаты A->D преобразования. По этому, в целях похудения, было принято решение выпилить приём. Вот, что получилось после не очень долгого и не очень вдумчивого рефакторинга:

    #define F_CPU 9600000UL
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    uint8_t temp, count, start;
    volatile uint8_t c;
    
    #define BAUD_C 123
    #define TxD PB4
    
    #define T_START TCCR0B = (1 << CS01) // F_CPU/8
    #define T_STOP TCCR0B = 0
    #define T_RESET TCNT0 = 0
    
    ISR(TIM0_COMPA_vect){
    	OCR0A = BAUD_C;
    	c = 1;
    	T_RESET;
    }
    
    void send(uint8_t data) { //Что вообще такое "lov"? 0_о
    	if (count >= 8) {
    		PORTB |= (1<<TxD);
    		start = 0; temp = 0; c = 0; count = 0;
    		T_STOP;
    		OCR0A = 0;
    		return;
    	}
    	if(c == 1) {
    		if (start == 0) {
    			temp = 0x80;
    			start = 1;
    			count--;
    		}
    		else {
    			temp = data;
    			temp = temp >> count;
    			temp = temp << 7;
    		}
    		switch(temp) {
    			case 0x80 : PORTB &= ~(1 << TxD);	break;
    			case 0 : PORTB |= (1 << TxD);	break;
    		}
    		count++;
    		c = 0;
    	}
    }
    
    void send_ch(uint8_t data){
    	uint8_t f;
    	data = ~data;
    	T_START;
    	for(f = 0; f < 10; f++){
    		while(c == 0);
    		send(data);
    	}
    }
    


    Не хочется много думать, так что, я оставил всю смысловую часть как есть, выкинул лишнее и подправил вырвиглазные штуки вроде TIMSK0=0x04. В этом коде мне сильно понравилась реализация интервалов! Весь геморрой с высчитыванием констант для baud rate сводится к одному числу BAUD_C, которое подбирается чуть ли не экспериентально и корректируется в зависимости от неточностей кварца (у автора она была равна 115 и на скриншоте вроде бы довольно точно работала. Возможно ли вообще такое хардовое уплывание?). Скорее всего, это не самое оптимальное, надежное и верное бла бла бла решение, но мне оно кажется очень простым и красивым!
    Чтож, каков результат?
    Program Memory Usage: 304 bytes 29,7 % Full

    «Фух, живём. Еще и на АЦП хватит...» Но вообще, это еще не конец. Сейчас код умеет передавать только один символ, а надо передавать строки и значения регистров. А значит, время рыться в старых проектах! Эта задача уже не специфична для МК без UART и была решена неоднократно.

    void send_str(char *text){
    	while(*text) {
    		send_ch(*text++);
    	}
    }
    
     void itoa(uint16_t n, char s[]) {
    	 uint8_t i = 0;
    	 do { s[i++] = n % 10 + '0'; } 
    	 while ((n /= 10) > 0);
    	 s[i] = '\0';
    	 // Reversing
    	 uint8_t j;
    	 char c;
    	 for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
    		 c = s[i];
    		 s[i] = s[j];
    		 s[j] = c;
    	 }
     }
     
      void send_num(char *text, uint16_t n){
    	char s[6];
    	itoa((uint16_t)n, s);
    	send_str(text);
    	send_str(s);
     }
    


    Очень удобно передавать числа сразу с пояснениями, что это за числа, поэтому — send_num(char *text, uint16_t n).
    И, с учетом примера использования:

    int main(void){
    	DDRB |= (1 << TxD);
    	TIMSK0 = (1 << OCIE0A);
    	sei();
    	
    	while(1){
    		_delay_ms(1);
    		send_num("Habr:", 4242);
    	}
    }
    


    Получается
    Program Memory Usage: 538 bytes 52,5 % Full

    Чуть больше, чем в оригинале. Но насколько полезнее!


    Хочу сразу предупредить, что цели сделать красивую и популярную статью не было. Писалась она очень быстро, перечитывалась очень мало и может содержать очень ошибки. Прошу не троллить — я всё исправлю. Главное, чтобы эта проблема перестала существовать и все, кто захочет построить свой датчик на ATtiny13 — имели готовое решение для интерфейса.

    P.S.: Сначала я смотрел в строну I2C и даже нашел очень многообещающий репозиторий, но не разобрался почему Atmel Studio говорит overflow. Было бы классно и этот интерфейс запилить на t13 — может даже худее получится… Но это уже не я.

    P.S.S.: Мой логический анализатор. Он шикарен!
    Share post

    Comments 78

      0
      Могу посоветовать реализовать IrDA (только нижиний протокол естественно). Из обвязки — только светодиод.
      Когда игрался с тиньками было очень удобно. Правда нужен приемник который имеет инфракрасный порт и умеет к нему обращаться на низком уровне.
      Я использовал ПДА-ку HP2210. Никаких плясок с проводами и преобразованием уровней. И логи можно посмотреть в любом сарае (или в машине, когда я ODB-I диагностику пытался ковырять).
      Если кому интересно могу выложить исходники.

      А вообще 13 тинька была хороша лет 8 назад. Сейчас за те-же деньги есть контороллеры с кучей готовых интерфейсов.
        0
        Ну не Atmel же. А вообще, мне все равно интересно. Когда-то нужно вылезать из зоны комфорта и завязывать с Atmel. Можно названия?
          0
          Мне тоже атмел нравится, крайний раз игрался с разными вариантами atmega8 (48,88, и тп), но времени мало, давно не глядел чего у них есть нового.
          По той-же причине не сильно в курсе про других производителей, но вот, например, что бытро нашлось в поиске:
          www.mouser.com/ProductDetail/Freescale-Semiconductor/MC9S08QG4CFQE/?qs=ATe30Cu2%2Ft4gtg2g9GwdXQ%3D%3D
            +2
            STM8S003F3P6. 67руб в том же чипдипе от 3-х штук. Аппаратный UART, SPI, I2C, ADC, несколько таймеров, 20 ног, 8КБ памяти под код, 1КБ оперативной.
              0
              STM32F030F4P6 (TSSOP20)

              Производитель: STMicroelectronics
              Ядро: ARM Cortex M0
              Ширина шины данных: 32 bit
              Максимальная тактовая частота: 48 MHz
              Размер программной памяти: 16 kB
              Размер ОЗУ данных: 4 kB
              Разрядность АЦП: 12 bit
              Рабочее напряжение питания: 2.4 V to 3.6 V
              Рабочая температура: — 40… + 85 C
              Доступные аналоговые/цифровые каналы: 16
              Торговая марка: STMicroelectronics
              Тип ОЗУ данных: SRAM
              Тип интерфейса: I2C, SPI
              Количество входов/выходов: 15 I/O
              Количество таймеров: 5 Timer
              Тип памяти программ: Flash

              66 рублей (одна штука _не_ в чипдип)
                0
                Тем более :) Зачем за атмелы так держаться, давно не понимаю. А у упомянутого STM8S003 есть иногда удобная фича — питание от 2.8 до 5в.
                Ну и брал я их примерно по 0.4$/штука. Закончатся, посмотрим что будет на тот момент интересного.
                  0
                  А у STM есть чипы в DIP корпусе? А то тиньку воткнул в бредборд, обвязал проводами и вперед.
                  Я схемотехнике не обучен, мне так, на поиграться. Поэтому — создание платы и пайка — не ко мне. А демо-платы недешевые, да и не всегда они слеланы так, как я хочу. Ограничивают частично возможности чипа. :(
                    0
                      0
                      STM32 искал в dip (вдумчиво) — не нашел,
                      NXP — есть, тут и статья была habrahabr.ru/post/189484/

                      А для бредборды переходничок сделаю, благо такие готовые платки-переходнички легкодоступны
                        0
                        Очень хотелось стартануть с этой статьи, но меньше чем за 1к не купишь железо ((
                          0
                          Как раз хватает
                          или на отладочную плату
                          или на контроллер с переходником и на программатор
                            +1
                            1к хватит и на базовую плату с программатором и плюс анализатор типа клона saleae. (настоятельно рекомендую, кстати. для игр с мк позволяет не слепо тыкаться, а видеть что и как просходит)
                              0
                              а по скриншотам не заметно что я его уже заценил? )) действительно очень крутая штука, даже ссылку добавил недавно в конец. Да, меня уже направили на магазин, где можно ST-Link за 700 купить и я его уже купил. Осталось дождаться программатор и STM32F030F4P6
                                0
                                сорри, тупанул :)
                          0
                          есть стм8 в дипе, с нецензурной ценой. проще/дешевле купить у китайцев платку с распаяным чипом.
                          +3
                          1. Для домашних самоделок 8-битных микроконтроллеров вполне достаточно. Толку от преимуществ 32-битных STM в большинстве случаев никакого.
                          2. 8-битные микроконтроллеры очень хорошо изучены, и на них сделано очень много проектов.

                          Я думаю, что этих пунктов достаточно, чтобы держаться за 8-битные атмелы.
                            0
                            согласен на счет достаточности ресурсов для самоделок, но у 8-ми битных атмелов нет интерфейса для пошаговой отладки — считаю жирным минусом. любые 32 бита (и атмел и стм), а также stm8 этого недостатка лишины.
                              +1
                              А как же debugWIRE?

                              Отладку в пошаговом режиме можно и в симуляторе проделать, все равно от нее толку чуть.
                                +1
                                Согласен, про debugWire забыл. но он только в avr studio работает, а у меня к ней личная неприязнь)).
                                А в симуляторе внешние устройства не всегда можно симулировать.
                                Если, что я холивар никакой не затеваю, я, напротив, авр очень люблю… хотя уже конечно по старой памяти, скорее. порастеряли они народную любовь, приходится признать.
                                  0
                                  Есть еще один минус debugWIRE. У меня usbasp самопальный на макетке
                                  +1
                                  У восьми битных Атмелов куча лицензионного и открытого софта для симуляции, не чем не хуже хардверной отладки (для примера Proteus, причем старых версий. Есть ли там STM?). Не стоит забывать и о JTAG в линейке Mega.

                                  Но если ваши профессиональные обязанности (читай, «приносящие постоянный доход») никак не связаны с выбором отдельной линейки микроконтроллеров определенного производителя, будете вы покупать новый тип от другого производителя, если вам нужно всего лишь на две недели быстро и без хлопот организовать «новогоднюю гирлядну»?

                                  +1
                                  1. по вполне достаточно. Статью прочтите еще раз — смысл заниматься мозголомством на восьмибитнике с эмуляцией UART, если есть МК за равную цену с аппаратным интерфейсом? Лучше заняться непосредственно логикой задачи. Для тех же стм32 посмотрите не возможности DMA — то что на восьмибитном атмеле приходится делать руками и постоянно отвлекать ресурсы МК, там выполняет ядро, только сообщая о результате (да, это и чтение термодатчиков массовых типа DS18B20, и обработка ADC, когда результат надо просто взять из памяти, и работа с дисплейчиками). Толк есть. Вопрос еще в инертности, зачем изучать что-то новое, старое работает.
                                  2. Для кода на си это не играет роли. Он в подавляющем числе случаев отлично переносим. Лично без проблем собирал код от восьмибитника атмела на 16-бит PIC, 32-бит STM32, 8-бит STM8. Изменений минимум.

                                  Так что это вопрос личных пристрастий — нравится, какие проблемы. Как еще ниже и написали — плюс ко всему человеческая отладка.
                                    +2
                                    1. Вы так говорите про инертность, будто в этом есть что-то плохое. Что-то новое надо изучать тогда, когда проблем от недостатков старого больше, чем будет проблем от перехода на новое. Вот зачем мне это DMA, если в несложных проектах (управление аквариумом, например) нет вообще никаких проблем, чтобы дёргать датчики и дисплейчики вручную в цикле?

                                    2. Изменений минимум — это сколько? Особенно если активно используются таймеры, АЦП и т.п.? А ничего, что изменения повышают вероятность появления багов?

                                    Вопрос очень спорный, и никак не сводится к сравнению соотношения нафаршированности и цены. Поэтому не вижу причин удивляться тому, что люди не спешат штурмовать STM.
                                      0
                                      1. Нет, инертность плохо только если из-за нее возникает много проблем, в попытке сделать что-то на хорошо известной базе, но неудобной. А так — просто как фактор, почему многие не меняют изученные средства. DMA для аквариума не обязательно. Но там ведь и МК, по большому счету, тоже не нужен? :)

                                      2. В конкретном упомянутом случае (это был стек TCP/IP от Lifelover с easyelectronics) изменения были в инициализации таймера и SPI для каждой платформы (несколько строк кода по сути). Весь остальной код платформонезависим оказался. А, для STM32 потребовалось на структурах применить запрет выравнивания данных по адресам для компилятора, иначе портился пакет.
                                      Вообще более-менее нормальный код портируется без проблем. Портянки логики вперемешку с использованием аппаратных ресурсов — отдельный цирк с конями, стараюсь так не писать.

                                      На днях обратную задачу делал — код от STM32 с DMA (onewire) адаптировал для STM8S. Опять же, несколько минут… Но все это, если работа с железкой четко выделена и не смешана с логикой.

                                      Ну и согласен, конечно — если есть в наличии набор отлаженых алгоритмов и методик под платформу и задачи укладываются на МК без извращений — особого смысла менять нет. Привычка великая сила.
                                      +3
                                      А зачем такой прагматичный подход?
                                      Любительство тем и замечательно, что в нем мозголомство является одной из целей процесса. А кайф от процесса не уступает кайфу от конечного результата.
                                      Ну это ведь клёво, завести программный уарт, пусть даже существуют мк с аппаратным, дма и прочими плюшками — это тоже одна целей.
                                        0
                                        Не, ну если хочется — не проблема. Мне просто пока больше интересен конечный результат, какая-то нестандартная железка и базовые кирпичики чаще изобретать не хочется. Хотя было дело, однопроводный протокол с собственными плюшками делал, ага
                                    +1
                                    У атмелов от 1.8 до 5 вольт. Сейчас редкий микроконтроллер не поддерживает такие значения.
                                    А интересного не будет ничего. Если цель «изучить ради прогресса» или уже профессиональное применение, то тогда вероятен вариант перехода на что то новое. Для «помигать светодиодом» вы остановитесь на том, подо что у вас уже имеется отлаженый тулчейн и опыт с возможностями отладки.
                                    0
                                    Сейчас как раз занимаюсь написанием кода под STM32L1, а STM32F0, точнее платку STM32F0 discovery использую в качестве программатора.
                                      0
                                      Мне всё дошло instagram.com/p/0JI71QSaIB/
                                      И я хочу сказать что Жопа с документацией. Информацию, необходимую чтобы понять все чего касаешься при мигании светодиодом пришлось собирать из 3-4 разных статей и сравнивать с примером из самой библиотеки.
                                      Вердикт по названным ранее критериям:
                                      • наличие возможности симуляции работы — наверно есть, я не симулирую. За то отладка — 10/10
                                      • наличие соотвествующей документации и примеров кода — 3/10
                                      • наличие примеров кода — 6/10
                                      • технические требования к применению — 10/10
                                      • ценовая доступность — 7/10
                                        0
                                        Примеры из стандартной библиотеки (в iar) это вообще жесть. У меня STM32L152 и что авторы хотели сказать в коде примере работы с GPIO загадка. Благо теперь перешел на сборку проектов на Linux и от iar отказался.
                                          0
                                          Несоглашусь. Во-первых какую библиотеку мучаем? Сейчас в «моде» HAL. И мое глубочайшее убеждение, что изучать (и уж тем более с нуля) надо именно его. А HAL естественно надлежит употреблять с STM32CubeMX. С STM32CubeMX «blinked led» получается практически в один мышиный клик.
                                          HAL накрывает хардварную специфику и, мой следующий шаг «PWM-LED» я сделал вообще не заглядывая в datasheet'ы (не говорю, что это хорошо — просто это факт).
                                          Вот заставить работать связку STM32CubeMX-Eclips с отладкой на чипе — было реально нелегко. Лихие ребята из STMicroelectronics не захотели делать генерацию проекта для бесплатного Eclipse, что вообще-то логично у них же есть платная trueStudio! Кстати на том Eclipse и основанная.
                                          Но заставить все работать в Eclipse — вполне возможно! Вот здесь об этом очень правильно написано:
                                          we.easyelectronics.ru/STM32/stm32cubemx-start-code-eclipse-bystryy-start-otladka-v-eclipse-cherez-st-link-discovery.html
                                          HAL идет в исходниках, с докой на тех же исходниках основанных и с примерами — код вполне приличный, да чего там — хороший код!

                                          p.s.
                                          Мой опыт работы с STM32 конечно мизерный. Но после того как я чуть-чуть пощупал эти камушки AVR'ки кажутся сирыми и убогими какими-то.
                                            +1
                                            Eclipse больно охоч до памяти — у меня его регулярно прибивает OOM. Конечно, 4Гб это уже мало, но я переехал на QtCreator с плагином BareMetal.
                                              0
                                              кажется в CooCox и есть STM32CubeMX. По крайней мере, в даташиты заглядывать не пришлось и это тоже спорный плюс ввиду отсутствия годной документации именно по фрэймфорку библиотеки. комменты в заголовочных файлах читать — это не круто
                                                0
                                                Мне так не показалось
                                                читаешь «STM32CubeMX» — подразумеваешь «HAL», наработки в CooCox — SPL
                                                Я пробовал CooCox — первая лампочка на нем заморгала, но как-то не глянулся он мне какой-то несерьёзный он что ли
                                                и в IAR заглядывал (о, боже! это же Borland C!), и trueStudio фришную скачал попробовал (какой смысл? — тот же Eclipse, да еще платный)

                                                Не сказать, что я от Eclipse в полном восторге — 100500 настроек в 1024х местах, но когда настроешь — нормально. И приятно, что все в «одном флаконе» :)
                                                  0
                                                  попробуйте погуглить «stm32 make template» www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=stm32%20make%20template его можно прикрутить к любой ide. Нужен только тулчейн для ARM и в случае windows необходим еще mingw. Ну и firmware поискать если требуется.
                                                    0
                                                    Не пойму зачем что-то еще, если заготовку со всей необходимой инициализацией МК, а так же весь необходимый пролог для запуска и скрипт для сборки всего этого мне поставляет STM32CubeMX — программа от производителя чипа (бесплатная). Остается только смысл добавить между фигурными скобками main()
                                                      0
                                                      Сейчас посмотрю что это.
                                                    0
                                                    Вот и где вообще написано про это все? Что есть HAL и SPL, какие у них особенности, где их официальная документация с туториалами и какие среды для них нативны? (шаманство с Eclipse как-то не для меня — это крайний случай).
                                                      0
                                                      Ой, я пошучу ладно? Не обижайтесь в случае чего, просто анекдот Одесский вспомнился:

                                                      — Будьте любезны, на что мне сесть, чтоб попасть на Дерибасовскую?
                                                      — Сядьте на жопу, вы уже на Дерибасовской!

                                                      Вот и где вообще написано про это все?

                                                      В интернетах понятное дело, и как я не люблю хабр — это не самый большой кладезь по теме stm32. Часть ссылок я уже привел. Ну и гугл — наше все. Не поверите, когда я уперся в тупик — как же заставить плагин openocd отлаживать «голый» чип — ответ нашелся в ролике на youtube где какой-то испанец (вроде) показывал как настраивать eclipse…

                                                      Да, с AVR все в точности так же!
                                                        0
                                                        Кажется вы выдали интересную идею для статьи!
                                                    0
                                                    и про «отсутствие годной документации»:
                                                    www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00122015.pdf
                                                    www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/LN1897/PF260612
                                                    по мне — так весьма годно.

                                                    Комменты в заголовочных файлах и сами исходные файлы — это вообще истина в первой инстанции
                                                    тут тебе и реализация и ключевые слова для дальнейшего поиска в даташитах.
                                                      0
                                                      Ладно, за низкоуровневую доку по HAL — спасибо. Надеюсь, в ней будут ответы на практические вопросы… Но все равно как-то все очень недоразработано и недопопуляризировано…
                                              0
                                              И чем его? www.chipdip.ru/product/st-link-v2/ — это неподъемный девайс, к сожалению…
                                                0
                                                или дискавери платы, к примеру stm8s discovery, недорогие сравнительно(программатор + чип) или китайские клоны стлинка.
                                                вот такой st-link v2 отлично справлятся с стм8/стм32, цена на порядок почти ниже чипдиповой.

                                                  +1
                                                  Сhipdip! да вы с ума сошли...:) у них же цены втрое (в лучшем случае)! Это же ретейловый магазин, туда надо с приятелями ходить — «чисто над ценами поржать». И зачем вам отдельный программатор берите хотя бы вот эту отладочную платку.
                                                  www.electronshik.ru/item/stm32f0discovery-1024065
                                                  Здесь и целевой камень того же семейства и ST-Link второй версии впридачу.
                                                0
                                                У Атмел есть и ARMы дешевые простые, правда их не на каждом шагу купить можно :)
                                                  0
                                                  А вот кстати и Atmel тоже, как оказалось (и что сильно меня удивило). Наткнулся в начале недели на акцию по раздаче атмеловских МК Cortex M0+. 2 штучки в руки обещают подарить… в том числе и радиогубителям, если верить тексту акции. Так вот если верить этому же сайту, то они эти самые Cortex M0+ продают по $0.90 (по нынешним временам сравнимо с вышеозвученными ценами). Правда, складывается ощущение, что штучно у них покупать нельзя — типа не работают с частными лицами.
                                                    +1
                                                    «Зона комфорта» обычно трактуется несколькими параметрами:
                                                    — наличием возможности симуляции работы;
                                                    — наличие соотвествующей документации и примеров кода;
                                                    — технические требования к применению (например по частоте, скорости обработки и пр);
                                                    — ценовая доступность.

                                                    Для Атмелов все условия на высоте для подобного класса устройств. Так что еще долго ее мало кто покинет.
                                                    0
                                                    Даже инфракрасный порт не нужен, можно принимать таким же светодиодом: link.springer.com/chapter/10.1007/978-3-540-39653-6_14
                                                    +5
                                                    Какой ужас у автора оригинала вместо кода. Причем вот это место и вовсе анекдот:
                                                    if (start == 0) 
                                                    {
                                                        temp = 0x80;
                                                        start = 1;
                                                        count--;
                                                    	goto razvet;  //////////////////////ВОТ ЖЕЖ СТЫДОБА!
                                                    }       
                                                    temp = data;
                                                    temp = temp >> count;
                                                    temp = temp << 7;
                                                    razvet:
                                                    

                                                    Это же банальное else. Других переходов на эту метку поиском не нашлось:
                                                    if (start == 0) 
                                                    {
                                                        temp = 0x80;
                                                        start = 1;
                                                        count--;            
                                                    }
                                                    else
                                                    {       
                                                     temp = data;
                                                     temp = temp >> count;
                                                     temp = temp << 7;
                                                    }
                                                    

                                                    Если в коде есть хотя бы одна метка или глобальная переменная, этот код становится очень трудоемким в плане анализа, рефакторинга, объединения с другим кодом, — короче, для любой стадии жизненного цикла программы.
                                                      +1
                                                      Я это место не трогал потому что неизвестно что меньше места будет занимать. вроде эта метка не драконит.
                                                        0
                                                        А почему else, кстати, если код за if выполняется и при истинном условии?
                                                          +1
                                                          При истинном условии мы код за if перепрыгиваем по метке.
                                                            +3
                                                            Блин, точняк. Ну и жесть, это реально не очевидно для меня было… Теперь я лучше понимаю почему goto =зло
                                                              0
                                                              Не всегда зло. Автор скорее всего понимал и экономил память программ. В контроллере с таким количеством памяти goto может занимать сильно меньше места чем if/case statemets. Однако преждевременно так оптимизировать не стоит!
                                                                0
                                                                GCC выдает в данном случае идентичный код что с goto, что с if/else.
                                                                  0
                                                                  Ну как бы намекает. И не только этот источник. И не только для avr.
                                                                    0
                                                                    GCC-это первое, что мне попалось под руку. Вы можете написать в данном случае код лучше?

                                                                    Давайте без намеков — вы хотите сказать, что GCC «плохой» и приводите в качестве аргумента публикацию пятилетней давности, в которой изложено субъективное мнение некоего эксперта без каких-либо тестов и измерений.

                                                                    Собственно, мнение такое — «GCC плохой, потому как по звонку мне мою проблему не решат, а мне придется гуглить и тратить время».

                                                                    А какой тогда компилятор «хороший»?

                                                                    Тот, который соответствует стандартам?
                                                                    Тот, который выдает код, который понравился эксперту? Он там Keil нахваливает, который на стандарт откровенно полюет, в результате чего у пользователей возникает когнитивный диссонанс, потому как банальный пример из учебника внезапно развалился, хотя стандарт гарантирует в этом случае, что пример корректный.

                                                                    Который компилирует быстрее всех? Так GCC в тесте с ICC и CLANG всех обогнал, правда тест староват.

                                                                    Инструмент должен соответствовать задаче. Для just for fun радиогубительства, которым данная статья и является, и GCC сойдет. В «рабочее устройство» авторы просто поставят контроллер с нужной периферией и нужным запасом ресурсов, чтобы не бегать за последним байтом.
                                                                      0
                                                                      Давайте без намеков, вы правильно подметили. По сути, я не писал, что GCC плохой, как не писал и то, что он хороший. Намек на статью был в контексте, что у разных компиляторов различное качество кодогенерации. Сейчас мы об этом качестве не говорим. Если мы обратимся к оригинальной статье с оригинальным кодом, который мы здесь обсуждаем, то можно увидеть, что статья написана в 2012 году, т.е. тоже не самая свежая. А как вы верно подметили, пять лет назад GCC, возможно, был не такой хороший (или плохой), как сейчас. Соответственно вывод о том, что генерируется идентичный код (с циклом и переходом), в то время не совсем корректно. Для текущей ситуации в настоящем времени допускаю, что итог работы будет идентичным. Ваше же заявление выглядело довольно категорично, поэтому я и привел ссылку тоже мнение, опирающееся да, на субъективную оценку, но в поле нескольких рассмотренных кодогенераторов.
                                                                        0
                                                                        Чтобы окончательно во всем убедиться, надо откопать тот самый win-avr (то есть фактически, тоже GCC) от шестой студии и посмотреть. Однако я не думаю, что трудозатраты того стоят.

                                                                        Ради интереса также можно попытаться написать все на чистом ассемблере и устроить этому коду очную ставку с выхлопом GCC.
                                                          0
                                                          Есть у меня смутное подозрение, что код что с меткой, что без метки странслируется в одни и те же инструкции.

                                                          P. S. А вы кстати не забыли включить -Os?
                                                            0
                                                            Все настройки компилятора по умолчанию. А чтобы метку выкинуть, все-таки не хватит одного else.
                                                              0
                                                              Покажите ваш вариант с этим «еще одним else».
                                                                +3
                                                                Туплю. Хватит. Зачем выпилили удаление комментов? Т_Т
                                                          0
                                                          А не смотрели в сторону SPI и какого нить конвертера? Вот уж точно простой интерфейс, нам пришлось делать дёрганье ножками на FX3, т.к. SPI в 32битном режиме шины GPIF недоступен.
                                                            0
                                                            Да, вообще, мне это к малине подключать и там SPI есть… Ну не знаю, SPI… Проводов куча…
                                                              0
                                                              да, тремя проводками не обойдёшься, как минимум 4, если SS на малине сразу прижать на землю. Ну а если не нужно читать или писать можно физически одну линию MOSI или MISO убрать. Ещё один провод сэкономить.
                                                            +5
                                                            Какой адский ад. 304 байта кода на примитивный программный UART, без приема данных, без ничего, еще и с использованием таймера?
                                                            Держите мой древний код простейшего UART. 146 байт, если убрать auto-baud — 108. На Tiny13 не тестировал, правда, но не вижу причин ему там не заработать после настройки:
                                                            github.com/sirgal/AVR-ASM-Software-UART/blob/master/software_uart.asm
                                                            Единственный гарантированный и вменяемый способ уменьшить размер кода на AVR — перейти на ассемблер для AVR. Он вообще не страшный, если понять некоторые его особенности, даже проще чем C. Попробуйте :)
                                                              0
                                                              А не проще обзавестись stm8s003f3p6, который стоит дешевле и умеет больше?.. На дворе 2015 год, не?
                                                                +1
                                                                Упоминал его уже раньше :) Ну… любят люди преодолевать трудности. Плюс, возможно, у кого-то просто валяется много старых МК, выбросить рука не поднимается. Можно и поизвращаться.
                                                                +3
                                                                Очень удачная и компактная реализация UART'a, в скомпиленном виде занимает 62 байта:

                                                                AVR half-duplex software UART supporting single pin operation
                                                                nerdralph.blogspot.ca/2014/01/avr-half-duplex-software-uart.html
                                                                  0
                                                                  Реализация хоть и компактная, но наглухо выключает прерывания на время обмена.
                                                                  Если это создает проблемы, на низкой скорости можно попытаться сыграть на таймере и внешнем прерывании.
                                                                  0
                                                                  Вот предлагаю ещё один пример кода:
                                                                  habrahabr.ru/post/251141/
                                                                    0
                                                                    Глянул, спасибо за поддержку темы. На ардуине кодить под t13 — это лучше чем на бэйсике!
                                                                      0
                                                                      Данный код должен заработать и на других средах разработки, которые переваривают Си.
                                                                        0
                                                                        Да меня просто скриншот удивил. Так то да, странно кстати что ардуино поддерживает такое низкоуровневое программирование, я думал такнельзя
                                                                          +1
                                                                          Дыкть «внуте-то неонка» :) Среда транслирует скетчи в С и радостно компилит это все GCCей + предзашитый бутлоадер + usb-com конвертер с самим контроллером на платке — вот и вся Arduino'вская магия!
                                                                            +1
                                                                            внутри ардуины используется avr-gcc. То есть тоже самое, что и в Avr Studio последних релизов. Отличие от cтудии в том, что компиляция производится с фреймворком на С++. Из-за этого иногда приходится подкорректировать некоторые данные из старых проектов (например структуры нуждо точно корректировать), но запускается без проблем.

                                                                  Only users with full accounts can post comments. Log in, please.