Программирование AVR
Может, я чего не так понимаю... но в табличке дано N от 2 до 19 и формула обратной связи, где указаны как минимум ДВА отвода а не один. т.е. мало того что табличка рассчитана до 19 бит, так еще и с двумя-четыремя отводами. А нужен всего-навсего ОДИН и для 32(33) бит. Где эти данные взять в той таблице? Нету-с... для 20 и более бит там есть ссылка на теорию, изучать которую нет никакого желания.
- Реклама
Нет, мы, наверное, с вами разные таблицы смотрим
http://www.newwaveinstruments.com/resou ... r_lfsr.htm
Внизу есть Tables of M-Sequence Feedback Taps
И там до 32-х бит.
Да, у 32-х битного начинается с 4-х отводов: http://www.newwaveinstruments.com/resou ... stages.txt
Но я склонен верить тому, что с меньшим количеством просто не получится М-последовательности. Если вы можете это опровергнуть и подтвердить — вэлкам.
http://www.newwaveinstruments.com/resou ... r_lfsr.htm
Внизу есть Tables of M-Sequence Feedback Taps
И там до 32-х бит.
Да, у 32-х битного начинается с 4-х отводов: http://www.newwaveinstruments.com/resou ... stages.txt
Но я склонен верить тому, что с меньшим количеством просто не получится М-последовательности. Если вы можете это опровергнуть и подтвердить — вэлкам.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Когда-то давным-давно сохранил такие данные для ГСЧ на регистре с одним отводом:
N, M, период повторения: (за цикл повторения выходит "1" на 1 больше чем "0")
10, 7, 1023
11, 9, 2047
15, 14, 32767
17, 14, 131071
18, 11, 262143
28, 25, 268435455
33, 20, 8589934591
N, M, период повторения: (за цикл повторения выходит "1" на 1 больше чем "0")
10, 7, 1023
11, 9, 2047
15, 14, 32767
17, 14, 131071
18, 11, 262143
28, 25, 268435455
33, 20, 8589934591
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Ну, ХЗ. В таблице приведено: количество бит, оптимальный полином, период. Или вам не это надо? Насчет прожженного математика - у нас это было на четвертом курсе. И не скажу, что я был самый прилежный студент, однако для понимания, что это, смутных воспоминаний хватает.В табличке по ссылке нет этих данных. ... Какому-нибудь прожженому математику...
Например, по ссылке видно что, чтобы получить нормальный генератор с периодом 65535 (третья колонка), надо взять шестнадцатиразрядный сдвиговый регистр (первая колонка), сделать отводы от 16, 14, 13, 11 битов (степени при x), и, заXORив их, подать на вход регистра. С выхода будем снимать ПСП.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аппаратно зоXOR-ить 4 бита - без проблем, а программно это лишние операции. Тем и хорош ГСЧ на регистре с одним отводом.
- Реклама
По одной команде на каждый отвод. Это разве много?Alexeyslav писал(а):а программно это лишние операции
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
И это единственное его преимущество. Наилучшие статистические свойства последовательности получаются именно при указанных полиномах. А с одним отводом будет тоскливо.Тем и хорош ГСЧ на регистре с одним отводом.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Сообщения: 29
- Зарегистрирован: Вс май 02, 2010 05:32:09
Уважаемые форумчане, подскажите как дописать код программы для тини13.
#include <avr/delay.h>
void main(void)
{
PORTB=0b00000000;
DDRB=0b00000011;
while (1)
{
if (!(PINB & (1<<PINB2))) // проверить "0" на линии 1 порта pB2
{
PORTB |= _BV(PB0); // установить "1" на линии PB0
}
else
if (!(PINB &(1<<PINB3)))// проверить "0" на линии 1 порта pB3
{
PORTB &= ~_BV(PB0); // установить "0" на линии PD1
}
else
if (!(PINB & (1<<PINB4))) // проверить "0" на линии 1 порта pB4
{
PORTB |= _BV(PB1); // установить "1" на линии PB0
}
};
}
имеется два светодиода, 3 кнопки. РВ2, РВ3 включают/выключают РВ0, РВ4 включает РВ1. нужно чтоб РВ0 включался/выключался только тогда, когда включён РВ1 Заранее благодарен.
#include <avr/delay.h>
void main(void)
{
PORTB=0b00000000;
DDRB=0b00000011;
while (1)
{
if (!(PINB & (1<<PINB2))) // проверить "0" на линии 1 порта pB2
{
PORTB |= _BV(PB0); // установить "1" на линии PB0
}
else
if (!(PINB &(1<<PINB3)))// проверить "0" на линии 1 порта pB3
{
PORTB &= ~_BV(PB0); // установить "0" на линии PD1
}
else
if (!(PINB & (1<<PINB4))) // проверить "0" на линии 1 порта pB4
{
PORTB |= _BV(PB1); // установить "1" на линии PB0
}
};
}
имеется два светодиода, 3 кнопки. РВ2, РВ3 включают/выключают РВ0, РВ4 включает РВ1. нужно чтоб РВ0 включался/выключался только тогда, когда включён РВ1 Заранее благодарен.
Довольно сложный для восприятия код. Я бы завёл три логические переменные с говорящими за себя именами, куда сначала скопировал бы состояние кнопок, а уже потом более наглядным образом реализовывал бы логику. Она оказалась бы достаточно очевидной.
В таком лесу из трёх сосен не мудрено и заблудится.
В таком лесу из трёх сосен не мудрено и заблудится.
- Сообщения: 29
- Зарегистрирован: Вс май 02, 2010 05:32:09
Спасибо за ответы. Я пока начинаю осваивать программирование.
Вчера новые "три сосны" состряпал. В протеусе вроде работает.
#include <avr/io.h>
#define F_CPU 9600000UL
#include <avr/delay.h>
void main(void)
{
PORTB=0b00000000;
DDRB=0b00000011;
while (1)
{
if (!(PINB & (1<<PINB2))) // проверить "0" на линии 1 порта pB2
{
PORTB |= _BV(PB0); // установить "1" на линии PB0
_delay_us(200);
start:
{
if (!(PINB &(1<<PINB3)))// проверить "0" на линии 1 порта pB3
{
PORTB &= ~_BV(PB0); // установить "0" на линии PD0
_delay_us(200);
}
else
if (!(PINB & (1<<PINB4))) // проверить "0" на линии 1 порта pB4
{
PORTB |= _BV(PB0); // установить "1" на линии PB0
_delay_us(200);
}
goto start;
}}}}
Сегодня буду пробовать с прерыванием.
Вчера новые "три сосны" состряпал. В протеусе вроде работает.
#include <avr/io.h>
#define F_CPU 9600000UL
#include <avr/delay.h>
void main(void)
{
PORTB=0b00000000;
DDRB=0b00000011;
while (1)
{
if (!(PINB & (1<<PINB2))) // проверить "0" на линии 1 порта pB2
{
PORTB |= _BV(PB0); // установить "1" на линии PB0
_delay_us(200);
start:
{
if (!(PINB &(1<<PINB3)))// проверить "0" на линии 1 порта pB3
{
PORTB &= ~_BV(PB0); // установить "0" на линии PD0
_delay_us(200);
}
else
if (!(PINB & (1<<PINB4))) // проверить "0" на линии 1 порта pB4
{
PORTB |= _BV(PB0); // установить "1" на линии PB0
_delay_us(200);
}
goto start;
}}}}
Сегодня буду пробовать с прерыванием.
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Лучше с самого начала забыть про goto.MTSnik писал(а):Я пока начинаю осваивать программирование.
И еще - чтобы html не съедал форматирование исходника, используйте теги [сode]...[/сode]
Бедное go to... Правила хорошего тона не рекомендуют использовать go to <вперед> . А для безусловного зацикливания - чем оно хуже пресловутого while (1) ( меня до сих пор смешит эта конструкцияPnjom-Penb писал(а):Лучше с самого начала забыть про goto.
Конечно, это мое личное мнение, тем боле я для МК на С не пишу.
А на советы даже не обратил внимания... в твоём коде запутаться как в трёх соснах! Не привыкай писать столь непонятный код, да ещё умудряясь сделать его запутанным в 10 строчках.
Действуй логично, последовательно и наглядно. Вынеси столь сложные конструкции как проверка бита порта за пределы основного алгоритма, чтобы они не мешали взгляду и не позволяли путаться в трёх соснах.
Действуй логично, последовательно и наглядно. Вынеси столь сложные конструкции как проверка бита порта за пределы основного алгоритма, чтобы они не мешали взгляду и не позволяли путаться в трёх соснах.
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
В таком случае используйте for (;;) - кстати, некоторые люди считают такой способ организации бесконечного цикла предпочтительным.меня до сих пор смешит эта конструкция
Разница между теорией и практикой на практике гораздо больше, чем в теории.


