ATtiny85 12 led VU Meter
- Войдите на сайт для отправки комментариев
Пнд, 18/02/2013 - 01:56
hi all
Решил оставить это тут, вдруг кому нибудь пригодится (=
const int numLed[12][4] = { {0,1,2,4}, //1 {0,1,4,2}, //2 {0,2,4,1}, //3 {1,0,2,4}, //4 {1,0,4,2}, //5 {1,2,4,0}, //6 {2,1,0,4}, //7 {2,0,4,1}, //8 {2,4,1,0}, //9 {4,0,1,2}, //10 {4,0,2,1}, //11 {4,2,1,0}, //12 }; int g = 11; int h = 0; int k = 0; void setup() { pinMode(0, OUTPUT); pinMode(1, OUTPUT); pinMode(2, OUTPUT); pinMode(3, INPUT); pinMode(4, OUTPUT); } void ledLatency (int f){ // для задержки отображения пика if(g<f && f<=12){ g=f; onLedOne(g-1); }else if(h<100 && g>0){ onLedOne(g-1); h++; }else if(g>0){ g--; onLedOne(g-1); h=0; }else{ h=0; } } void ledon (int a, int b, int c, int d){ //зажигает определённый светодиод pinMode(a, OUTPUT); digitalWrite(a, HIGH); pinMode(b, INPUT); pinMode(c, INPUT); pinMode(d, OUTPUT); digitalWrite(d, LOW); delayMicroseconds(1); for(int i=0; i<5; i++)//очищаем входы pinMode(i, INPUT); } void onLedOne (int i){ //зажигает только один выбранный светодиод int a = numLed[i][0]; int b = numLed[i][1]; int c = numLed[i][2]; int d = numLed[i][3]; ledon (a, b, c, d); } void onLed (int f){ //исходя из полученного уровня зажигает свотодиоды for (int j=0; j<f; j++) onLedOne(j); ledLatency(f); } void loop() { int val = 0; for(int i=0; i<20; i++) val = val+analogRead(3); if(val<20 && val>0) val = 20; if(val<40 && val>20) val =40; if(val<80 && val>40) val = 340; val = val/20; //onLed (map(val, 0, 1023, 0, 12)); //delayMicroseconds(1); if(val==0){ if(k>3000){ onLedOne(11); for(int i=0; i<1000; i++){ pinMode(3, OUTPUT); digitalWrite(3, HIGH); //delayMicroseconds(1); digitalWrite(3, LOW); } delayMicroseconds(300); } k++; for (int i=0; i<=4; i++) pinMode (i, INPUT); ledLatency(0); delayMicroseconds(10); }else if( val<2){ onLed (map(val, 0, 1, 0, 1)); k=0; }else if(val<70){ onLed (map(val, 2, 69, 2, 6)); k=0; }else if(val<141){ onLed (map(val, 70, 140, 6, 9)); k=0; }else if(val<191){ onLed (map(val, 141, 190, 9, 10)); k=0; }else if(val<251){ onLed (map(val, 191, 250, 10, 12)); }else{ for (int i=0; i<=11; i++){ onLedOne(11-i); g=12; delay(1); if(k>100){ for(int i=0; i<100; i++){ pinMode(3, OUTPUT); digitalWrite(3, HIGH); //delayMicroseconds(1); digitalWrite(3, LOW); } } } k++; } }
http://hlt.media.mit.edu/?p=1229
Вот видео то что получилось: http://www.youtube.com/watch?v=qj3i9LEJvYg
Светодиоды подключал по такой схеме:
А если использовать семисегментник типо такого:
Такой метод ведь подойдёт для него правда? Только подозреваю нужны резисторы будут.
Такой метод ведь подойдёт для него правда?
...таким методом подключения семисегментника к Arduino, для экономии ног :)
Судя по колическтву ног на этом сигментном индикаторе, там и так уже разведено примерно как у меня на картинке, только больше ног используется, например если задействовать 4 ноги то можно задействовать 12 светодиодов, 5 ног 20 светодиодов, 6 - 30, 7 - 42, 8 - 56, 9 - 72, 10 -90, 11 - 110, 12 - 132, 13- 156... и т.д. (=
Угу... я уже это понял :)
Жаль на ATtiny13 невлезает :( 1 932 байт
Если оптимизировать код и отказаться от дуино-функций, то скорее всего влезет.
Воспользовался Вашим примером в моей теме "Размер скетча в двоичном коде: 882 байт (из 1 024 байт максимум)" Вроде так должно работать
После прочтения маленькой статейки я решил пойти дальше, тоесть укоротил до 716 байт:
Компилируется без проблем оба, но работоспособность второго не гарантирую.
Завтра в протэусе смоделирую и проверю
Работает первый вариант:
Второй только D6, D9, D12 завсечивает и всё...
Внимание на количество предупреждений :)
Не заработает, хотябы потому что вы потеряли в функции
int
ADC_READ()
последнюю строку и функция у вас ничего не возвращаетРазмер скетча в двоичном коде: 1 742 байт (из 1 024 байт максимум)
:(
Пробовал отсекать куски кода и смотрел что жрёт больше памяти, и когда дошёл до map-ов(от строки 114) тогда уже перевал...
Методом научного... ну поняли, получилось вот такое:
Вроде что-то светится но протэус выдаёт много ошибок...
http://www.youtube.com/watch?v=dRhFk66AbSs&feature=youtu.be
upd изменил тип даних
Можно так зарезать код, будет без красивостей излишних(void ledLatency), но зато меньше весить, 1 240 байт. Также убрано всё что касается переменной k, оно без надобности. Эта переменная нужна для того чтоб при пропадании звука подавать сигналы, на вход повесить пищалку и она будет пищать. В общем как то так:
Спасибо, но не светятся вообще, что то я напартачил...
Вот бы не эти map-ы было бы всё прекрасно, много памяти они занимают, а то как я реализовал скорей всего неправильно...
Да и char и unsigned int брать как тип данных не было ошибкой?
Вот набросал:
В протэусе и с 85 тинькой всё работает, а с 13-й нет, тупо ничего не происходит.
ЗЫ если pinMode(i, INPUT); сменить на DDRB |= (0<<i); то при низком уровне вместо того чтобы светился 1 диод светятся все три(6,9,12)
pinMode(i, INPUT); нельзя заменить на DDRB |= (0<<i);,
"После прочтения маленькой статейки..." DDRB &= ~(1<<i);
Итак, пробовал зашивать в ATtiny13 код из первого сообщения, но немного урезан:
На arduino всё работает, без проблем, но на ATtiny13 точно такой же код напрочь не хочет работать:
http://www.youtube.com/watch?v=Uw00Od_fTvk
Что же может быть не так? Может чего-то не хватает?
...может какого-то кеша или ещё чего-то...
...может какого-то кеша или ещё чего-то...
попробуй #define F_CPU 8000000UL // 8 MHz
пробовал, и пробовал стереть даже эту строчку - нифига
пробовал, и пробовал стереть даже эту строчку - нифига
тогда не знаю
странно оно, компилится но неправильно работает.
Да ничего строанного.
HWman, вы же уже вроде освоили работу с регистрами, так зачем пользуете дуинофункции?
Перепробовал всё что в этой теме есть, ничего не пашет, может мощи не хватает тиньке?
Что есть у 85-й чего нет у 13-?
На UNO всё работало нормально, залил код на тини13 и... видео выше выкладывал...
Могу кинуть сюда файлы протеуса и посмотрете.
Думаю вся проблема в digitalWrite().
Вот digitalWrite() для тини х5 как выглядит:
А вот так для тини 13:
Если эту функцию поправить должным образом то думаю данный код и на тини 13 заработает если кое что урезать.
ТС, а на какой частоте работала тинька? 9.6?
Код который влезает в Attiny13:
схему подключения можно увидеть?
схему подключения можно увидеть?
Схема в #9 комментарии. Диоды к 0,1,2,4 выходам, потенциометр или выход звука от какого нибудь источника, к 3му аналоговому входу.
код для Attiny13 какой рабочий? в #27 коментарии будет работать?
да, этот код я проверял на железке, всё работало от потенциометра, от аудио выхода не проверял.