Рисунок 1 — Схема 74HC595 |
При поступлении тактового импульса на вход SHCP со входа DS считывается первый бит и записывается в младший разряд. Со следующим тактовым импульсом бит из младшего разряда сдвигается на один разряд, а на его места записывается бит, поступивший на вход DS. Так повторяется все время, а при переполнении сдвигового регистра, ранее поступившие биты последовательно появляются на выходе Q7S. Очистка регистра производится подачей низкого уровня на вход MR.
Чтобы принятые данные появились на рабочих выходах, их сначала необходимо записать в регистр хранения. Делается это подачей импульса высокого уровня на вход STCP. Данные в регистре хранения изменяются лишь при подаче следующего импульса записи.
Для перевода рабочих выходов в высокоомное состояние, на вход OE необходимо подать высокий уровень.
Основные характеристики:
Вот пожалуй и все, что необходимо знать о сдвиговом регистре. В следующей статье перейдем к работе регистра сдвига в связке с микроконтроллером.
Благодаря заметке Два способа мультиплексирования светодиодов на примере микроконтроллеров AVR мы с вами знаем, что можно управлять сотней светодиодов, используя всего лишь 11 пинов микроконтроллера. Но что делать, если нужно управлять двумястами или, скажем, тысячью светодиодами? Оказывается, что изученные способы мультиплексирования могут быть улучшены, да так, что используя всего лишь три пина микроконтроллера можно управлять абсолютно любым количеством светодиодов! И в этом нам помогут следующие микросхемы.
Примечание: Если вы пропустили предыдущий пост, посвященный микросхемам 74xx, вот он — Интегральные схемы: чипы стандартной логики 74xx. Впрочем, тот пост был посвящен логическим вентилям, и для понимания представленного далее материала читать его не требуется.
Сдвиговые регистры — это микросхемы, позволяющие, очень грубо говоря, добавить пинов вашему микроконтроллеру. Для добавления пинов на запись, используются SIPO сдвиговые регистры. SIPO означает «последовательный вход, параллельный выход». Если же нужно больше пинов на чтение, используются сдвиговые регистры PISO, «параллельный вход, последовательный выход». В данном разделе мы познакомимся с типичным SIPO сдвиговым регистром, 74HC595.
Какой пин 74HC595 для чего предназначен, можно узнать из даташита [PDF]:
Если коротко, то:
Надеюсь, идея ясна — мы последовательно передаем на сдвиговый регистр восемь бит информации по одному биту. Затем сдвиговый регистр параллельно выводит полученные биты на восемь пинов. Отсюда и «последовательный вход, параллельный выход».
Пример кода:
const uint8_t hc595_data = 6; /* SER *//* … */
void setup()
{
pinMode(hc595_data, OUTPUT);
pinMode(hc595_latch, OUTPUT);
pinMode(hc595_clock, OUTPUT);
/* … */
}
/* … */
void loop()
{
/* … */
digitalWrite(hc595_latch, LOW);
shiftOut(hc595_data, hc595_clock, MSBFIRST, hc595_out);
digitalWrite(hc595_latch, HIGH);
/* … */
delay(100);
}
Нам даже не нужно писать никаких циклов. В Arduino уже предусмотрена готовая процедура shiftOut
, которая делает все за нас.
В итоге три пина микроконтроллера эффективно превратились в восемь пинов. Если соединить несколько сдвиговых регистров, как это было описано выше, то можно вместо восьми пинов получить сколько угодно. При этом в микроконтроллере все так же будет задействовано только три пина.
Существует похожий чип 74HC164, который имеет 14 пинов вместо 16-и. В нем отсутствует пин переноса (аналог Qh’). Даташит 74HC164 доступен здесь [PDF].
Типичным представителем PISO сдвиговых регистров является 74HC165.
Картинка из даташита [PDF]:
Назначение пинов:
Пример кода, считывающего состояние восьми кнопок, используя всего лишь три пина:
const uint8_t hc165_data = A5; /* QH *//* … */
void setup()
{
/* … */
pinMode(hc165_data, INPUT);
pinMode(hc165_clock, OUTPUT);
pinMode(hc165_latch, OUTPUT);
}
uint8_t shiftIn165(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder)
{
uint8_t value = 0;
uint8_t i;
for (i = 0; i < 8; ++i)
return value;
}
void loop()
{
digitalWrite(hc165_latch, LOW);
delayMicroseconds(5);
digitalWrite(hc165_latch, HIGH);
delayMicroseconds(5);
hc595_out = shiftIn165(hc165_data, hc165_clock, MSBFIRST);
/* … */
delay(100);
}
Встроенная процедура shiftIn
для работы с 74HC165, к сожалению, не годится, так в ней используется обратный порядок подачи сигналов LOW и HIGH на clockPin. Поэтому в приведенном коде используется собственная реализация с правильным порядком.
В данном контексте было бы большим упущением не рассказать про демультиплексоры, так как они могут быть использованы для управления светодиодными матрицами, так же, как и сдвиговые регистры. Грубо говоря, демультиплексоры занимаются тем, что декодируют числа из бинарного представления в унарное. Типичным представителем демультиплексоров является 74HC138.
Вот иллюстрация из его даташита [PDF]:
Назначение пинов:
Пример кода:
const uint8_t hc138_a = 5;/* … */
uint8_t hc138_out = 0;
void setup()
{
/* … */
pinMode(hc138_a, OUTPUT);
pinMode(hc138_b, OUTPUT);
pinMode(hc138_c, OUTPUT);
pinMode(hc138_enable, OUTPUT);
/* … */
}
/* … */
void loop()
{
/* … */
digitalWrite(hc138_enable, LOW);
digitalWrite(hc138_a, hc138_out & (1 << 0));
digitalWrite(hc138_b, hc138_out & (1 << 1));
digitalWrite(hc138_c, hc138_out & (1 << 2));
digitalWrite(hc138_enable, HIGH);
hc138_out = (hc138_out + 1) & B00000111;
delay(100);
}
74HC138 может быть использован в бегущей строке. При использовании матричной схемы мультиплексирования светодиодов с его помощью можно выбирать строку светодиодной матрицы.
Существует также чип 74HC154. Он аналогичен по функциональности, но более громоздок и является четырехбитным. Его даташит можно полистать здесь [PDF].
Как несложно догадаться, если есть демультиплексоры, значит бывают и мультиплексоры. Они в каком-то смысле аналогичны PISO сдвиговым регистрам, так как позволяют увеличить количество читающих пинов микроконтроллера. В качестве примеров можно привести чипы 74HC151 и 74HC153. Их даташиты доступны, соответственно, здесь [PDF] и здесь [PDF].
Fun fact! При помощи мультиплексора можно реализовать произвольную логическую функцию, подключив его входы напрямую к питанию или земле в соответствии с таблицей истинности и используя управляющие сигналы, как входные данные.
Вы, конечно же, поняли, что приведенные выше отрывки кода являются частью одной программы. Вот ее полный исходный код:
#include <Arduino.h>const uint8_t hc595_data = 6; /* SER */
const uint8_t hc595_latch = 7; /* RCLK */
const uint8_t hc595_clock = 8; /* SRCLK */
const uint8_t hc138_a = 5;
const uint8_t hc138_b = 4;
const uint8_t hc138_c = 3;
const uint8_t hc138_enable = 9;
const uint8_t hc165_data = A5; /* QH */
const uint8_t hc165_latch = A4; /* SH */
const uint8_t hc165_clock = A3; /* CLK */
uint8_t hc595_out = 0;
uint8_t hc138_out = 0;
void setup()
{
pinMode(hc595_data, OUTPUT);
pinMode(hc595_latch, OUTPUT);
pinMode(hc595_clock, OUTPUT);
pinMode(hc138_a, OUTPUT);
pinMode(hc138_b, OUTPUT);
pinMode(hc138_c, OUTPUT);
pinMode(hc138_enable, OUTPUT);
pinMode(hc165_data, INPUT);
pinMode(hc165_clock, OUTPUT);
pinMode(hc165_latch, OUTPUT);
}
uint8_t shiftIn165(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder)
{
uint8_t value = 0;
uint8_t i;
for (i = 0; i < 8; ++i)
{
digitalWrite(clockPin, LOW);
if (bitOrder == LSBFIRST)
value |= digitalRead(dataPin) << i;
else
value |= digitalRead(dataPin) << (7 — i);
digitalWrite(clockPin, HIGH);
}
return value;
}
void loop()
{
digitalWrite(hc165_latch, LOW);
delayMicroseconds(5);
digitalWrite(hc165_latch, HIGH);
delayMicroseconds(5);
hc595_out = shiftIn165(hc165_data, hc165_clock, MSBFIRST);
digitalWrite(hc595_latch, LOW);
shiftOut(hc595_data, hc595_clock, MSBFIRST, hc595_out);
digitalWrite(hc595_latch, HIGH);
digitalWrite(hc138_enable, LOW);
digitalWrite(hc138_a, hc138_out & (1 << 0));
digitalWrite(hc138_b, hc138_out & (1 << 1));
digitalWrite(hc138_c, hc138_out & (1 << 2));
digitalWrite(hc138_enable, HIGH);
hc138_out = (hc138_out + 1) & B00000111;
delay(100);
}
Фотография соответствующего прототипа на макетной плате:
Используемые чипы слева направо — микроконтроллер ATmega328P, SIPO сдвиговый регистр 74HC595, демультиплексор 74HC138, PISO сдвиговый регистр 74HC165. Состояние восьми кнопок считывается через 74HC165. Светодиоды слева, соответствующие нажатым кнопкам, не горят, а отпущенным — горят. Состояние этих светодиодов контролируется через 74HC595. На фото я зажал три правые кнопки карандашом и потому три соответствующих им светодиода не горят. Еще восемь светодиодов справа контролируются демультиплексором 74HC138. Их состояние зависит только от времени, по очереди гаснет один светодиод.
Примечание: Вас могут заинтересовать статьи Как собрать Arduino прямо на макетной плате и Собираем USB-программатор для AVR из ATmega328P и FT232.
Еще из интересных чипов стоит упомянуть шинный формирователь 74HC244. Это штука, которая может как бы отрезать одну часть цепи от другой. Если добавить в цепь 74HC04 (логическое НЕ), то при помощи 74HC244 можно будет использовать одни и те же пины для работы с SIPO и PISO сдвиговыми регистрами, плюс один пин для переключения между ними. Итого, если микроконтроллер имеет четыре пина, он может работать с любым количеством кнопок и светодиодов. У самого маленького известного мне микроконтроллера ATtiny13 целых пять свободных пинов, что позволяет обойтись и без 74HC04. Подробности о 74HC244 ищите в даташите [PDF], там все очень просто.
Также заслуживает внимания чип 74HC4051. Эта штука позволяет соединить аналоговый канал с любым из 8 других аналогвых каналов, или разъединить их все. Мне нравится думать о 74HC4051, как о переключателе, управляемом программного. Подробности — в даташите [PDF].
В контексте увеличения числа пинов микроконтроллера стоит также упомянуть чипы MCP23017 / MCP23S17 [PDF] и специализированные чипы для управления светодиодными матрицами вроде MAX7221 [PDF]. Интересны они тем, что предлагая функциональность, аналогичную функциональности сдвиговых регистров и декодеров, могут занимать меньше места на плате. Если же вы хотите увеличить числ ШИМ-пинов, обратите внимание на микросхему TLC5940 (видеообзор, библиотека). Однако обсуждение данных микросхем уже сильно выходит за рамки данного поста. Вы без труда сможете изучить их самостоятельно в качестве домашнего задания.
Итак, теперь вы знаете все необходимое, чтобы делать при помощи светодиодов потрясающие вещи, вроде таких или даже таких. Полную версию исходников к посту вы найдете в этом репозитории на GitHub. Как обычно, буду весьма рад вашим вопросам и дополнениям.
Дополнение: Вас также могут заинтересовать посты Знакомство с компараторами на примере чипа LM339 и Изучаем работу операционного усилителя на примере NE5532.
Метки: Электроника.
DFRobot 100% подлинный модуль Shiftout для Arduino, 5 В 74HC595 с интерфейсом IDC6 совместим с 51 AVR PIC и другим микроконтроллером
Введение
Фото
Приложений
Параметры
Документы
Отгрузочная ведомость
Микроконтроллеры avr: 74hc595 (сдвиговый регистр) через.
Подключение семисегментных индикаторов по трём проводам.Сдвиговый регистр 74hc595 и семисегментный индикатор.
Знакомство с микросхемой регистра сдвига 74hc595.
Множим выходы с помощью 74hc595. Сдвиговый регистр.Железное небо скачать центр Lp скачать lost on you Скачать джейлбрейк 9.3.2 Шансон скачать альбомом Скачать запись советы партыИногда возникает необходимость увеличить количество выходов микроконтроллера. Такая ситуация может возникнуть например при работе с микроконтроллерами серии tiny, например у attiny13 всего 8 ножек и в качестве выходов работают 5(6 если RESET с помощью фьюзов сделать входом/выходом ), и подключить к нему семисигментый индикатор не получится. Так вот используя одну дополнительную микросхему можно решить эту проблему и эта микросхема 74HC595.
74HC595 — это восьмиразрядный сдвиговый регистр с последовательным вводом и параллельным выводом информации.
Назначение выводов:
1-7, 15 — выходы
10 — сброс регистра
11 — вход для тактовых импульсов
12 — вход «защёлкивающий» данные
13 — вход, переводящий выходы рабочее состояние
14 — вход данных
Теперь коротенько, как это работает:
наши данные подаются на вход DS одновременно с тактовыми импульсами на вход SH_CP, с каждым новым импульсом мы записываем в регистр 1 бит, сдвигая все записанные ранее. Передав 8 бит регистру, выставляем логическую 1 на вход ST_CP, и содержимое регистра выводится на выходы Qa-Qh. Все очень просто. Ну а теперь перейдем к практике:
подключение семисигментного индикатора к attiny13 cс помощью HC595
На схеме:
семисигментный индикатор, который подключен к выходам сдвигового регистра. Входы DS, SH_CP, ST_CP подключены к PB0-2. Получается что используя сдвиговый регистр, для подключения семисигментного индикатора нужно уже не 8 а всего 3 выхода микроконтроллера, что очень удобно.
Ниже приведен код программы, которая выводит на семисигментный индикатор цифру 5:
#include ‹tiny13.h›
#include ‹delay.h›
#define CE PORTB.2
#define CL PORTB.1
#define DI PORTB.0
#define RS PORTB.3
#define pause delay_ms(10)
char data[8]={0,1,1,0,1,1,0,1};
int i;
void main(void)
{
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB=0x00;
DDRB=0xFF;
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK0=0x00;
ACSR=0x80;
ADCSRB=0x00;
while (1)
{
i=0;
while(i<8){
DI=data[i];
CL = 1;
RS=1;
pause;
DI=0;
CL = 0;
RS=0;
pause;
i++;
};
CE=1;
};
}
Обычно сдвиговый регистр, в конце концов, позволит вам расширить цифровые выходы вашего микроконтроллера.Каждый из этих 74HC595 может работать как еще 8 цифровых выходов, и вы можете подключить их последовательно. Таким образом, вы можете подключить 8 из них рядом друг с другом и контролировать 64 выхода.
Но то, как это работает, сначала немного сбивает с толку, и они достаточно полезны, чтобы действительно понять, что, черт возьми, происходит под капотом.
Вы можете представить сдвиговый регистр в виде ряда стульев. В данном конкретном случае с 74HC595 у нас есть ряд из 8 стульев. Каждый стул либо пуст (0), либо на нем кто-то сидит (1).Так вот, каждые 10 секунд кто-нибудь звонит в колокольчик, и каждый должен встать и передвинуть один стул вправо. Если кто-то сидел в этом крайнем правом кресле, ну, они просто уходят. На этом крайнем левом стуле вы можете либо попросить кого-нибудь сесть на него, либо просто оставьте его пустым.
Теперь вернем эту идею к 74HC595: этот регистр сдвига состоит из 8 выходных контактов, которые являются либо высокими (1), либо низкими (0). Когда вы поднимаете штырь SRCLK (Serial Clock) высоко (аналогично звонку в звонок), каждый штифт перемещается на один вправо.Последний вывод выпадает, и состояние нового вывода определяется выводом SER (последовательный), и вы можете установить для него значение 1 (HIGH) или 0 (LOW).
Как это позволяет мне снова управлять светодиодами? Допустим, у вас есть 8 светодиодов, подключенных к выходам регистров сдвига, и мы хотим включить 1-й, 3-й и 8-й светодиод. Итак … что мы можем сделать, так это очистить регистр, чтобы все светодиоды погасли. Затем мы вставляем одну высоту, перемещаем ее вправо на 4 точки, добавляем одну высоту, перемещаем ее на 1, затем добавляем еще одну высоту. Посмотрите на изображение справа, оно будет более понятным.
Самое замечательное в том, что у сдвигового регистра есть этот вывод, который называется RCLK или синхронизация регистра. Вы можете удерживать этот контакт в НИЗКОМ состоянии, пока вы все настроите, и ничего на контактах дисплея не изменится. Затем, когда вы закончите и все будет так, как вы хотите, вы потянете RCLK HIGH, и 74HC595 отобразит новые настройки. Таким образом, хотя мы меняем значения в регистре за 8 шагов, похоже, что это был всего один шаг.
Начнем с простого.На самом деле для этой работы вам нужно всего 3 соединения, помимо питания. Но как только питание и светодиоды все подключены, это начинает выглядеть пугающе. Но это не так, так что оставайтесь с нами. — Вы можете увидеть спецификацию 74HC595 здесь.
Каждый раз, когда сигнал на выводе SERCLK становится высоким, все значения сдвигаются вправо, и новое значение сдвигается (независимо от того, какой SER установлен на). После того, как вы переместили новое значение, чтобы увидеть внесенные изменения, вы также должны установить контакт RCLK в HIGH, чтобы обновить выходные контакты новыми данными. Мы хотели, чтобы ваш компьютер работал как можно быстрее, поэтому мы собрали код для микроконтроллеров Arduino и AVR: примеры кода см. Ниже.
Пример Arduino позволяет индивидуально управлять контактами регистра. Однако пример AVR в настоящее время не использует двоичную последовательность и должен быть загружен. Если вы заинтересованы в том, чтобы помочь перекодировать код Arduino в AVR (или любой другой язык), чтобы он поддерживал индивидуальное управление контактами, сообщите нам об этом.
setRegisterPin (2, ВЫСОКИЙ); setRegisterPin (3, ВЫСОКИЙ); setRegisterPin (4, НИЗКИЙ); setRegisterPin (5, ВЫСОКИЙ); setRegisterPin (7, ВЫСОКИЙ); // После того, как вы установили желаемые изменения в // регистрируем контакты, вам нужно будет вызвать writeRegisters // перед отображением.Только делай это в конце, // а не после каждого вызова setRegisterPin, потому что это // функции требуется некоторое время, чтобы записать значения. // writeRegisters занимает около 1 мс на 10 из // регистры сдвига, которые вы связали (80 контактов) writeRegisters ();
Как я сказал выше, вы можете соединить 20 из них вместе, если вам нужно. В регистры сдвига встроена довольно умная опция, которая позволяет объединять их в цепочку или каскадно.Вы знаете, как последний регистр просто сбрасывает свое значение при смещении? Вывод Qh (вывод 9) — это то место, где 74HC595 сбрасывает это значение. Поэтому мы просто берем его и используем как вход SER во втором (или следующем) регистре сдвига, и бац! они связаны вместе. Вам также нужно будет затем соединить контакты SERCLK и RCLK вместе, но тогда вы будете золотыми. Посмотрите схемы сбоку и ниже, чтобы увидеть, как это связано.
интервал SER_Pin = 8; // вывод 14 на 75HC595 интервал RCLK_Pin = 9; // вывод 12 на 75HC595 интервал SRCLK_Pin = 10; // вывод 11 на 75HC595 // Сколько регистров сдвига - меняем это #define number_of_74hc595s 1 // не трогать #define numOfRegisterPins number_of_74hc595s * 8 логические регистры [numOfRegisterPins]; void setup () { pinMode (SER_Pin, ВЫХОД); pinMode (RCLK_Pin, ВЫХОД); pinMode (SRCLK_Pin, ВЫХОД); // сбрасываем все выводы регистра clearRegisters (); writeRegisters (); } // устанавливаем все выводы регистра в LOW void clearRegisters () { for (int i = numOfRegisterPins - 1; i> = 0; i -) { регистры [i] = LOW; } } // Устанавливаем и отображаем регистры // Вызов только ПОСЛЕ того, как все значения будут установлены так, как вы хотите (в противном случае медленно) void writeRegisters () { digitalWrite (RCLK_Pin, LOW); for (int i = numOfRegisterPins - 1; i> = 0; i -) { digitalWrite (SRCLK_Pin, LOW); int val = регистры [я]; digitalWrite (SER_Pin, val); digitalWrite (SRCLK_Pin, HIGH); } digitalWrite (RCLK_Pin, HIGH); } // установить отдельный вывод HIGH или LOW void setRegisterPin (int index, int value) { регистры [индекс] = значение; } void loop () { setRegisterPin (2, ВЫСОКИЙ); setRegisterPin (3, ВЫСОКИЙ); setRegisterPin (4, НИЗКИЙ); setRegisterPin (5, ВЫСОКИЙ); setRegisterPin (7, ВЫСОКИЙ); writeRegisters (); // ДОЛЖЕН БЫТЬ ВЫЗВАН ДЛЯ ОТОБРАЖЕНИЯ ИЗМЕНЕНИЙ // Вызывается только один раз после того, как значения установлены так, как вам нужно.}
Этот пример кода просто включает светодиоды по определенной схеме и сохраняет ее здесь. (Этот код поддерживает только до 4 регистров сдвига. Поскольку он принимает двоичное число, он ограничен 32 символами.)
Вот код для AVR
#include#include #define number_of_74hc595s 1 // Сколько регистров сдвига связано цепочкой? int main () { DDRB = 0xFF; PORTB = 0x00; счетчик символов = 0; в то время как (1) { счетчик ++; // Счетчик, используемый для отображения числа в двоичном формате через регистр сдвига сдвиг (PB1, PB2, PB3, счетчик); // PB1 = SERCLK PB2 = RCLK PB3 = SER _delay_ms (500); сдвиг (PB1, PB2, PB3, 0x00); // Отключить все контакты _delay_ms (500); } возврат 0; } void shift (int SRCLK_Pin, int RCLK_Pin, int SER_Pin, беззнаковые длинные данные) { ПОРТБ & = ~ (1 RCLK_Pin); // Устанавливаем вывод регистрового сигнала в низкий уровень for (int i = 0; i (8 * number_of_74hc595s); i ++) {// Теперь мы входим в цикл для сдвига 8+ бит ПОРТБ & = ~ (1 SRCLK_Pin); // Устанавливаем вывод последовательного тактового сигнала на низкий уровень ПОРТБ | = (((данные & (0x01i)) >> i) SER_Pin); // Просматриваем каждый бит данных и выводим его PORTB | = (1 SRCLK_Pin); // Устанавливаем высокий вывод последовательного тактового сигнала ПОРТБ & = ~ (((данные & (0x01i)) >> i) SER_Pin); // Снова устанавливаем низкий уровень данных } PORTB | = (1 RCLK_Pin); // Установите высокий уровень на выводе регистра-такта, чтобы обновить вывод сдвигового регистра }
Если вам нужен простой способ расширения выходных контактов, сдвиговые регистры определенно являются хорошим выбором.Они дешевы, быстры, и если вы потратите время на то, чтобы поиграть с ними, они тоже довольно простые.
Прошивка и схема синтезатора импульсных волн на базе ATmega48.
Тип
Имя
Последнее сообщение фиксации
Время фиксации
1-битный синтезатор AVR Мэтт Сарнофф (msarnoff.org/1bitsynth) Октябрь 2009 г. - октябрь 2010 г. ======================================== Это интересный маленький синтезатор / генератор шума, который делает Atari-подобным звуки.Все звуки генерируются непосредственно микроконтроллером ATmega48, и имеют только 1 бит амплитуды; другими словами, пульсовые волны и ничего больше. Для получения дополнительной информации, фотографий и видео см. http://www.msarnoff.org/1bitsynth или же http://www.youtube.com/user/74hc595 Компиляция --------- Makefile для avr-gcc включен. Просто введите "сделать шестнадцатеричный" и подключите свой Подключите ISP к ATmega48 и введите «сделать предохранитель» и «сделать вспышку». Взлом ------- Код в исходном состоянии составляет около 3 КБ, оставляя место для дополнений.Кроме того, все должно работать нормально на ATmega168 или ATmega328P, если вы нужно больше места. Таблица нот MIDI специально рассчитана для тактовой частоты 12 МГц. Если вы замените кристалл, вам придется пересчитать эту таблицу. Схема поддерживает 9 аналоговых входов, но используются только 7. Не стесняйтесь делать все, что вам нравится с двумя другими (пока сигнал находится между 0 и 5 вольт). Вы могли заметить, что файл "tiasnd.c" вообще не используется. Этот файл содержит реализацию реальных сигналов, используемых Микросхема TIA в Atari 2600.(в основном, 9-битный линейный регистр сдвига, подключенный интересными способами.) Я решил не использовать его, так как хотел, чтобы этот синтезатор издавать собственные звуки, а не имитировать звуки какой-либо другой микросхемы, но это не должно быть слишком сложно подключить его обратно, если хотите. Алгоритмы адаптированы из исходного кода эмулятора Stella. (http://stella.sourceforge.net)
Прошивка и схема синтезатора импульсных волн на базе ATmega48.
(г.к.а. «Настисинт», «Сарнов-I»)
Это странный на вид синтезатор / нойзбокс, который я сделал за пару дней. Это чрезвычайно простая схема; ATmega48 напрямую генерирует стереозвук без ЦАП или каких-либо внешних схем. Однако, поскольку выводы AVR являются цифровыми (5 В или 0 В), результирующие звуковые сигналы имеют разрешение только 1 бит по амплитуде. Другими словами, это пульсовые волны и ничего больше.
Это тот же метод, который используется микросхемой TIA в Atari 2600.Таким образом, синтезатор издает очень ностальгические звуки в стиле Atari. Его набор функций довольно минимален:
Элементы управления состоят из восьми ручек.В более старой версии было шесть ручек и два кнопочных переключателя BCD. Вот что они контролируют:
Синтезатор можно подключить к MIDI-клавиатуре, ПК или другому устройству и играть напрямую. Поддержка MIDI является базовой; интерпретируются только сообщения включения и выключения нот, и они монофонические.
На ATmega48 много неиспользуемых контактов, так что не стесняйтесь добавлять больше кнопок, переключателей, светодиодов, чего угодно.Также есть два неиспользуемых аналоговых канала, которые вы можете подключить к дополнительным потенциометрам, фотоэлементам, всему, что выводит сигнал 0-5 В.
Прошивка написана на C (с использованием avr-gcc и avr-libc) и весит менее 3k. Чтобы загрузить новую прошивку, вам понадобится программист ISP. (Если кто-то захочет сделать плату совместимой с Arduino, это, вероятно, будет не так уж сложно.)
Код находится на GitHub и выпущен под лицензией msarnoff.org. Не стесняйтесь разветвлять его и добавлять новые вещи!
Кроме того, я добавил файл под названием tiasnd.c, который содержит реализацию реальных сигналов от чипа Atari 2600 TIA. Я взял алгоритмы из исходного кода Эмулятор Stella.
TIA использует 9-битный регистр сдвига с линейной обратной связью, подключенный интересным образом. По умолчанию этот код не используется (я бы предпочел, чтобы эта вещь сама по себе звучит вместо того, чтобы имитировать другое устройство), но подключить его не составит труда.
Скачать схему gEDA: https: // github.com / 74hc595 / 1-Bit-AVR-Synthesizer / raw / master / circuit / synth.sch
Могут потребоваться пользовательские символы из моего каталога символов.
Ищу какие-то мысли, может быть, какие-то расчеты по пропускной способности рассматриваемого мной варианта.
По сути, я хочу передать поток данных — небольшие кадры — в основном с довольно широким регистром сдвига. Кадр будет выглядеть так, передаваемый один бит за другим: 4 байта: слово синхронизации 4 байта: ID 1 байт: батарея 1 байт: последовательность # (1-255) 1 байт: CRC8-1 (синхронизация + идентификатор + батарея + последовательность) 1 байт: CRC8-2 (ID + батарея + последовательность)
Выдача 12-байтового кадра в манчестерском коде.
Вот таблица дат 74HC595: http://www.componentschip.com/details/Texas-Instruments/74HC595D.html
Это будет просто передано по конвейеру таким образом, чтобы вы могли заполнить 12-байтовый буфер на приемнике, и когда ваши первые 4 байта совпадают с определенным значением, вы знаете, что у вас есть полный кадр в буфере, и вы можете его обработать. b0-32 может быть чем-то вроде AACC3355.
Это сложно из-за того, что нужно выполнять CRC8 для данных по мере их поступления. Если бы мы использовали регистры сдвига, я полагаю, было бы достаточно легко не только подключить старший бит (назовем его b95) к антенне, но также подключить все выходы к тому, что управляет вычислением CRC8.
С другой стороны, написать код для этого, вместо того, чтобы иметь совершенную схему с 12 74HC595, подключенными друг к другу, или каким-либо другим подобным компонентом, который поддерживает очень широкий регистр сдвига, может быть намного проще с использованием AVR. Однако меня беспокоит, сможет ли такое устройство, как ATTiny85, не отставать на стороне передачи (на стороне приема это не проблема, я могу разгрузить обработку.
Выполняя RF таким образом, основная другая проблема, о которой мне нужно просто позаботиться, — это обеспечить синхронизацию передатчика с приемником — что я могу сделать через активное поле — это же поле можно использовать для активации передатчика, превращая его в транспондер.Позже, если я смогу запустить прототип этой антенны, я буду искать деньги, чтобы кто-нибудь изобрел быструю и очень маленькую прототипную антенну направления.
Так или иначе, после размышлений по этому поводу. Будет ли микросхема AVR достаточно быстрой, чтобы справиться с этим?
Последовательная связьРис. 10. SPCR
Разрешение прерывания SPI
Этот бит вызывает выполнение прерывания SPI, если установлен бит SPIF в регистре SPSR и если установлен бит разрешения глобального прерывания в SREG.В нашем примере дизайна мы будем опрашивать бит SPIF. Следовательно, мы оставим бит SPIE в состоянии по умолчанию (SPIE = 0).
Включение SPI
Когда бит SPE равен единице, SPI включен. Этот бит должен быть установлен, чтобы разрешить любые операции SPI.
Заказ данных
Когда бит DORD равен единице (DORD = 1), первым передается младший бит слова данных, в противном случае первым передается старший бит слова данных. Для Arduino Proto-shield мы хотим сначала передать бит старшего разряда (MSB).Следовательно, мы оставим бит DORD в состоянии по умолчанию (DORD = 0).
MSTR: выбор ведущего / ведомого
Этот бит выбирает режим Master SPI, если установлен в единицу, и режим Slave SPI, если он сброшен. В нашем примере проектирования ATmega32U4 является ведущим, а «8-битный регистр сдвига с выходными защелками» 74HC595 — ведомым. Следовательно, нам нужно установить бит DORD в логическую 1 (MSTR = 1). Примечание: Я рассказываю вам только часть истории. Если вы хотите настроить ATmega328 для работы в качестве ведомого или ведущего / ведомого устройства, см. Техническое описание.
Полярность тактового сигнала и фаза тактового сигнала
Биты тактовой полярности (CPOL) и тактовой фазы (CPHA) определяют, как последовательные данные передаются между ведущим и ведомым. Эти форматы передачи данных SPI определены на рисунке 10.
Рисунок 11. Режимы работы SPI
Биты выбора тактовой частоты SPI SPI2X, SPR1, SPR0
Эти три бита управляют скоростью SCK Мастера. В нашем примере проектирования ATmega32U4 является мастером.Эти биты не влияют на ведомое устройство. Соотношение между SCK и тактовой частотой генератора f osc показано в следующей таблице. В нашем примере разработки мы разделим системные часы на 16.
Рисунок 12. SPI Prescaler
ATtiny13 — мой любимый крошечный uC. Поэтому я решил спроектировать и собрать более 100 проектов на основе этого чипа. Почему мне нравится ATtiny13?
Вот руководство по ATtiny13, плата для разработки ATtiny13, небольшие руководства о том, как скомпилировать и записать код в ATtiny13 (ANSI C) и как установить ассемблер AVR (AVRA) в Linux.
[001] ATtiny13 — мигает с функцией задержки.
[002] ATtiny13 — мигает светодиод с функцией задержки (программная ШИМ)
[003] ATtiny13 — случайно мигает светодиод с ГПСЧ на основе LFSR
[004] ATtiny13 — мигает с таймером OVF ( Overflow)
[005] ATtiny13 — мигает со сторожевым таймером
[006] ATtiny13 — мигает с таймером COMPA
[007] ATtiny13 — тон-генератор
[008] ATtiny13 — программный UART (регистратор отладки)
[009] ATtiny13 — псевдослучайный номеров (облегченная библиотека)
[010] ATtiny13 — управление светодиодной RGB-подсветкой (необычные световые эффекты)
[011] ATtiny13 — ИК-пульт для управления светодиодами (протокол NEC)
[012] ATtiny13 — ИК-пульт для управления светодиодной RGB-подсветкой (протокол NEC)
[013] ATtiny13 — ИК-приемник / протоанализатор NEC
[014] ATtiny13 — Лучшая температура в помещении на DS18B20
[015] ATtiny13 — двухтональный сигнал тревоги
[016] ATtiny13 — цифровой вольтметр постоянного тока с MAX7219
[017] ATtiny13 — цифровой Амперметр постоянного тока с MAX7219
[018] ATtiny13 — танцевальные огни с FFT
[019] ATtiny13 — простой таймер на TM1637
[020] ATtiny13 — драйвер ШИМ светодиода питания
[021] ATtiny13 — простой текстовый интерфейс командной строки (интерфейс командной строки) через UART
[022] ATtiny13 — код Морзе (мигающий свет)
[023 ] ATtiny13 — индикатор уровня заряда батареи
[024] ATtiny13 — простой логический датчик
[026] ATtiny13 — дискотека с использованием FFT
[028] ATtiny13 — бегущие цифры на TM1637
[029] ATtiny13 — регистратор температуры с использованием LM35 и программного обеспечения UART
[ 030] ATtiny13 — считывание температуры и влажности из DHT11
[031] ATtiny13 — аппаратный ШИМ
[032] ATtiny13 — отображение точек и цифр на 7-сегментном светодиодном ламповом дисплее
[033] ATtiny13 — Светодиодная лента WS2812 — мигающий
[034] ATtiny13 — радуга на одиночном светодиоде WS2812
[035] ATtiny13 — радуга на нескольких светодиодах WS2812
[036] ATtiny13 — круговой нарезчик светодиодов WS2812
[037] ATtiny13 — PI (импульсная индукция) металлоискатель
[040] ATtiny13 — случайное мерцание пикселей на матричном светодиодном дисплее 8 × 8
[043] ATtiny13 — мигание с функцией задержки (версия на ассемблере)
[044] ATtiny13 — мигание с таймером OVF (версия на ассемблере)
[045] ATtiny13 — мигание с таймером COMPA (версия на ассемблере)
[047] ATtiny13 — управление шаговым двигателем 28BYJ-48
[ 048] ATtiny13 — случайное мигание светодиода с ГПСЧ на основе BBS
[050] ATtiny13 — переключатель хлопка хлопка
[052] ATtiny13 — 8-битный моно усилитель класса D
План реализации ~ 50%.Некоторые проекты находятся в стадии реализации, а некоторые готовы к публикации. Я буду обновлять эту страницу!
У вас есть идея для следующего проекта на ATtiny13? Отправьте тему проекта в комментарии или напишите мне! ([email protected])
Использование режима подключения 1:
Этот подход использует одну линию связи, которая поддерживает объединенные данные и тактовый сигнал между микроконтроллером и ЖК-дисплеем.Этот подход используется, когда ЖК-дисплей подключен через сдвиговый регистр 74HC595, как подробно описано здесь. Этот способ подключения также называется 1-проводным подключением.
Этот подход к решению учитывает оригинальные работы, представленные в журнале Elektor Magazine.
Соответствующие константы:
Специальные константы используются для управления настройками подпрограмм жидкокристаллического дисплея, включенных в Great Cow BASIC.К установить эти константы, основная программа должна указать конкретные константы для поддержки режима соединения с помощью #define.
При использовании режима подключения 1 должны быть установлены только две константы — все остальные являются необязательными или могут быть проигнорированы.
Как подключить и управлять светодиодной подсветкой ЖК-дисплея: см. Подсветка ЖК-дисплея.
Имя константы | Органы управления | Значение по умолчанию |
---|---|---|
| Режим ввода-вывода. | |
| Вывод синхронизации / данных, используемый в 1-битном режиме. | Обязательный |
ЖК-дисплей.h поддерживает в 1-проводном режиме управление контактом 4 74HC595 для фонового светодиода.
Для получения примера кода загрузите One Wire LCD Example.
См. Другие примеры кодов в 0,1- и 2-проводных решениях ЖКД.