Соревнование "свободных художников" по мини-хелловорду

Обсуждаем контроллеры компании Atmel.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA

Сообщение GoldenAndy »

ARV писал(а):само собой, принимаем, что встроенный RC-генератор даёт строго частоту по даташиту
Ну тогда походу тактирование от вочдога (128кГц), конфигурация порта и таймера дадут 1 Гц. Делитель 1024, FastPWM с верхним пределом в OCRA == 124.
При идеальных 128 кГц выход - идеальный 1 Гц. И даже без джиттера...
А дальше гонки оптимизаторов компиляторов
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

GoldenAndy писал(а):А дальше гонки оптимизаторов компиляторов
а теперь то же самое в виде реального кода и прочего, что было оговорено :)))

Добавлено after 3 minutes 38 seconds:
кстати, рассказывая о технологии получения минимального кода вы помогаете конкурентам, не выигрывая гонку сами :))) я вот забыл о возможности тактирования от WDT-генератора... теперь улучшу свой результат :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

[uquote="Martian",url="/forum/viewtopic.php?p=4203634#p4203634"]я не знаю AVR, но где-то так...[/uquote]
"где-то так" с код с сокращенными строками -> на "железе" реальной схемы не работает. Было бы лучше дать свой код (написанный и проверенный).
Первая ошибка из-за отсутствия setup(). Потом не работает из-за отсутствия объявленного вывода на выход.
---
Другой код не появится?
Или запустить следующий с перерывом по таймеру :)? Так я и сказал, что вариантов в условии должно быть много, с оценкой "весовых" коэффициентов.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

17,088764914064516129032258064516
Изображение
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/boot.h>

#define PIN_1HZ_MASK _BV(PB3)

// Timer/Counter Compare Match A
ISR(TIM0_COMPA_vect)
{
  PINB |= PIN_1HZ_MASK;
}

int main(void)
{
  uint8_t prescaler = 0;
  uint8_t f_low  = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS);
  uint8_t f_cksel = ~(FUSE_CKSEL0 & FUSE_CKSEL1) & f_low;
  switch(f_cksel) {
  case (uint8_t)~(FUSE_CKSEL0 & FUSE_CKSEL1):  // Internal 128 kHz Oscillator
    // clkIO/8 = 16 kHz
    prescaler = _BV(CLKPS1) | _BV(CLKPS0);
    // clkIO/64
    TCCR0B = _BV(CS01) | _BV(CS00);
    // f = 16000 Hz / (2*64*(124+1)) = 1 Hz
    OCR0A = 124;
    break;
  case (uint8_t)~FUSE_CKSEL1:  // 9.6 MHz
    // clkIO/256 = 37500 Hz
    prescaler = _BV(CLKPS3);
    // clkIO/256
    TCCR0B = _BV(CS02);
    // f = 37500 Hz / (2*256*(72+1)) = 1,003317637 Hz
    OCR0A = 72;
    break;
  case (uint8_t)~FUSE_CKSEL0:  // 4.8 MHz
    // clkIO/128 = 37500 Hz
    prescaler = _BV(CLKPS2) | _BV(CLKPS1) | _BV(CLKPS0);
    // clkIO/256
    TCCR0B = _BV(CS02);
    // f = 37500 Hz / (2*256*(72+1)) = 1,003317637 Hz
    OCR0A = 72;
    break;
  }
  // prescaler
  CLKPR = _BV(CLKPCE);
  CLKPR = prescaler;
  // Timer0 CTC mode 2, Toggle OC0A on Compare Match
  TCCR0A = _BV(COM0A0) | _BV(WGM01);
  // Timer/Counter0 Output Compare Match A Interrupt Enable
  TIMSK0 = _BV(OCIE0A);
  // 1 Hz output
  DDRB = PIN_1HZ_MASK;
  // enable interrupts
  sei();
  while(1) {
    ;
  }
}
Вложения
1Hz.zip
(5.02 КБ) 94 скачивания
Последний раз редактировалось Карбофос Пт мар 25, 2022 15:12:36, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

[uquote="veso74",url="/forum/viewtopic.php?p=4203646#p4203646"]Первая ошибка из-за отсутствия setup(). Потом не работает из-за отсутствия объявленного вывода на выход.
---
Другой код не появится?[/uquote]
Я же сказал, что не знаю AVR. Вы не поняли принцип. Другой код не появится. Этот код (с таким принципом) прекрасно работает на MSP430, в железе притом (я вообще не вижу необходимости использования симуляторов).
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4448
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Вне конкурса. :)

Код: Выделить всё

;25.03.2022

.INCLUDE "tn13def.inc"
;.INCLUDE "tn13Adef.inc"

.equ	Fo=128000	; WDT

.CSEG

.ORG $000
START:
	SBI	DDRB,1
GO:
	SBI	PINB,1

	LDI	XH,HIGH(5*Fo/10/4-1)
	LDI	XL,LOW(5*Fo/10/4-1)
WAIT_500:
	SBIW	XL,1
	BRNE	WAIT_500

	RJMP	GO
.EXIT
TEST_TN13.hex
(71 байт) 90 скачиваний
14 байт.
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

[uquote="Martian",url="/forum/viewtopic.php?p=4203664#p4203664"]... Этот код (с таким принципом) прекрасно работает на MSP430 ...[/uquote]
Раздел выше - AVR. Соревнование весьма вероятна: для AVR.
--
akl, вспомни начало :) :

Код: Выделить всё

1. условия:
- код на С/С++, любой доступный компилятор Си/С++;
- запрещается ассемблер, ассемблерные вставки (ключевое слово asm), кроме входящих в "стандартный" комплект компилятора (aka libc);
Последний раз редактировалось veso74 Пт мар 25, 2022 15:12:12, всего редактировалось 2 раза.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

даже вне конкурса низачот - нет коэффициента.

лирическое отступление: вот по-русски же написал, и все грамотные, всё поняли... а поди ж ты - ни один не сыграл по правилам! :facepalm: :dont_know:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA

Сообщение GoldenAndy »

ARV писал(а):кстати, рассказывая о технологии получения минимального кода вы помогаете конкурентам, не выигрывая гонку сами
Как говорил Макс Отто фон Ширлиц - "Тот кто не знает Германию - поехал бы там. А я знаю Германию".
Так вот, я могу сказать, что я достаточно хорошо знаю старые АВРки.
Программная генерация меандра возможна. Но нужно сильно-сильно считать такты. Что на Си не всегда получается с наскоку.
1. поднять пин
2. задержка1
3. положить пин
4. задержка 2
5. перейти к 1.
вот эти пункты 1,3 и 5 тоже имеют время выполнения, которое нужно учесть в пунктах 2 и/или 4.
Тут надо играться.
Но МК - это ЦПУ+периферия. Поэтому проще и правильней использовать таймер.
Код простой.
Нужно проинициализировать 5 портов - DDR, TCCR0A/B,OCR0A/B.
Потом пустой цикл.
По идее 4 из них - это комбинация LDI и OUT, один SBI и один RJMP.
Минимальная прога на АСМе должна составлять 10 команд. 20 байт.
И в результате соревнование сводится к тому, кто лучше знает ключи компилятора/линковщика, что бы выбросить из программы все лишние ненужные телодвижения.

Эмулировать в протезе не хочу. Просто облом.
Чисто ради спорт интереса накидал. Оптимизация -О1
Изображение

При оптимизации -Os - те же 60 байт.

Вот теперь задача сводится к тому, что б компилятор забыл все, чему его учили в школе и скомпили код с адреса 0х0000 без всяких инициализаций.

Добавлено after 3 minutes 3 seconds:
Упс. вдогонку.
DDRB = _BV(PORTB1); тоже компилируется в LDI + OUT
А вот DDRB |= _BV(PORTB1); компилится в SBI.
Итого - 58 байт.

Кто меньше сделает и покажет в протезе - тот и выиграет )
А я в конкурсе НЕ УЧАСТВУЮ.
Вложения
meandr.jpg
(64.88 КБ) 344 скачивания
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Код: Выделить всё

#include <avr/io.h>

int main(){
  DDRB |= (1<<0);
  TCCR0A = (0b01<<COM0A0 | 0b10<<WGM00);
  TCCR0B = (0b0<<WGM02 | 0b100<<CS00);
  OCR0A = (250)-1;
  while(1){
  }
}

Код: Выделить всё

$ avr-gcc ../main.c -mmcu=attiny13 -o firmware.elf -Os -nostartfiles
$ avr-size firmware.elf    text    data     bss     dec     hex filename
     16       0       0      16      10 firmware.elf
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

[uquote="veso74",url="/forum/viewtopic.php?p=4203667#p4203667"]Раздел выше - AVR. Соревнование весьма вероятна: для AVR.[/uquote] Хорош тупить. Я не приводил код для MSP430. Я переработал предложенный вариант для AVR. Необходимость всяких setup, вызовов которых явно не видно, мне у вас, одуринщиков, непонятна. Всё, что я хотел - показать, что изменять состояние порта можно не только записью в него, но и изменением его режима, что иногда может дать выигрыш.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 5750
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж

Сообщение >TEHb< »

Если вне конкурса (читай, "по приколу"), то вот ещё статейка.
"Привет!" - соврал он.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA

Сообщение GoldenAndy »

COKPOWEHEU, оу, СТС интереснее. Я не подумал про этот режим.
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Про CTC я сразу же и подумал. В этом режиме таймеру можно "порезать" разрядность, тем самым, регулируя частоту.
Я в конкурсе тоже не участвую, так как я (и не только я) сразу же видел решение на таймере, проще которого даже и не знаю, что может быть.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 5750
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж

Сообщение >TEHb< »

COKPOWEHEU, Собрал, прошил, не мигает. Один из нас что-то перепутал.

Прошу прощения, это я немножко дурачок оказался. Заработался совсем и файлы прошивки путаю.
Последний раз редактировалось >TEHb< Пт мар 25, 2022 16:10:10, всего редактировалось 1 раз.
"Привет!" - соврал он.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

не уверен, что таймер - это хорошее решение. для конкретного случая и описанных условий - да, но стоит только отказаться от нестабильного генератора WDT... и еще вопрос...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA

Сообщение GoldenAndy »

>TEHb<, да потому что там ошибка.
Там PORTB0 включается на выход. А надо PORTB1.
Т.е. не DDRB |= (1<<0);, а DDRB |= (1<<1);

Всё верно PORTB0. Это ж OC0A.

ARV, по условиям задачи тактирование WDT можно.
А в реале без калибровки по внешнему татированию достичь точности без кварца - нереально.
Последний раз редактировалось GoldenAndy Пт мар 25, 2022 15:54:02, всего редактировалось 2 раза.
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

GoldenAndy, COKPOWEHEU, спасибо за код, всегда можно чему-то научиться :).
Последний раз редактировалось veso74 Пт мар 25, 2022 15:57:47, всего редактировалось 3 раза.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

GoldenAndy писал(а):по условиям задачи тактирование WDT можно
так я не возражаю.
можно ведь второй этап конкурса сделать, поставив задачу "идеально" тактируясь от "встроенных" генераторов получить меандр 1,2 Гц или 2,73 - и? я вечером протестирую все из предложенного, что смогу (gcc скомпилирую, ардуинские штуки - только если есть hex) и свой вариант покажу (я его, вам благодаря, сделал меньше на несколько байт)... и предложу продолжить с новыми условиями :)

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

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «AVR»