Ну вот и приближается проверка в железе драйвера фонарика
Код конечно же непокажете?
Почему не покажу. я не скрываю свои коды если не заметили.но еще рано. надо допилить. как все будет нормально работать тогда и выложу коды, видео, фото
криво перевожу или криво написано, но сколько входов ATtiny13A могут работать по внешним прерываниям ?
Цитата:
... one 8-bit Timer/Counter with compare modes, Internal and External Interrupts, a 4-channel, 10-bit ADC, a programmable Watchdog Timer with internal Oscillator, and three ...
судя по схеме внешние прерывания доступны на всех ногах кроме земли и питания, те их больше, чем у Atmega256 ...
PCINTx-прерывания обслуживают сразу целый порт, поэтому в обработчике необходимо смотреть на записанное и текущее состояние выводов и выискивать, какой же из пинов изменил свое состояние (и в какую сторону). Ну а потом уже решать, реагировать ли на это изменение или проигнорировать.
Вот, например, у ATMega328 есть три соответствующих вектора обработки прерываний PCINT: 4-й (PCINT0_vect), 5-й (PCINT0_vec1) и 6-й (PCINT2_vect). 4-й вектор обслуживает ноги PCINT7...0 (порт B), 5-й - PCINT8...14 (порт C - в нем только 7 выводов), 6-й - PCINT16...23 (порт D).
INTx слушает один-единственный вывод и может настраиваться на тип происходящего на нем изменения уровня. Стало быть, более оперативно реагирует на дергание соответствующей ножки.
Вот код. На самом деле нижнюю температуру можно чуток приподнять. В качестве темодатчиков использовал термисторы, мне понравилось, очень широки диапазон дают на АЦП, и дешевые!
void setup()
{
PORTB=0x00; //записать в весь порт В 0
DDRB=0x01; //настроить порт В 0x01: по другому 000001 (1 означает выход, 0 вход)
//Настройка аппаратного ШИМ
TCCR0A=0x83; //настраиваем аппартанный шим на PB0 с частотой 37,5кГц(аппаратный шим только на PB0 и PB1)
TCCR0B=0x83; //на PB1 (второй шим) ничего делать не надо
OCR0A=0x00;
}
void loop()
{
{
int valo = analogRead(A3); //Читаем термистор
valo = map(valo,400,750,40,255); // масштабируем аналог в шим
analogWrite(1,valo); //выводим шим на вентелятор
valo = analogRead(A3); // это выражение может показаться лишним, но без него программа не работает.
if(valo<=400)analogWrite(1,0); //если температура ниже чем 30гр. то шим ноль
if(valo>=750)analogWrite(1,255); //если выше 65 то шим на максимум
}
{
int val = analogRead(A1); //то же самое, только для второго вентелятора.
val = map(val,400,750,40,255);
analogWrite(0,val);
val = analogRead(A1);
if(val<=400)analogWrite(0,0);
if(val>=750)analogWrite(0,255);
}
}
Илья73, напиши нормальный код без PORTB, DDRВ,TCCR0A, TCCR0B и OCR0A, просто напиши как на дуинку, выкинь конденсаторы С3 и С4, чтобы транзисторы работали в ключевом режиме и перекачай ядро потом перед прошивкой тиньки выбери из списка ATtiny13 9.6 MHz BOD 2.7 V и запиши загрузчик потом залей прошивку и скорей всего ты писк уже не услышишь.
Хочу на УАЗик сделать управляемые тинькой дворники с запоминанием. Три режима - медленный, средний и быстрый плюс спецрежим, когда можно задать время между махами и на каком то махе писать писалкой. Главное - это то что время между махами и время между сцыками надо запоминать в епроме. У кого какие идеи будут?
HWman, а на какой частоте это "ядро". Сейчас попробую установить ядро, а тиньку завтра вытащу, она на работе.
Если все получится, будет совсем не плохо иметь такую версию ядра. Можно будет делать выбор если нужен шим неслышный :)
Да он в принципе и не пищит сейчас, вернее пищал только перед самым включеним , вот эти кондеры и гасили этот начальный писк. Сейчас только потрескивает перед запуском один вентелятор уже не помню на каой ноге. В общем вроде и работает, но чувствую что как то не совсем правильно.
Кстати, убил 2 тиньки неверно выставленными фьюзами, что-то мудрил с частотой 128 кГц, будь внимательный.
Перед прошивкой жми записать загрузчик, это выставит нужные фьюзы и рабочая частота тиньки будет 9.6 мГц., если же ничего не хочешь менять то выбирай 0.6 мГц., в таком случае загрузчик шить ненужно.
Кстати, конденсаторы в цепи образуют RC цепочку, тоесть транзистор по идее работает как бы в линейном режиме - дико греется, в ключевом не так.
Вот код. На самом деле нижнюю температуру можно чуток приподнять. В качестве темодатчиков использовал термисторы, мне понравилось, очень широки диапазон дают на АЦП, и дешевые!
void setup()
{
PORTB=0x00; //записать в весь порт В 0
DDRB=0x01; //настроить порт В 0x01: по другому 000001 (1 означает выход, 0 вход)
//Настройка аппаратного ШИМ
TCCR0A=0x83; //настраиваем аппартанный шим на PB0 с частотой 37,5кГц(аппаратный шим только на PB0 и PB1)
TCCR0B=0x83; //на PB1 (второй шим) ничего делать не надо
OCR0A=0x00;
}
void loop()
{
{
int valo = analogRead(A3); //Читаем термистор
valo = map(valo,400,750,40,255); // масштабируем аналог в шим
analogWrite(1,valo); //выводим шим на вентелятор
valo = analogRead(A3); // это выражение может показаться лишним, но без него программа не работает.
if(valo<=400)analogWrite(1,0); //если температура ниже чем 30гр. то шим ноль
if(valo>=750)analogWrite(1,255); //если выше 65 то шим на максимум
}
{
int val = analogRead(A1); //то же самое, только для второго вентелятора.
val = map(val,400,750,40,255);
analogWrite(0,val);
val = analogRead(A1);
if(val<=400)analogWrite(0,0);
if(val>=750)analogWrite(0,255);
}
}
Илья73, напиши нормальный код без PORTB, DDRВ,TCCR0A, TCCR0B и OCR0A, просто напиши как на дуинку, выкинь конденсаторы С3 и С4, чтобы транзисторы работали в ключевом режиме и перекачай ядро потом перед прошивкой тиньки выбери из списка ATtiny13 9.6 MHz BOD 2.7 V и запиши загрузчик потом залей прошивку и скорей всего ты писк уже не услышишь.
видишь даже в ссылке на ядро что ты дал написано 9600000 частота при твоих фьюзах а не 1200000 как у тебя
###############################################################
attiny13.name=ATtiny13 9.6 (internal 9.6 MHz clock) MHz BOD 2.7 V
attiny13.upload.using=arduino:arduinoisp
attiny13.bootloader.low_fuses=0x7A # частота тиньки 9.6 мГц
attiny13.bootloader.high_fuses=0xFB # BOD 2.7 В.
attiny13.upload.maximum_size=1024
attiny13.build.mcu=attiny13
attiny13.build.f_cpu=9600000L
attiny13.build.core=core13
###############################################################
Перезалил ядро, при выборе Attiny13 1 MHz (default) никаких проблем с задержками быть не должно, даже загрузчик шить не обязательно.
Если хочется больше скорости то есть другой режим - ATtiny13 9.6 MHz, BOD 2.7 V с настроенным BODLEVELом на 2.7 В. просто перед прошивкой тинки жмём прошить загрузчик, это выставит нужные фьюзы.
Кстати, я тут делал хоть какую-то регулировку частоты ШИМ, немного переделал функцию из ядра, постарался максимально закоментировать что и как:
Перезалил ядро, при выборе Attiny13 1 MHz (default) никаких проблем с задержками быть не должно, даже загрузчик шить не обязательно.
Если хочется больше скорости то есть другой режим - ATtiny13 9.6 MHz, BOD 2.7 V с настроенным BODLEVELом на 2.7 В. просто перед прошивкой тинки жмём прошить загрузчик, это выставит нужные фьюзы.
Кстати, я тут делал хоть какую-то регулировку частоты ШИМ, немного переделал функцию из ядра, постарался максимально закоментировать что и как:
Вот если кому надо включение освещения по фоторезистору под 13 тиньку.
Код Megakoteyka написал (за что ему огромное спасибо), я толко резисторы прикрутил и чуть по другому гистерезис сделал.Тинька напрямую управляет твердотельным реле ssr25.
#define BUFFER_SIZE 10 // количество показаний датчика для расчета среднего
//#define INTERVAL 100 // интервал опроса датчика
int buffer[BUFFER_SIZE];// буфер с показаниями датчика
long nextTime = 0; // время очередного срабатывания датчика
// пороги гистерезиса
void setup()
{
pinMode(0, OUTPUT);
}
void loop()
{
// получили текущее время
int sensitivity = analogRead(A1);
int INTERVAL = analogRead(A3)*2;
long time = millis();
// если текущее время дошло до времени срабатывания
if(time >= nextTime)
{
// устанавливаем новое время срабатывания
nextTime = time + INTERVAL;
// сдвинули все элементы массива влево,
// при этом потеряли первый элемент
for(int i = 0; i < BUFFER_SIZE - 1; i++)
buffer[i] = buffer[i + 1];
// на место последнего элемента записали показания датчика
buffer[BUFFER_SIZE - 1] = analogRead(A2);
// суммируем показания
int sum = 0;
for(int i = 0; i < BUFFER_SIZE; i++)
sum += buffer[i];
// вычисляем среднее
sum /= BUFFER_SIZE;
if(sum >= sensitivity+20)
{
// выключить свет
digitalWrite(0, LOW);
}
if(sum <= sensitivity-20)
{
// включить свет
digitalWrite(0, HIGH);
}
}
}
Тинька в режиме минимального потребления. Раз в 15 минут должна на вывод (любой) подать меандр с частотой 2 Герца и длительностью 2 секунды.
Задача максимум: Делать то же самое, но при замыкании на ноль одной ноги - выдавать импульсы через 5 минут, другой ноги - через 10 минут, третьей ноги - через 15 минут. Замыкание происходит в отключенном состоянии и невозможно в работе. Т.е. это предустановка.
Понимаю, что для снижения потребления контроллер нужно усыпить и работать из-под вочдога.
Помогите разобраться - никак не пойму с чего копать.
#define ONE_WIRE_BUS 21 // назначаем пин для шины OneWire и датчиков температуры
#define TIME_REFRESH 2000 // Задаем время обновления показаний
#define BUFFER_SIZE 5 // Число итераций для усреднения, чем выше, тем больше инерционность вывода показаний
float tempSensorA; // Переменная температуры с датчика A
float tempABuffer[BUFFER_SIZE]; // Буфер с показаниями датчика A для усреднения
boolean flagAveraging = true; // Указатель - надо ли усреднять выводимые показания
// Подключаем библиотеку Dallas
#include <OneWire.h>
#include <DallasTemperature.h>
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup()
{
Serial.begin(9600);
Serial.println("Setup...");
// Start up the Dallas Temperature library
sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
Serial.print("Now Averaging is ");
flagAveraging?Serial.println("TRUE"):Serial.println("FALSE");
Serial.println("... end");
}
void loop()
{
sensorTempRead(); // Опрос датчиков температуры
delay (TIME_REFRESH);
}
// Опрос датчиков температуры
void sensorTempRead()
{
// Serial.println("Reading sensors...");
sensors.requestTemperatures(); // Send the command to get temperatures
tempSensorA = sensors.getTempCByIndex(1); // Читаем второй датчик и записываем в последний элемент массива
Serial.print("TsensorA Current: ");
Serial.print(tempSensorA);
// *** блок усреднения показаний для устранения скачков
if (flagAveraging)
{
// сдвинули все элементы массива влево, при этом потеряли первый элемент
for(byte i = 0; i < BUFFER_SIZE - 1; i++) tempABuffer[i] = tempABuffer[i + 1];
// на место последнего элемента записали текущие показания датчика
tempABuffer[BUFFER_SIZE - 1] = tempSensorA;
// суммируем показания
static float sumA = 0;
for(byte i = 0; i < BUFFER_SIZE; i++) sumA += tempABuffer[i];
// вычисляем среднее
sumA /= BUFFER_SIZE; // Аналогично выражению sum = sum/BUFFER_SIZE
tempSensorA = sumA; // Перезаписываем текущее показание усредненным значением
Serial.print("\t");
Serial.print("Average: ");
Serial.print(tempSensorA);
}
// *** конец блока усреднения
Serial.println();
}
девайс рулит скоростью движка шимом при помощи двух клавиш, плюс сохраняет текущее значение в еепром при отключении питания.
немогу понять, как пофиксить багу - при старте девайса предидущие значения берутся из еепрома, например 20% шима, и при уменьшении кнопкой до нуля, значения прыгают опять до этой цифры.
#include <EEPROM.h>
byte eep,B1,B2=0;
int pwm=0;
unsigned long time,timeB1,timeB2;
void setup()
{
pinMode(0,OUTPUT);
}
void loop()
{
pwm=min(pwm,255); //ограничиваем диапазон pwm от 0 до 255
pwm=max(pwm,0);
time=millis(); //запускаем таймер и очевидные проверки,
eep=EEPROM.read(0); //проверить, запустилисть мы с нуля или нет
if(millis()-time<50&&pwm==0)
{
if(eep<=180) //если у нас шим был больше 180, то сбрасываем в базовые значения
pwm=eep;
}
B1=digitalRead(3); //кнопки
B2=digitalRead(4);
if(B1==HIGH) //определяем нажатие клавиш, 50мс для антидребезга и +1 для счётчика
{
if (millis()-timeB1>50)
{
timeB1=millis();
pwm++;
}
}
if(B2==HIGH) //определяем нажатие клавиш...
{
if (millis()-timeB2>50)
{
timeB2=millis();
pwm--;
}
}
analogWrite(0, pwm); //пишем значение шим
if (digitalRead(2)==LOW) //определяем есть ли напряжение до стабилизатора.
{ //(на тиньке висит толстый кондёр, если с блока
EEPROM.write(0,pwm); //питания пропадёт напруга - пишем текущее значение в еепром)
delay(500); //ну это буду подбирать в зависимости от толщины кондёра
}
}
ну так то я изначально попробовал, но если лишнее выкинуть и оставить только шим и две кнопки, то при достижения максимума переменная сваливается в ноль.
EEPROM.read похоже возвращает значение именно в byte, если ограничение max сделать равным 1 , то всё работает,но мне нужен 0% шим
ячейка EEPROM имеет размерность byte, т.е. ты пытаешься впихнуть 65535 (int) в 255 (byte) :) При этом вполне возможно, что ячейка или обнуляется, или затрагивает соседние. А в следующей строчке тут же читаеся из EEPROM это непредсказуемое значение.
А по коду у тебя и должно при превышении максимума сваливаться в ноль, потому что никаких ограничений не задано.
#include <EEPROM.h>
byte eep,B1,B2=0;
byte pwm=0;
unsigned long time,timeB1,timeB2;
void setup()
{
pinMode(0,OUTPUT);
}
void loop()
{
time=millis(); //запускаем таймер и очевидные проверки,
eep=EEPROM.read(0); //проверить, запустилисть мы с нуля или нет
if(millis()-time<50 && pwm==0 && eep<=180){
pwm=eep;
}
B1=digitalRead(3); //кнопки
B2=digitalRead(4);
if(B1==HIGH) //определяем нажатие клавиш, 50мс для антидребезга и +1 для счётчика
// ++++ кнопка по моему некорректно в некоторых случаях будет обрабатываться
{
if (millis()-timeB1>50)
{
timeB1=millis();
if (pwm < 255){ //++++ это чтобы не переполнялся PWM и не переходил в ноль после 255
pwm++;
}
}
}
if(B2==HIGH) //определяем нажатие клавиш...
{
if (millis()-timeB2>50)
{
timeB2=millis();
if(pwm>0){
pwm--; //++++ чтобы не было скачка с 0 на 255
}
}
}
analogWrite(0, pwm); //пишем значение шим
if (digitalRead(2)==LOW) //определяем есть ли напряжение до стабилизатора.
{ //(на тиньке висит толстый кондёр, если с блока
EEPROM.write(0,pwm); //питания пропадёт напруга - пишем текущее значение в еепром
delay(500); //ну это буду подбирать в зависимости от толщины кондёра
}
}
#include <EEPROM.h>
byte eep,B1,B2=0;
byte pwm=0;
unsigned long time,timeB1,timeB2;
void setup()
{
pinMode(0,OUTPUT);
}
void loop()
{
time=millis(); //запускаем таймер и очевидные проверки,
eep=EEPROM.read(0); //проверить, запустилисть мы с нуля или нет
if(millis()-time<50 && pwm==0 && eep<=180){
pwm=eep;
}
B1=digitalRead(3); //кнопки
B2=digitalRead(4);
if(B1==HIGH) //определяем нажатие клавиш, 50мс для антидребезга и +1 для счётчика
// ++++ кнопка по моему некорректно в некоторых случаях будет обрабатываться
{
if (millis()-timeB1>50)
{
timeB1=millis();
if (pwm < 255){ //++++ это чтобы не переполнялся PWM и не переходил в ноль после 255
pwm++;
}
}
}
if(B2==HIGH) //определяем нажатие клавиш...
{
if (millis()-timeB2>50)
{
timeB2=millis();
if(pwm>0){
pwm--; //++++ чтобы не было скачка с 0 на 255
}
}
}
analogWrite(0, pwm); //пишем значение шим
if (digitalRead(2)==LOW) //определяем есть ли напряжение до стабилизатора.
{ //(на тиньке висит толстый кондёр, если с блока
EEPROM.write(0,pwm); //питания пропадёт напруга - пишем текущее значение в еепром
delay(500); //ну это буду подбирать в зависимости от толщины кондёра
}
}
блин, теория и практика - разные вещи, я так уже пробовал, сейчас попробовал ещё раз, обнаружились грубые ошибки - компилятору не понравились переменные с заглавными буквами типа В1 и В2.
ну это я для сайта хотел код причесать
что происходит на практике без min и max: при зажатой кнопке В1 значение переменной byte pwm растёт до 255 и не останавливается, а сбрасывается до значения переменной eep.
при зажатой кнопке В2 значение уменьшается до 0 и сбрасывается до значения eep.
насчёт ссылочки про работу с кнопками - если бы я её не перелопатил, данный "код" не родился бы.
Я рассписал необходимые действия и вопросы и не надо грубо так отвечать..
У распаянной м/к зашит блинк - даже не знаю как он там оказался - и программа не сбрасывается ресетом ,вывод: ресет залочен..
Корпус напомню - SOP-8 , с ним очень сложно возится - панельки нет
1. По моему сначала моргает бутлодер, а потом начинает работать блинк.
Они все с прошитым блинком приходят.
2. http://www.ebay.com/itm/SOIC8-SOP8-to-DIP8-EZ-Programmer-Adapter-Socket-...
У тинек 13 не куда загрузчик запихивать - там всего 1 кб , та и вообще серия attiny не поддерживает бутлоадер.Хотя есть пути обхода..
Про переходник вкурсе ,но цена его не выгодна.Лучше уж http://www.startcopy.ru/repair/soic.htm - хватит для опытов и перепрограммирования.
Неправда Ваша, есть для тинек бутлоадер. Не дуиновский конечно, но есть.
У тинек нет фьюза BOOTRST ..А то что зашить загрузчик можно я упомянул.
Вот самый известный загрузчик для Attiny 13 -
http://jps.hut2.ru/free_avr_loader_en.html
Сдаюсь ,не видал:) .Но речь была о том,что так таковой поддержки загрузчиков НЕТ..Это все костыли
Ну вот и приближается проверка в железе драйвера фонарика
Код конечно же непокажете?
Вот самый известный загрузчик для Attiny 13 -
http://jps.hut2.ru/free_avr_loader_en.html
Но даст возможность пихать тине по юарту прошивку?
Вот самый известный загрузчик для Attiny 13 -
http://jps.hut2.ru/free_avr_loader_en.html
Но даст возможность пихать тине по юарту прошивку?
Залезте на страничку с окончанием не на "en" а на "ru". Там по русски. Там все написано (внутри зипа).
UPD. Упс. Ридми там на английском.
Ну вот и приближается проверка в железе драйвера фонарика
Код конечно же непокажете?
Почему не покажу. я не скрываю свои коды если не заметили.но еще рано. надо допилить. как все будет нормально работать тогда и выложу коды, видео, фото
А как же народная мудрость и всё такое?
А как же народная мудрость и всё такое?
вы это к чему?
Разобрался с китайскими attiny13 ,которые не шились.Собрал фьюз доктор и установил правельные фьюзы.У одной был залочен ресет и SPI (L:F6 H:F8).
PS. Востановил все 5 штук.Везде были установлены какие попало фьюзы...Проверена через SPI -одна
Использовал Arduino UNO и горсть радиодеталей :)
Кому интересно написал про это тут http://homes-smart.ru/index.php/oborudovanie/arduino/48-vostanavlivaem-fyuzy-na-mikrokontrollerakh-attiny-cherez-arduino .В будущем исправлю и дополню статью..
Разобрался с делителями для ШИМа но рабочую частоту тиньки не могу поднять выше 1.2 мГц, прилагаю лог прошивки:
PS: с учетом важного дополнения от step962:
http://arduino.ru/forum/apparatnye-voprosy/otlichie-int-i-pcint#comment-...
PCINTx-прерывания обслуживают сразу целый порт, поэтому в обработчике необходимо смотреть на записанное и текущее состояние выводов и выискивать, какой же из пинов изменил свое состояние (и в какую сторону). Ну а потом уже решать, реагировать ли на это изменение или проигнорировать.
Вот, например, у ATMega328 есть три соответствующих вектора обработки прерываний PCINT: 4-й (PCINT0_vect), 5-й (PCINT0_vec1) и 6-й (PCINT2_vect). 4-й вектор обслуживает ноги PCINT7...0 (порт B), 5-й - PCINT8...14 (порт C - в нем только 7 выводов), 6-й - PCINT16...23 (порт D).
INTx слушает один-единственный вывод и может настраиваться на тип происходящего на нем изменения уровня. Стало быть, более оперативно реагирует на дергание соответствующей ножки.
Вот код. На самом деле нижнюю температуру можно чуток приподнять. В качестве темодатчиков использовал термисторы, мне понравилось, очень широки диапазон дают на АЦП, и дешевые!
Зарядное такое
Илья73, напиши нормальный код без PORTB, DDRВ, TCCR0A, TCCR0B и OCR0A, просто напиши как на дуинку, выкинь конденсаторы С3 и С4, чтобы транзисторы работали в ключевом режиме и перекачай ядро потом перед прошивкой тиньки выбери из списка ATtiny13 9.6 MHz BOD 2.7 V и запиши загрузчик потом залей прошивку и скорей всего ты писк уже не услышишь.
Хочу на УАЗик сделать управляемые тинькой дворники с запоминанием. Три режима - медленный, средний и быстрый плюс спецрежим, когда можно задать время между махами и на каком то махе писать писалкой. Главное - это то что время между махами и время между сцыками надо запоминать в епроме. У кого какие идеи будут?
HWman, а на какой частоте это "ядро". Сейчас попробую установить ядро, а тиньку завтра вытащу, она на работе.
Если все получится, будет совсем не плохо иметь такую версию ядра. Можно будет делать выбор если нужен шим неслышный :)
Да он в принципе и не пищит сейчас, вернее пищал только перед самым включеним , вот эти кондеры и гасили этот начальный писк. Сейчас только потрескивает перед запуском один вентелятор уже не помню на каой ноге. В общем вроде и работает, но чувствую что как то не совсем правильно.
Кстати, убил 2 тиньки неверно выставленными фьюзами, что-то мудрил с частотой 128 кГц, будь внимательный.
Перед прошивкой жми записать загрузчик, это выставит нужные фьюзы и рабочая частота тиньки будет 9.6 мГц., если же ничего не хочешь менять то выбирай 0.6 мГц., в таком случае загрузчик шить ненужно.
Кстати, конденсаторы в цепи образуют RC цепочку, тоесть транзистор по идее работает как бы в линейном режиме - дико греется, в ключевом не так.
Если ни чего не менять, т.е выбрать 0.6 мГц то и тинька будет работать на 0.6 мГц? С delay проблем не будет?
Сейчас перезаписал в Arduino 1.0.5
Вот код. На самом деле нижнюю температуру можно чуток приподнять. В качестве темодатчиков использовал термисторы, мне понравилось, очень широки диапазон дают на АЦП, и дешевые!
Зарядное такое
Илья73, напиши нормальный код без PORTB, DDRВ, TCCR0A, TCCR0B и OCR0A, просто напиши как на дуинку, выкинь конденсаторы С3 и С4, чтобы транзисторы работали в ключевом режиме и перекачай ядро потом перед прошивкой тиньки выбери из списка ATtiny13 9.6 MHz BOD 2.7 V и запиши загрузчик потом залей прошивку и скорей всего ты писк уже не услышишь.
видишь даже в ссылке на ядро что ты дал написано 9600000 частота при твоих фьюзах а не 1200000 как у тебя
видишь даже в ссылке на ядро что ты дал написано 9600000 частота при твоих фьюзах а не 1200000 как у тебя
Так я поправил и перезалил, раньше было 1200000 причём без буквы "L"
Если ни чего не менять, т.е выбрать 0.6 мГц то и тинька будет работать на 0.6 мГц? С delay проблем не будет?
Сейчас перезаписал в Arduino 1.0.5
Так как все свои тиньки поубивал то проверить что там с delay нету возможности.
Кстати, приставка BOD 2.7 V означает что тинька будет питаться до 2.7 В дальше будет перезагружатся пока напряжение не станет выше 2.7В .
Так как все свои тиньки поубивал
Не поубивал,а просто заблокировал :) востановить как оказалось ничего сложного.
ага. давай уже восстанавливай и исправляй boards
ага. давай уже восстанавливай и исправляй boards
Под рукой кроме дуинки ничего нет, так получится восстановить?
А что с boards.txt не так?
Кстати, тиня залочилась когда я выбрал данную опцию:
Перезалил ядро, при выборе Attiny13 1 MHz (default) никаких проблем с задержками быть не должно, даже загрузчик шить не обязательно.
Если хочется больше скорости то есть другой режим - ATtiny13 9.6 MHz, BOD 2.7 V с настроенным BODLEVELом на 2.7 В. просто перед прошивкой тинки жмём прошить загрузчик, это выставит нужные фьюзы.
Кстати, я тут делал хоть какую-то регулировку частоты ШИМ, немного переделал функцию из ядра, постарался максимально закоментировать что и как:
И теперь я в своей велофаре могу убавить частоту до 70 Гц, что на глаз не заметно, но, по моему мнению немного уменьшит энергопотребление.
сделал плату для драйвера. теперь осталось отладить программу
А ты как будешь рулить яркостью? Подавать ШИМ на драйвер?
А ты как будешь рулить яркостью? Подавать ШИМ на драйвер?
да шим, но на транзистор, а управлять яркостью кнопкой (2 контакта слева)
кнопка нужна просто для переключения тока, который драйвер будет стибилизировать при изменении напряжения питания
планирую только 2 режима: 50% яркости (может немного меньше или больше) и 100%. больше мне не требуется
частота шим в районе 100-150: на глаз незаметно, но меньше нагружает выход тиньки
частота тиньки скорее всего 128 кгц
пока так
Перезалил ядро, при выборе Attiny13 1 MHz (default) никаких проблем с задержками быть не должно, даже загрузчик шить не обязательно.
Если хочется больше скорости то есть другой режим - ATtiny13 9.6 MHz, BOD 2.7 V с настроенным BODLEVELом на 2.7 В. просто перед прошивкой тинки жмём прошить загрузчик, это выставит нужные фьюзы.
Кстати, я тут делал хоть какую-то регулировку частоты ШИМ, немного переделал функцию из ядра, постарался максимально закоментировать что и как:
И теперь я в своей велофаре могу убавить частоту до 70 Гц, что на глаз не заметно, но, по моему мнению немного уменьшит энергопотребление.
у меня тоже к вас вопрос в том что вы выкладывали
файл boards
вроде как частота должна быть не 1мгц а 1.2 мгц
и здесь должно быть соответственно 1200000
поправьте если ошибаюсь
Всё там нормально, при 1200000 задержка в 1000 где-то реально на 1200-1300, можеш проверить.
Всё там нормально, при 1200000 задержка в 1000 где-то реально на 1200-1300, можеш проверить.
странно это. частота по фьюзам стоит 9.6. делитель на 8 получается 1.2 мгц. откуда 1мгц не понял. ладно вечером постараюсь проверить
очень большое фото в тему
кристалл тини13
http://s.zeptobars.ru/atmel-attiny13a-HD.jpg
внимание размер более 8000пх
Вот если кому надо включение освещения по фоторезистору под 13 тиньку.
Код Megakoteyka написал (за что ему огромное спасибо), я толко резисторы прикрутил и чуть по другому гистерезис сделал.Тинька напрямую управляет твердотельным реле ssr25.
Новая статья на ЕЕ, возможно кому то будет интересно:
8 канальный ШИМ на attiny13, (с использованием 74HC595)
Ребята помогите разобраться.
Задача минимум:
Тинька в режиме минимального потребления. Раз в 15 минут должна на вывод (любой) подать меандр с частотой 2 Герца и длительностью 2 секунды.
Задача максимум: Делать то же самое, но при замыкании на ноль одной ноги - выдавать импульсы через 5 минут, другой ноги - через 10 минут, третьей ноги - через 15 минут. Замыкание происходит в отключенном состоянии и невозможно в работе. Т.е. это предустановка.
Понимаю, что для снижения потребления контроллер нужно усыпить и работать из-под вочдога.
Помогите разобраться - никак не пойму с чего копать.
Вот тут есть парочка интересных вещей.
Вот если кому надо...
Как-то неправильно усреднение работает - при неизменном текущем значении усредненное отображается на пару градусов выше.
Размер буфера 5 измерений, т.е. уже за 10 измерений текущее и усредненное по идее должны совпадать, а они отличаются.
Вот вывод показаний:
Вот код:
косяк найден :)
Вместо
Надо
Похоже что на вашей ATtiny13 памяти вагон и ёё некуда девать, и RAM и FLASH
http://arduino.ru/forum/proekty/dosvetka-v-teplitse#comment-49692
http://arduino.ru/forum/proekty/dosvetka-v-teplitse#comment-49917
Hi уважаемый All
стандартная проблема - новичок.
девайс рулит скоростью движка шимом при помощи двух клавиш, плюс сохраняет текущее значение в еепром при отключении питания.
немогу понять, как пофиксить багу - при старте девайса предидущие значения берутся из еепрома, например 20% шима, и при уменьшении кнопкой до нуля, значения прыгают опять до этой цифры.
а можете тоже самое словами описать? просто интересно то что вы написали соответствует тому что вы хотели написать
просто коментами рядом с кодом
замени
int
pwm=0;
наbyte
pwm=0;
и выкинь min и maxА код - он да, немного не соответствует ТЗ :)
ну так то я изначально попробовал, но если лишнее выкинуть и оставить только шим и две кнопки, то при достижения максимума переменная сваливается в ноль.
EEPROM.read похоже возвращает значение именно в byte, если ограничение max сделать равным 1 , то всё работает,но мне нужен 0% шим
А код - он да, немного не соответствует ТЗ :)
повторюсь - я не волшебник...
ячейка EEPROM имеет размерность byte, т.е. ты пытаешься впихнуть 65535 (int) в 255 (byte) :) При этом вполне возможно, что ячейка или обнуляется, или затрагивает соседние. А в следующей строчке тут же читаеся из EEPROM это непредсказуемое значение.
А по коду у тебя и должно при превышении максимума сваливаться в ноль, потому что никаких ограничений не задано.
вот так немного лучше
и еще почитай
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
вот так немного лучше
и еще почитай
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
блин, теория и практика - разные вещи, я так уже пробовал, сейчас попробовал ещё раз, обнаружились грубые ошибки - компилятору не понравились переменные с заглавными буквами типа В1 и В2.
ну это я для сайта хотел код причесать
что происходит на практике без min и max: при зажатой кнопке В1 значение переменной byte pwm растёт до 255 и не останавливается, а сбрасывается до значения переменной eep.
при зажатой кнопке В2 значение уменьшается до 0 и сбрасывается до значения eep.
насчёт ссылочки про работу с кнопками - если бы я её не перелопатил, данный "код" не родился бы.
никаких ограничений не задано.
кроме min и max как ограничения задать? поймите правильно, на форуме пишу, только когда уже отчаялся.
Программирование -> constrain()