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

Обсуждаем контроллеры компании Atmel.
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Подтяжку тоже нужно включать.
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

Соединить выход со входом reset, тогда весь код - задержка и переключение в режим выхода.
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

[quote="ARV",url="/forum/viewtopic.php?p=4203861#p4203861"]ну, вот я и добрался до протеуса...[/quote]
Makefile предоставьте.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

Раз аппаратный таймер нельзя использовать, значит таймер надо перенести в основной цикл.
На частоте 9,6МГц частота таймера получается 369,235кГц, джиттер составит 1/369,235кГц 2,7083us.
Спойлер

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

#include <avr/io.h>

#define  n_counter  91

union BytByte {
struct {
uint16_t l;
uint8_t m;
unsigned char b0: 1;
} bit;
uint32_t byte;
}__attribute__((packed));

int main(){
static union BytByte myBByte;
	DDRB |= (1<<0);
  while(1){
	myBByte.byte += n_counter;  
	PORTB = myBByte.bit.b0;	
  }
}

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

avr-size firmware.elf
   text    data     bss     dec     hex filename
     68       0       4      72      48 firmware.elf
Добавлено after 43 minutes 13 seconds:
Вот думал, ну как бы судьбу обмануть
Спойлер

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

#include <avr/io.h>

#define  n_counter  35

union BytByte {
struct {
uint16_t h;
uint8_t hm;
unsigned char b0: 1;
} bit;
uint32_t byte;
}__attribute__((packed));

int main(){
//static union BytByte myBByte;
register union BytByte myBByte  asm("r6");
	DDRB |= (1<<0);
  while(1){
	myBByte.byte += n_counter;  
	PORTB = myBByte.bit.b0;	
  }
}

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

avr-size firmware.elf
   text    data     bss     dec     hex filename
     20       0       0      20      14 firmware.elf
9,6МГц 1Гц частота таймера 959.969кГц джиттер составит 1/959.969кГц 1,0417us
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

А с регистром OSСCAL еще никто не предлагал поиграться с целью скорректировать времянки итогового меандра?
Да, это плюс два байта к коду, но точность можно получить выше.
I am DX168B and this is my favourite forum on internet!
Реклама
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Раз уж используется тактирование от WDT, проверил возможность использования WDT в качестве интервального таймера.
Зарядил на формирование 0,5 сек. В реале период оказался >1,2 секунды.

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

.ORG $000
START:
GO:
	LDI	ZH,1<<WDTIF|1<<WDTIE|1<<WDCE|0<<WDE|1<<WDP2|1<<WDP0
	OUT	WDTCR,ZH
WAIT_500:
	SBI	DDRB,0

	IN	ZL,WDTCR
	SBRS	ZL,WDTIF
	RJMP	WAIT_500
	SBI	PINB,0
	RJMP	GO
.EXIT
Программное формирование интервала 0,5 сек показало, что частота генератора
WDT ~117300Гц. При задании такой частоты период составил 1'0000'18...1'000'119мкс

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

.equ	Fo=117300	;128000
Проверил работу программы с использованием таймера, подав 5'000'000,(0) от стандарта. Период составил 366300.2мкс, что соответствует частоте 2,730001Гц.

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

.equ	Fo=5000000	;стандарт частоты
Гораздо хуже от встроенного генератора 9,6МГц.
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

Ни знаю что там в реале, речь шла про протеус, и вот насколько точно можно было бы сделать в протеусе
Спойлер

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

#include <avr/io.h>

int main(){

	DDRB |= (1<<0);
  while(1){
asm volatile(
        "ldi 	r24, 0xe2 	\n\t"
		"ldi 	r25, 0xee 	\n\t"
		"ldi 	r26, 0x30 	\n\t"
        "add	r4,r24  	\n\t"
        "adc 	r5,r25		\n\t"
        "adc 	r6,r26		\n\t"
		"adc 	r7,r1		\n\t"
		"adc 	r8,r1		\n\t"
		"adc 	r9,r1		\n\t"

		"mov 	r24,r9		\n\t"
		"andi 	r24,0x01	\n\t"
		"out 	0x18,r24	\n\t"
);
  }
}

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

avr-size firmware.elf
   text    data     bss     dec     hex filename
     28       0       0      28      1c firmware.elf
и сам протеус с hex файлом
gen2.zip
(31.32 КБ) 18 скачиваний
Ответить

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