Все вроде дописал я прогу димера, немного подкоректировал схему, да и в коде пришлось обойтись без ардуиновских функций, вообщем кто хочет повторить, милости прошу задавайте вопросы постораюсь растолковать)
Привет!!! Возник вот такой вопрос?? чтобы не лепить много обвязки ! сколько можно подцепить транзисторов параллельно напрямую к ноге шима тиньки транзисторы 10n03L , буква L в конце затвор логик левел http://www.chipfind.ru/datasheet/infineon/ipp10n03l.htm мне надо моторам на 300 ват 12 вольт 30 ампер по рулить как насчет 3 транзисторов параллельно к тини напрямую
Транзисторы 100 ват 73 амп 30 вольт??????????????????
и еще один вопрос я буду задействовать команду пульсин ей мерить количество импульсов и в зависимости от числа управлять мотором шимом все срастется ведь таймер один???? ( устал кипеть мотор охлаждения S80 его реостат принимает шим сигнал я его померил 9000 импульсов 1 скорость 6000 им 2 скорость 3000 3 скорость управлял мотором тоже шимом ) как лучше поступить????
решил намутить на тиньке с минимальной обвязкой????
подскажите а почему я не получается применять ватчдог на аттини 13? я читал в этой ветке вы писали про сторжевой таймер, и как вам ужалось наладить его?
емкость затвора 1200 пик 5 вольт как правильно подсчитать время заряда и ток????
с одним таким транзистором через резистор на 200 ом и подтяжкой к земле 10 ком работает прекрасно и не греется!!!(55 ват авто лампа)
может шим программный намутить на 3 ноги????*/
Выставьте небольшую частоту ШИМ, до 100 Гц.
Думаю по 50 ватт на транзистор будет норм, не забывайте про толщину проводов и ширину дорожек на плате, 30 А - "это вам не это".
Как намутите программный ШИМ - поделитесь.
/*подскажите а почему я не получается применять ватчдог на аттини 13? я читал в этой ветке вы писали про сторжевой таймер, и как вам ужалось наладить его?*/
Может я что не так написал , но если запустить таймер проверять его , и чтобы 3 ноги работали сразу напрямую в регистр 1 байт ( я не знаю ка правильно 8 бит) писать , и к та муже мне показалось что на 9.6 мегагерц
работала очень корректно можно ей через интервал (да проблема в остальной программе ????? в смысле время исполнение) прерывания рулят блин все что-то сложно по новой изучать вроде не дурак но без драйвера походу не как!!!!!
Да пробовал пример вот сам тут набросал, по аналогии с вашим, но ватчдог не перезагружает, т.е, выдержка прошла как и положенно, произошел ресет, а потом ичего не происходит, молчит((
5 (пятая) строка бессмыссленна- зачем запрещать то, чего нет,
выполняется один раз как раз тогда, когда wdt еще не включён.
Единственно когда это может понадобится ( а может и нет) когда wdt таймер разрешен с помощью фьюза, что делать особого смысла нет, и без него можем включать-выключать wdt таймер в программе
5 (пятая) строка бессмыссленна- зачем запрещать то, чего нет,
К сожалению есть.
выполняется один раз как раз тогда, когда wdt еще не включён.
trembo пишет:
Единственно когда это может понадобится ( а может и нет) когда wdt таймер разрешен с помощью фьюза,
Неверно. (см. ниже)
trembo пишет:
делать особого смысла нет, и без него можем включать-выключать wdt таймер в программе
Ситуация: фьюз не выставлен. включили програмно.... контроллер ребутнулся по вачдогу. Каково состояние вачдога? Ответ: ВКЛЮЧЕН. И если мы его быстренько не сбросим или выключим - он опять отправит нам камень в ребут.
Именно это и является причиной проблемы с некоторыми загрузчиками. Как только срабатывает вачдок - плата уходит в бесконечный ребут. Не успевает добраться до wdt_disable() в setup(); и вачдог повторно срабатывает еще в самом бутлоадере.
Поэтому для нормальной работы либо загрузчик должен выполнятся быстрее чем таймаут вачдога (что-бы успеть вырубить его в setup(), но тогда через загрузчик не выйдет скетчи заливать, так как это явно дольше), либо, по хорошему, вот это wdt_disable() должно быть в первых строчках самого загрузчика.
То есть мы в "предыдушей жизни" включили вачдогу, она сработала по каким-то причинам и после ребута получаем влючённый вачдог ? То есть при ребуте никто никаких регистров не чистит? И что, переменные, объявленные как static, после всего этого еще и сохраняют свои значения, Прямо реинкарнация какая-то получается.
То есть мы в "предыдушей жизни" включили вачдогу, она сработала по каким-то причинам и после ребута получаем влючённый вачдог ?
Точно.
Именно это и является причиной жалоб "дуина мигает светиком часто-часто-часто... и скетчи не заливаются".
trembo пишет:
То есть при ребуте никто никаких регистров не чистит? И что, переменные, объявленные как static, после всего этого еще и сохраняют свои значения, Прямо реинкарнация какая-то получается.
Не знаю. Не проверял. Вачдог - это точно. Остальное - либо пробовать, либо даташит курить. Думаю не сбрасывает (по крайней мере самим камнем, что-там бутлоадер чистит - неведомо, правильный и вачдог чистит, неправильный..... ну вы поняли). Думаю и static переменные сохранят свое значение (если вы конечно, не делаете им инициализацию при объявлении). Особенно если они объявлены как volatile.
Мне кажется ресет по вачдогу он как-бы "софт ресет". Передали управление куда там фьюзы сказали. Сбросили стек и кучу.... и все.
Но.. еще раз - это мои догадки. Я проверял только вачдог, на atmega1280 с каким-то древним бутлоадером.
P.S. В какой-то степени это даже хорошо. Что не сбрасывается. Это, теоретически, позволяет написать кастомный бутлоадер, который может определять по какой причине произошел ресет, аппаратно или по вачдогу..
Нужен выход 0-5 вольт, для управления зарядным током.
Насколько я понимаю можно сделать примерно так
Так вот - на какие ноги выход можно посадить, и как такую функцию реализовать?
Упс. Дошло.
Завтра попробую.
Чтобы было понятно, для чего - тыц раз,тыц два. Еще можно применить для регулировки яркости светодиодов, схема получается копеечная, идея взята тут. Опробованный (подачей напряжения на R5) вариант для зарядки:
Правда схеме присущи минусы источника тока на полевике.
Получил ток ~ 700mA, при 180 - 150-170mA, 255 - выкл, что меня удовлетворяет. Код бесперебойника впритык влез на ардуиновских функциях - 970 байт, в идеале конечно добавить засыпание при разряде...
3. Далее снимаю конденсатор 10uF (тот, что от GRN в RESET Arduino UNO). Ставлю плату:Arduino UNO програматор:AVRisp mkII(тут я не очень понял, что надо сразу ставить Arduino as ISP или на AVRisp mkII, но пробовал и так и так.). Открываю из примера: ArduinoISP. Тут вроде все нормально. По очереди пробегают все светодиоды и остается гореть зеленый.
4.Ставлю назад конденсатор(GND->Reset). Ставлю плату:Attine13 9.6 (пробовал на 1.2 и 4.8), программатор:Arduino as ISP. Загружаю стандартную прогу blink.
Первая ошибки я так понимаю бывает т.к. платы иногда присылают нули т.е. впринципе это можно пережить. А вот насчет второй я так понял, что бывает когда плата мертва...Может кто-то подскажет что я делаю не так? Заранее спасибо.
П.С. С ардуиной играюсь 3 день, воэтому просьба сильно не ругать если где-то допустил детский ляп. Форум вроде почитал и решение пока не нашел.
3. Далее снимаю конденсатор 10uF (тот, что от GRN в RESET Arduino UNO). Ставлю плату:Arduino UNO програматор:AVRisp mkII(тут я не очень понял, что надо сразу ставить Arduino as ISP или на AVRisp mkII, но пробовал и так и так.). Открываю из примера: ArduinoISP. Тут вроде все нормально. По очереди пробегают все светодиоды и остается гореть зеленый.
При загрузке скетча в дуину ArduinoISP программатор должен быть AVRisp mkII, уже после того как зашился ArduinoISP меняем тип программатора на Arduino as ISP и прошиваем тини при помощи кнопки "Прошить с помощью программатора".
Потом если захочется прошивать дуину не забывайте изменять тип программатора назад на AVRisp mkII.
PS Лично я обхожусь без конденсаторов земля-ресет на дуине.
Эти китайские usbasp - как карта ляжет, лежит такой, работать отказывается, плюнул, собрал сам.
свой вариант печатки могу дать если надо.
//
Возвращаясь к attiny, - библиотека pwm.h тут не подойдет, как сделать шим, с частотой которую можно задавать в setup, на PB1 и duty cycle 0-255? Частоты нужны 15-100kHz.
При прошивке аттини через программатор необходимо выбирать в меню пункт "с помощью программатора"
Так вот именно это я и нажимаю выдает вот такое сообщение(
И так при выводе такого сообщения
1
please define PAGEL and BS2 signals
in
the configuration file
for
part
советую прочитать вот эту статью
http://bigbarrel.ru/error_attiny4585/
https://www.youtube.com/watch?v=MS5i7fnlPBM#t=463
Мужики ну может кто знает почему не происходит нормального чтения АЦП, если я пытаюсь прочитать только 8 бит( ADLAR = 1)
получается вроде как в переменную записывается значение либо 255 либо 0 вот код
01
byte
light_time = 0;
// управления выдержкой на включение
02
03
04
05
void
setup
() {
06
07
DDRB |=(1<<0);
//PB3 установить как выход
08
ADMUX |=(1<<ADLAR);
//читаем только ADCH ! 8 бит разрешение
09
}
10
11
12
void
loop
()
13
{
14
// если разрешено считывание АЦП , то
15
16
light_time = Read_ADC(3);
17
PORTB |=(1<<0);
18
delay(light_time);
19
PORTB &= ~(1<<0);
20
}
21
22
byte
Read_ADC(
byte
channel)
//функция для чтения АЦП
23
{
24
ADMUX = channel;
// ADC pin
25
ADCSRA |= 1<<ADEN;
26
ADCSRA |= 1<<ADSC;
27
while
(!(ADCSRA & (1<<ADIF)));
28
ADCSRA |= 1<<ADIF;
29
ADCSRA &= ~(1 << ADEN);
// отключаем АЦП, для уменьшения энергопотребления
30
return
ADCH;
31
32
}
Функцыя с другого поста:
01
unsigned
int
analogRead_C(
byte
channel){
02
ADMUX = channel;
// ADC pin
03
ADCSRA |= 1<<ADEN;
04
ADCSRA |= 1<<ADSC;
05
while
(!(ADCSRA & (1<<ADIF)));
06
ADCSRA |= 1<<ADIF;
07
byte
low = ADCL;
08
byte
high = ADCH;
09
//ADCSRA &= ~(1 << ADEN); // отключаем АЦП, для уменьшения энергопотребления
10
return
(high << 8) | low;
11
}
И результат делите на 4, Боже, зачем заморачиваться с этим adlar?
>> Считать когда фаза будет переходить через ноль не лучшая идея, частота не всегда ровно 50 герц
Точную частоту в розетке (в России) можно посмотреть на сайте http://so-ups.ru/
Насколько я помню, во всей стране есть несколько синхронных зон.
Функцыя с другого поста:
01
unsigned
int
analogRead_C(
byte
channel){
02
ADMUX = channel;
// ADC pin
03
ADCSRA |= 1<<ADEN;
04
ADCSRA |= 1<<ADSC;
05
while
(!(ADCSRA & (1<<ADIF)));
06
ADCSRA |= 1<<ADIF;
07
byte
low = ADCL;
08
byte
high = ADCH;
09
//ADCSRA &= ~(1 << ADEN); // отключаем АЦП, для уменьшения энергопотребления
10
return
(high << 8) | low;
11
}
И результат делите на 4, Боже, зачем заморачиваться с этим adlar?
Да я знаю что можно на 4 разделить, но тут просто попытка понять))
У Вас есть протеус?
Да есть но я не знаю как туда ардуиновские проги кидать?
Как будет время покажу что и как, правда это извращение ещё то, но можно вполне отладить что-то без наличия железа.
Все вроде дописал я прогу димера, немного подкоректировал схему, да и в коде пришлось обойтись без ардуиновских функций, вообщем кто хочет повторить, милости прошу задавайте вопросы постораюсь растолковать)
Измененная схема
вот код
#include <avr/io.h> // чисто для приличия
#include <avr/interrupt.h> // биба для настройки прерываний
/////////////////////////////////////////////////////
volatile boolean ADC_stop =
false
;
//флаг остановки считывания АЦП при рыдержке времени
volatile
byte
counter = 0;
//счетчик для отчета времени
byte
light_time = 50;
//переменная непосредственногог управления выдержкой на включение симистора
byte
ADC_value = 0;
void
setup
() {
InitINT0();
// нужно
DDRB |=(1<<4);
//PB3 установить как выход
DDRB &= ~(1<<1);
//PB1 устанавливаем как вход
PORTB |=(1<<4);
//включаем симистор
}
void
InitINT0()
// Инициализация прерываний
{
cli();
TCCR0A = 0b00000010;
// WGM01 WGM00 ! режим СТС
TCCR0B = 0b00000010;
// CS02 CS01 CS00 прескалинг на 8
OCR0A = 120;
// частота прерываний 9600000/8/120 = 10000 Гц это 200 раз за период 20 мсек
TIMSK0 |= (1<<OCIE0A);
ADMUX = (1<<ADLAR)|(1<<MUX1)|(1<<MUX0);
ADCSRA = 0b10000001;
MCUCR |= (1<<ISC01) | (1<<ISC00);
GIMSK |= (1<<INT0);
sei();
}
ISR(INT0_vect)
// прерывание по вектору INT0(ножка РВ1), тоесть по изменению состояния вывода LOW on HIGH
{
PORTB &=~(1<<4);
//выключаем симистор
TIMSK0 |= (1<<OCIE0A);
// запускаем таймер
ADC_stop =
true
;
// ставим запрет на считывание АЦП, это для того чтобы не менялось значение
// выдержки в процессе отсчета
}
ISR(TIM0_COMPA_vect)
//если словили переход через ноль
{
counter ++;
// увеличиваем значение счетчика через каждые 100 мксек
if
(counter == light_time)
{
PORTB |=(1<<4);
//включаем симистор
TIMSK0 &= ~(1<<OCIE0A);
// останавливаем таймер
ADC_stop =
false
;
//разрешаем читать АЦП
counter = 0;
}
}
void
loop
()
{
if
(!ADC_stop)
{
ADC_value = Read_ADC();
light_time = map_byte(ADC_value, 0, 255, 1, 99);
}
}
byte
Read_ADC()
{
ADCSRA |= (1<<ADSC);
while
((ADCSRA & 0x10)==0);
//ждем, пока АЦП закончит преобразование (ADIF = 0)
ADCSRA|=0x10;
//устанавливаем ADIF
return
ADCH;
//возращаем только ADCH, ADCL нам не нужно
}
byte
map_byte(
byte
x,
byte
in_min,
byte
in_max,
byte
out_min,
byte
out_max)
{
return
(x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
Размер скетча в двоичном коде: 506 байт (из 1 024 байт максимум)
Привет!!! Возник вот такой вопрос?? чтобы не лепить много обвязки ! сколько можно подцепить транзисторов параллельно напрямую к ноге шима тиньки транзисторы 10n03L , буква L в конце затвор логик левел
http://www.chipfind.ru/datasheet/infineon/ipp10n03l.htm мне надо моторам на 300 ват 12 вольт 30 ампер по рулить как насчет 3 транзисторов параллельно к тини напрямую
Транзисторы 100 ват 73 амп 30 вольт??????????????????
ну рискните. сожгете порт тини возможно. а полевики вообще скорее всего
я тоже так думаю .думал может порадует кто!!!!
емкость затвора 1200 пик 5 вольт как правильно подсчитать время заряда и ток????
с одним таким транзистором через резистор на 200 ом и подтяжкой к земле 10 ком работает прекрасно и не греется!!!(55 ват авто лампа)
может шим программный намутить на 3 ноги????
и еще один вопрос я буду задействовать команду пульсин ей мерить количество импульсов и в зависимости от числа управлять мотором шимом все срастется ведь таймер один???? ( устал кипеть мотор охлаждения S80 его реостат принимает шим сигнал я его померил 9000 импульсов 1 скорость 6000 им 2 скорость 3000 3 скорость управлял мотором тоже шимом ) как лучше поступить????
решил намутить на тиньке с минимальной обвязкой????
подскажите а почему я не получается применять ватчдог на аттини 13? я читал в этой ветке вы писали про сторжевой таймер, и как вам ужалось наладить его?
/*я тоже так думаю .думал может порадует кто!!!!
емкость затвора 1200 пик 5 вольт как правильно подсчитать время заряда и ток????
с одним таким транзистором через резистор на 200 ом и подтяжкой к земле 10 ком работает прекрасно и не греется!!!(55 ват авто лампа)
может шим программный намутить на 3 ноги????*/
Выставьте небольшую частоту ШИМ, до 100 Гц.
Думаю по 50 ватт на транзистор будет норм, не забывайте про толщину проводов и ширину дорожек на плате, 30 А - "это вам не это".
Как намутите программный ШИМ - поделитесь.
/*подскажите а почему я не получается применять ватчдог на аттини 13? я читал в этой ветке вы писали про сторжевой таймер, и как вам ужалось наладить его?*/
Что именно не получается? Посмотрите тут.
Как намутите программный ШИМ - поделитесь.
Может я что не так написал , но если запустить таймер проверять его , и чтобы 3 ноги работали сразу напрямую в регистр 1 байт ( я не знаю ка правильно 8 бит) писать , и к та муже мне показалось что на 9.6 мегагерц
Что именно не получается? Посмотрите тут.
Да пробовал пример вот сам тут набросал, по аналогии с вашим, но ватчдог не перезагружает, т.е, выдержка прошла как и положенно, произошел ресет, а потом ичего не происходит, молчит((
01
#include <avr/wdt.h>
02
#define MIG 0
03
int
counter=0;
04
void
setup
(){
05
wdt_disable();
// запретили как можно скорее собаку, что-бы не уйти в бесконечный ребут
06
pinMode(MIG, OUTPUT);
07
08
09
delay(1000);
// что-бы четче видеть рестар скетча
10
11
12
13
14
15
}
16
17
18
19
void
loop
(){
20
21
wdt_enable(WDTO_4S);
// активировали таймер, каждые 4-ре секунды его нужно сбрасывать
22
23
counter++;
24
25
if
(counter==5){
26
while
(
true
)
27
{
28
digitalWrite(MIG, HIGH);
29
delay(500);
30
digitalWrite(MIG, LOW);
31
delay(500);
32
}
// создаем зависание, через 4 секунды должен произойти ресет, так как не вызывается wdt_reset();
33
}
34
delay(500);
35
wdt_reset();
// говорим собаке что "В Багдаде все спокойно", начинается очередной отсчет 4-х секунд.
36
}
Сори, но все заработало из примера выше, просто закоментировал, 9 строчку и все пошло, если есть мысли поделитесь кто нибудь))
/*как шим на 100 мег поправить???????*/
Здесь поищите http://sotvorimvmeste.ru/viewtopic.php?f=36&t=74
5 (пятая) строка бессмыссленна- зачем запрещать то, чего нет,
выполняется один раз как раз тогда, когда wdt еще не включён.
Единственно когда это может понадобится ( а может и нет) когда wdt таймер разрешен с помощью фьюза, что делать особого смысла нет, и без него можем включать-выключать wdt таймер в программе
5 (пятая) строка бессмыссленна- зачем запрещать то, чего нет,
К сожалению есть.
выполняется один раз как раз тогда, когда wdt еще не включён.
Единственно когда это может понадобится ( а может и нет) когда wdt таймер разрешен с помощью фьюза,
Неверно. (см. ниже)
делать особого смысла нет, и без него можем включать-выключать wdt таймер в программе
Ситуация: фьюз не выставлен. включили програмно.... контроллер ребутнулся по вачдогу. Каково состояние вачдога? Ответ: ВКЛЮЧЕН. И если мы его быстренько не сбросим или выключим - он опять отправит нам камень в ребут.
Именно это и является причиной проблемы с некоторыми загрузчиками. Как только срабатывает вачдок - плата уходит в бесконечный ребут. Не успевает добраться до wdt_disable() в setup(); и вачдог повторно срабатывает еще в самом бутлоадере.
Поэтому для нормальной работы либо загрузчик должен выполнятся быстрее чем таймаут вачдога (что-бы успеть вырубить его в setup(), но тогда через загрузчик не выйдет скетчи заливать, так как это явно дольше), либо, по хорошему, вот это wdt_disable() должно быть в первых строчках самого загрузчика.
То есть мы в "предыдушей жизни" включили вачдогу, она сработала по каким-то причинам и после ребута получаем влючённый вачдог ? То есть при ребуте никто никаких регистров не чистит? И что, переменные, объявленные как static, после всего этого еще и сохраняют свои значения, Прямо реинкарнация какая-то получается.
То есть мы в "предыдушей жизни" включили вачдогу, она сработала по каким-то причинам и после ребута получаем влючённый вачдог ?
Точно.
Именно это и является причиной жалоб "дуина мигает светиком часто-часто-часто... и скетчи не заливаются".
То есть при ребуте никто никаких регистров не чистит? И что, переменные, объявленные как static, после всего этого еще и сохраняют свои значения, Прямо реинкарнация какая-то получается.
Не знаю. Не проверял. Вачдог - это точно. Остальное - либо пробовать, либо даташит курить. Думаю не сбрасывает (по крайней мере самим камнем, что-там бутлоадер чистит - неведомо, правильный и вачдог чистит, неправильный..... ну вы поняли). Думаю и static переменные сохранят свое значение (если вы конечно, не делаете им инициализацию при объявлении). Особенно если они объявлены как volatile.
Мне кажется ресет по вачдогу он как-бы "софт ресет". Передали управление куда там фьюзы сказали. Сбросили стек и кучу.... и все.
Но.. еще раз - это мои догадки. Я проверял только вачдог, на atmega1280 с каким-то древним бутлоадером.
P.S. В какой-то степени это даже хорошо. Что не сбрасывается. Это, теоретически, позволяет написать кастомный бутлоадер, который может определять по какой причине произошел ресет, аппаратно или по вачдогу..
Друзья, подскажите пожалуйста, чтобы на сабже использовать первую ногу (RESET) на выход обязательно использовать высоковольтный программатор?
Нет, но программироваться МК будет только 1 раз - если у Вас конечно нету высоковольтный программатора.
спасибо , как раз так и нужно http://fusecalc.mirmk.net/ нашол такой калькулятор очень наглядно всё.
отключил резет залил hex сейчас буду проверять не намудрил ли чего)
/*отключил резет залил hex сейчас буду проверять не намудрил ли чего)*/
Какой hex залили? При таких раскладах заливаеться что-нибудь только раз, хотите ещё или покупайте ВВ программатор или паяйте его.
Да там паять-то.. надо ардуину ,программатор(или другую ардуину для прошивки) и 3 транзистора..
Hex для готового устойства, больше перепрошивать не нужно :)
Всё заработало спасибо)
Тут кто-то интересовался как моделировать ардуино в протеусе, вот:
https://www.youtube.com/watch?v=gj5koMNtKwI
Нужен выход 0-5 вольт, для управления зарядным током.
Насколько я понимаю можно сделать примерно так
Так вот - на какие ноги выход можно посадить, и как такую функцию реализовать?
Упс. Дошло.
Завтра попробую.
А задумка то интересная.
Чтобы было понятно, для чего - тыц раз, тыц два. Еще можно применить для регулировки яркости светодиодов, схема получается копеечная, идея взята тут. Опробованный (подачей напряжения на R5) вариант для зарядки:
Правда схеме присущи минусы источника тока на полевике.
Оказалось всё проще. С ноги тини - резистор 1k + конденсатор 0.1мкф, - RC фильтр, дальше к схеме, что выше, на R5.
1
analogWrite(CURRENT_PIN, 85 );
Получил ток ~ 700mA, при 180 - 150-170mA, 255 - выкл, что меня удовлетворяет. Код бесперебойника впритык влез на ардуиновских функциях - 970 байт, в идеале конечно добавить засыпание при разряде...
...в идеале конечно добавить засыпание при разряде...
http://arduino.ru/forum/proekty/zashchita-ot-glubokogo-razryada-na-attin...
Аппаратно - да.
HWman спасибо за материал,пригодилось в другой теме http://arduino.ru/forum/proekty/umnye-tualet-i-vannaya?page=8#comment-74196
Возникла проблема с прошивкой Attiny13a-PU. Что я делаю:
1. Собираю стандартную схему+к 4 ножке тини подключаю светодиод что бы потом проверить. Результат(для увеличения фото кликнуть по ним):
2. Качаю по ссылке со второй страницы http://hwman.ho.ua/files/ATtiny13A101/attiny13.zip и заливаю в новосозданую папку hardware.(появляются Тини13 3 штуки)
3. Далее снимаю конденсатор 10uF (тот, что от GRN в RESET Arduino UNO). Ставлю плату:Arduino UNO програматор:AVRisp mkII(тут я не очень понял, что надо сразу ставить Arduino as ISP или на AVRisp mkII, но пробовал и так и так.). Открываю из примера: ArduinoISP. Тут вроде все нормально. По очереди пробегают все светодиоды и остается гореть зеленый.
001
// ArduinoISP version 04m3
002
// Copyright (c) 2008-2011 Randall Bohn
003
// If you require a license, see
004
// <a href="http://www.opensource.org/licenses/bsd-license.php" title="http://www.opensource.org/licenses/bsd-license.php" rel="nofollow">http://www.opensource.org/licenses/bsd-license.php</a>
005
//
006
// This sketch turns the Arduino into a AVRISP
007
// using the following arduino pins:
008
//
009
// pin name: not-mega: mega(1280 and 2560)
010
// slave reset: 10: 53
011
// MOSI: 11: 51
012
// MISO: 12: 50
013
// SCK: 13: 52
014
//
015
// Put an LED (with resistor) on the following pins:
016
// 9: Heartbeat - shows the programmer is running
017
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
018
// 7: Programming - In communication with the slave
019
//
020
// 23 July 2011 Randall Bohn
021
// -Address Arduino issue 509 :: Portability of ArduinoISP
022
// <a href="http://code.google.com/p/arduino/issues/detail?id=509" title="http://code.google.com/p/arduino/issues/detail?id=509" rel="nofollow">http://code.google.com/p/arduino/issues/detail?id=509</a>
023
//
024
// October 2010 by Randall Bohn
025
// - Write to EEPROM > 256 bytes
026
// - Better use of LEDs:
027
// -- Flash LED_PMODE on each flash commit
028
// -- Flash LED_PMODE while writing EEPROM (both give visual feedback of writing progress)
029
// - Light LED_ERR whenever we hit a STK_NOSYNC. Turn it off when back in sync.
030
// - Use pins_arduino.h (should also work on Arduino Mega)
031
//
032
// October 2009 by David A. Mellis
033
// - Added support for the read signature command
034
//
035
// February 2009 by Randall Bohn
036
// - Added support for writing to EEPROM (what took so long?)
037
// Windows users should consider WinAVR's avrdude instead of the
038
// avrdude included with Arduino software.
039
//
040
// January 2008 by Randall Bohn
041
// - Thanks to Amplificar for helping me with the STK500 protocol
042
// - The AVRISP/STK500 (mk I) protocol is used in the arduino bootloader
043
// - The SPI functions herein were developed for the AVR910_ARD programmer
044
// - More information at <a href="http://code.google.com/p/mega-isp" title="http://code.google.com/p/mega-isp" rel="nofollow">http://code.google.com/p/mega-isp</a>
045
046
#include "pins_arduino.h"
047
#define RESET SS
048
049
#define LED_HB 9
050
#define LED_ERR 8
051
#define LED_PMODE 7
052
#define PROG_FLICKER true
053
054
#define HWVER 2
055
#define SWMAJ 1
056
#define SWMIN 18
057
058
// STK Definitions
059
#define STK_OK 0x10
060
#define STK_FAILED 0x11
061
#define STK_UNKNOWN 0x12
062
#define STK_INSYNC 0x14
063
#define STK_NOSYNC 0x15
064
#define CRC_EOP 0x20 //ok it is a space...
065
066
void
pulse(
int
pin,
int
times);
067
068
void
setup
() {
069
Serial
.begin(19200);
070
pinMode(LED_PMODE, OUTPUT);
071
pulse(LED_PMODE, 2);
072
pinMode(LED_ERR, OUTPUT);
073
pulse(LED_ERR, 2);
074
pinMode(LED_HB, OUTPUT);
075
pulse(LED_HB, 2);
076
}
077
078
int
error=0;
079
int
pmode=0;
080
// address for reading and writing, set by 'U' command
081
int
here;
082
uint8_t buff[256];
// global block storage
083
084
#define beget16(addr) (*addr * 256 + *(addr+1) )
085
typedef
struct
param {
086
uint8_t devicecode;
087
uint8_t revision;
088
uint8_t progtype;
089
uint8_t parmode;
090
uint8_t polling;
091
uint8_t selftimed;
092
uint8_t lockbytes;
093
uint8_t fusebytes;
094
int
flashpoll;
095
int
eeprompoll;
096
int
pagesize;
097
int
eepromsize;
098
int
flashsize;
099
}
100
parameter;
101
102
parameter param;
103
104
// this provides a heartbeat on pin 9, so you can tell the software is running.
105
uint8_t hbval=128;
106
int8_t hbdelta=8;
107
void
heartbeat() {
108
if
(hbval > 192) hbdelta = -hbdelta;
109
if
(hbval < 32) hbdelta = -hbdelta;
110
hbval += hbdelta;
111
analogWrite(LED_HB, hbval);
112
delay(20);
113
}
114
115
116
void
loop
(
void
) {
117
// is pmode active?
118
if
(pmode) digitalWrite(LED_PMODE, HIGH);
119
else
digitalWrite(LED_PMODE, LOW);
120
// is there an error?
121
if
(error) digitalWrite(LED_ERR, HIGH);
122
else
digitalWrite(LED_ERR, LOW);
123
124
// light the heartbeat LED
125
heartbeat();
126
if
(
Serial
.available()) {
127
avrisp();
128
}
129
}
130
131
uint8_t getch() {
132
while
(!
Serial
.available());
133
return
Serial
.read();
134
}
135
void
fill(
int
n) {
136
for
(
int
x = 0; x < n; x++) {
137
buff[x] = getch();
138
}
139
}
140
141
#define PTIME 30
142
void
pulse(
int
pin,
int
times) {
143
do
{
144
digitalWrite(pin, HIGH);
145
delay(PTIME);
146
digitalWrite(pin, LOW);
147
delay(PTIME);
148
}
149
while
(times--);
150
}
151
152
void
prog_lamp(
int
state) {
153
if
(PROG_FLICKER)
154
digitalWrite(LED_PMODE, state);
155
}
156
157
void
spi_init() {
158
uint8_t x;
159
SPCR = 0x53;
160
x=SPSR;
161
x=SPDR;
162
}
163
164
void
spi_wait() {
165
do
{
166
}
167
while
(!(SPSR & (1 << SPIF)));
168
}
169
170
uint8_t spi_send(uint8_t b) {
171
uint8_t reply;
172
SPDR=b;
173
spi_wait();
174
reply = SPDR;
175
return
reply;
176
}
177
178
uint8_t spi_transaction(uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
179
uint8_t n;
180
spi_send(a);
181
n=spi_send(b);
182
//if (n != a) error = -1;
183
n=spi_send(c);
184
return
spi_send(d);
185
}
186
187
void
empty_reply() {
188
if
(CRC_EOP == getch()) {
189
Serial
.print((
char
)STK_INSYNC);
190
Serial
.print((
char
)STK_OK);
191
}
192
else
{
193
error++;
194
Serial
.print((
char
)STK_NOSYNC);
195
}
196
}
197
198
void
breply(uint8_t b) {
199
if
(CRC_EOP == getch()) {
200
Serial
.print((
char
)STK_INSYNC);
201
Serial
.print((
char
)b);
202
Serial
.print((
char
)STK_OK);
203
}
204
else
{
205
error++;
206
Serial
.print((
char
)STK_NOSYNC);
207
}
208
}
209
210
void
get_version(uint8_t c) {
211
switch
(c) {
212
case
0x80:
213
breply(HWVER);
214
break
;
215
case
0x81:
216
breply(SWMAJ);
217
break
;
218
case
0x82:
219
breply(SWMIN);
220
break
;
221
case
0x93:
222
breply(
'S'
);
// serial programmer
223
break
;
224
default
:
225
breply(0);
226
}
227
}
228
229
void
set_parameters() {
230
// call this after reading paramter packet into buff[]
231
param.devicecode = buff[0];
232
param.revision = buff[1];
233
param.progtype = buff[2];
234
param.parmode = buff[3];
235
param.polling = buff[4];
236
param.selftimed = buff[5];
237
param.lockbytes = buff[6];
238
param.fusebytes = buff[7];
239
param.flashpoll = buff[8];
240
// ignore buff[9] (= buff[8])
241
// following are 16 bits (big endian)
242
param.eeprompoll = beget16(&buff[10]);
243
param.pagesize = beget16(&buff[12]);
244
param.eepromsize = beget16(&buff[14]);
245
246
// 32 bits flashsize (big endian)
247
param.flashsize = buff[16] * 0x01000000
248
+ buff[17] * 0x00010000
249
+ buff[18] * 0x00000100
250
+ buff[19];
251
252
}
253
254
void
start_pmode() {
255
spi_init();
256
// following delays may not work on all targets...
257
pinMode(RESET, OUTPUT);
258
digitalWrite(RESET, HIGH);
259
pinMode(SCK, OUTPUT);
260
digitalWrite(SCK, LOW);
261
delay(50);
262
digitalWrite(RESET, LOW);
263
delay(50);
264
pinMode(MISO, INPUT);
265
pinMode(MOSI, OUTPUT);
266
spi_transaction(0xAC, 0x53, 0x00, 0x00);
267
pmode = 1;
268
}
269
270
void
end_pmode() {
271
pinMode(MISO, INPUT);
272
pinMode(MOSI, INPUT);
273
pinMode(SCK, INPUT);
274
pinMode(RESET, INPUT);
275
pmode = 0;
276
}
277
278
void
universal() {
279
int
w;
280
uint8_t ch;
281
282
fill(4);
283
ch = spi_transaction(buff[0], buff[1], buff[2], buff[3]);
284
breply(ch);
285
}
286
287
void
flash(uint8_t hilo,
int
addr, uint8_t data) {
288
spi_transaction(0x40+8*hilo,
289
addr>>8 & 0xFF,
290
addr & 0xFF,
291
data);
292
}
293
void
commit(
int
addr) {
294
if
(PROG_FLICKER) prog_lamp(LOW);
295
spi_transaction(0x4C, (addr >> 8) & 0xFF, addr & 0xFF, 0);
296
if
(PROG_FLICKER) {
297
delay(PTIME);
298
prog_lamp(HIGH);
299
}
300
}
301
302
//#define _current_page(x) (here & 0xFFFFE0)
303
int
current_page(
int
addr) {
304
if
(param.pagesize == 32)
return
here & 0xFFFFFFF0;
305
if
(param.pagesize == 64)
return
here & 0xFFFFFFE0;
306
if
(param.pagesize == 128)
return
here & 0xFFFFFFC0;
307
if
(param.pagesize == 256)
return
here & 0xFFFFFF80;
308
return
here;
309
}
310
311
312
void
write_flash(
int
length) {
313
fill(length);
314
if
(CRC_EOP == getch()) {
315
Serial
.print((
char
) STK_INSYNC);
316
Serial
.print((
char
) write_flash_pages(length));
317
}
318
else
{
319
error++;
320
Serial
.print((
char
) STK_NOSYNC);
321
}
322
}
323
324
uint8_t write_flash_pages(
int
length) {
325
int
x = 0;
326
int
page = current_page(here);
327
while
(x < length) {
328
if
(page != current_page(here)) {
329
commit(page);
330
page = current_page(here);
331
}
332
flash(LOW, here, buff[x++]);
333
flash(HIGH, here, buff[x++]);
334
here++;
335
}
336
337
commit(page);
338
339
return
STK_OK;
340
}
341
342
#define EECHUNK (32)
343
uint8_t write_eeprom(
int
length) {
344
// here is a word address, get the byte address
345
int
start = here * 2;
346
int
remaining = length;
347
if
(length > param.eepromsize) {
348
error++;
349
return
STK_FAILED;
350
}
351
while
(remaining > EECHUNK) {
352
write_eeprom_chunk(start, EECHUNK);
353
start += EECHUNK;
354
remaining -= EECHUNK;
355
}
356
write_eeprom_chunk(start, remaining);
357
return
STK_OK;
358
}
359
// write (length) bytes, (start) is a byte address
360
uint8_t write_eeprom_chunk(
int
start,
int
length) {
361
// this writes byte-by-byte,
362
// page writing may be faster (4 bytes at a time)
363
fill(length);
364
prog_lamp(LOW);
365
for
(
int
x = 0; x < length; x++) {
366
int
addr = start+x;
367
spi_transaction(0xC0, (addr>>8) & 0xFF, addr & 0xFF, buff[x]);
368
delay(45);
369
}
370
prog_lamp(HIGH);
371
return
STK_OK;
372
}
373
374
void
program_page() {
375
char
result = (
char
) STK_FAILED;
376
int
length = 256 * getch();
377
length += getch();
378
char
memtype = getch();
379
// flash memory @here, (length) bytes
380
if
(memtype ==
'F'
) {
381
write_flash(length);
382
return
;
383
}
384
if
(memtype ==
'E'
) {
385
result = (
char
)write_eeprom(length);
386
if
(CRC_EOP == getch()) {
387
Serial
.print((
char
) STK_INSYNC);
388
Serial
.print(result);
389
}
390
else
{
391
error++;
392
Serial
.print((
char
) STK_NOSYNC);
393
}
394
return
;
395
}
396
Serial
.print((
char
)STK_FAILED);
397
return
;
398
}
399
400
uint8_t flash_read(uint8_t hilo,
int
addr) {
401
return
spi_transaction(0x20 + hilo * 8,
402
(addr >> 8) & 0xFF,
403
addr & 0xFF,
404
0);
405
}
406
407
char
flash_read_page(
int
length) {
408
for
(
int
x = 0; x < length; x+=2) {
409
uint8_t low = flash_read(LOW, here);
410
Serial
.print((
char
) low);
411
uint8_t high = flash_read(HIGH, here);
412
Serial
.print((
char
) high);
413
here++;
414
}
415
return
STK_OK;
416
}
417
418
char
eeprom_read_page(
int
length) {
419
// here again we have a word address
420
int
start = here * 2;
421
for
(
int
x = 0; x < length; x++) {
422
int
addr = start + x;
423
uint8_t ee = spi_transaction(0xA0, (addr >> 8) & 0xFF, addr & 0xFF, 0xFF);
424
Serial
.print((
char
) ee);
425
}
426
return
STK_OK;
427
}
428
429
void
read_page() {
430
char
result = (
char
)STK_FAILED;
431
int
length = 256 * getch();
432
length += getch();
433
char
memtype = getch();
434
if
(CRC_EOP != getch()) {
435
error++;
436
Serial
.print((
char
) STK_NOSYNC);
437
return
;
438
}
439
Serial
.print((
char
) STK_INSYNC);
440
if
(memtype ==
'F'
) result = flash_read_page(length);
441
if
(memtype ==
'E'
) result = eeprom_read_page(length);
442
Serial
.print(result);
443
return
;
444
}
445
446
void
read_signature() {
447
if
(CRC_EOP != getch()) {
448
error++;
449
Serial
.print((
char
) STK_NOSYNC);
450
return
;
451
}
452
Serial
.print((
char
) STK_INSYNC);
453
uint8_t high = spi_transaction(0x30, 0x00, 0x00, 0x00);
454
Serial
.print((
char
) high);
455
uint8_t middle = spi_transaction(0x30, 0x00, 0x01, 0x00);
456
Serial
.print((
char
) middle);
457
uint8_t low = spi_transaction(0x30, 0x00, 0x02, 0x00);
458
Serial
.print((
char
) low);
459
Serial
.print((
char
) STK_OK);
460
}
461
//////////////////////////////////////////
462
//////////////////////////////////////////
463
464
465
////////////////////////////////////
466
////////////////////////////////////
467
int
avrisp() {
468
uint8_t data, low, high;
469
uint8_t ch = getch();
470
switch
(ch) {
471
case
'0'
:
// signon
472
error = 0;
473
empty_reply();
474
break
;
475
case
'1'
:
476
if
(getch() == CRC_EOP) {
477
Serial
.print((
char
) STK_INSYNC);
478
Serial
.print(
"AVR ISP"
);
479
Serial
.print((
char
) STK_OK);
480
}
481
break
;
482
case
'A'
:
483
get_version(getch());
484
break
;
485
case
'B'
:
486
fill(20);
487
set_parameters();
488
empty_reply();
489
break
;
490
case
'E'
:
// extended parameters - ignore for now
491
fill(5);
492
empty_reply();
493
break
;
494
495
case
'P'
:
496
start_pmode();
497
empty_reply();
498
break
;
499
case
'U'
:
// set address (word)
500
here = getch();
501
here += 256 * getch();
502
empty_reply();
503
break
;
504
505
case
0x60:
//STK_PROG_FLASH
506
low = getch();
507
high = getch();
508
empty_reply();
509
break
;
510
case
0x61:
//STK_PROG_DATA
511
data = getch();
512
empty_reply();
513
break
;
514
515
case
0x64:
//STK_PROG_PAGE
516
program_page();
517
break
;
518
519
case
0x74:
//STK_READ_PAGE 't'
520
read_page();
521
break
;
522
523
case
'V'
:
//0x56
524
universal();
525
break
;
526
case
'Q'
:
//0x51
527
error=0;
528
end_pmode();
529
empty_reply();
530
break
;
531
532
case
0x75:
//STK_READ_SIGN 'u'
533
read_signature();
534
break
;
535
536
// expecting a command, not CRC_EOP
537
// this is how we can get back in sync
538
case
CRC_EOP:
539
error++;
540
Serial
.print((
char
) STK_NOSYNC);
541
break
;
542
543
// anything else we will return STK_UNKNOWN
544
default
:
545
error++;
546
if
(CRC_EOP == getch())
547
Serial
.print((
char
)STK_UNKNOWN);
548
else
549
Serial
.print((
char
)STK_NOSYNC);
550
}
551
}
4.Ставлю назад конденсатор(GND->Reset). Ставлю плату:Attine13 9.6 (пробовал на 1.2 и 4.8), программатор:Arduino as ISP. Загружаю стандартную прогу blink.
01
/*
02
Blink
03
Turns on an LED on for one second, then off for one second, repeatedly.
04
05
This example code is in the public domain.
06
*/
07
08
// Pin 13 has an LED connected on most Arduino boards.
09
// give it a name:
10
int
led = 4;
11
12
// the setup routine runs once when you press reset:
13
void
setup
() {
14
// initialize the digital pin as an output.
15
pinMode(led, OUTPUT);
16
}
17
18
// the loop routine runs over and over again forever:
19
void
loop
() {
20
digitalWrite(led, HIGH);
// turn the LED on (HIGH is the voltage level)
21
delay(1000);
// wait for a second
22
digitalWrite(led, LOW);
// turn the LED off by making the voltage LOW
23
delay(1000);
// wait for a second
24
}
Далее жму загрузить с помощью программатора(пробовал и просто загрузить) и получаю:
1
avrdude: please define PAGEL and BS2 signals
in
the configuration file
for
part ATtiny13
2
avrdude: stk500_program_enable(): protocol error, expect=0x14, resp=0x50
3
avrdude: initialization failed, rc=-1
4
Double check connections and
try
again, or use -F to
override
5
this
check.
6
7
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
Первая ошибки я так понимаю бывает т.к. платы иногда присылают нули т.е. впринципе это можно пережить. А вот насчет второй я так понял, что бывает когда плата мертва...Может кто-то подскажет что я делаю не так? Заранее спасибо.
П.С. С ардуиной играюсь 3 день, воэтому просьба сильно не ругать если где-то допустил детский ляп. Форум вроде почитал и решение пока не нашел.
https://www.youtube.com/watch?v=MS5i7fnlPBM
Интересно, теперь останутся вопросы?
Они остаются всегда :)
3. Далее снимаю конденсатор 10uF (тот, что от GRN в RESET Arduino UNO). Ставлю плату:Arduino UNO програматор:AVRisp mkII(тут я не очень понял, что надо сразу ставить Arduino as ISP или на AVRisp mkII, но пробовал и так и так.). Открываю из примера: ArduinoISP. Тут вроде все нормально. По очереди пробегают все светодиоды и остается гореть зеленый.
При загрузке скетча в дуину ArduinoISP программатор должен быть AVRisp mkII, уже после того как зашился ArduinoISP меняем тип программатора на Arduino as ISP и прошиваем тини при помощи кнопки "Прошить с помощью программатора".
Потом если захочется прошивать дуину не забывайте изменять тип программатора назад на AVRisp mkII.
PS Лично я обхожусь без конденсаторов земля-ресет на дуине.
всё таки удобнее всего шить с помошью этого ...
http://www.ebay.com/itm/USBASP-USBISP-AVR-Programmer-Adapter-10-Pin-Cabl...
Согласен, это уже более серьёзный уровень.
Эти китайские usbasp - как карта ляжет, лежит такой, работать отказывается, плюнул, собрал сам.
свой вариант печатки могу дать если надо.
//
Возвращаясь к attiny, - библиотека pwm.h тут не подойдет, как сделать шим, с частотой которую можно задавать в setup, на PB1 и duty cycle 0-255? Частоты нужны 15-100kHz.
Нашел раз, два... и совсем запутался.
Его просто надо перешить
... как сделать шим, с частотой которую можно задавать в setup, на PB1 и duty cycle 0-255? Частоты нужны 15-100kHz.
Нашел раз, два... и совсем запутался.
Вот так попробуйте:
int
led = 0;
// the pin that the LED is attached to
int
brightness = 0;
// how bright the LED is
int
fadeAmount = 1;
// how many points to fade the LED by
// the setup routine runs once when you press reset:
void
setup
() {
/*
Setting Divisor Frequency PWM on 9.6, 4.8, 1.2 MHz CPU
0x01 divisor is 1 37500, 18750, 4687 Hz
0x02 divisor is 8 4687, 2344, 586 Hz
0x03 divisor is 64 586, 293, 73 Hz
0x04 divisor is 256 146, 73, 18 Hz
0x05 divisor is 1024 36, 17, 5 Hz
*/
TCCR0B = TCCR0B & 0b11111000 | 0x05;
// 0x05 divisor is 1024 36, 17, 5 Hz
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void
loop
() {
// set the brightness of pin 9:
analogWrite(led, brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if
(brightness == 0 || brightness == 255) {
fadeAmount = -fadeAmount ;
}
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
Где-то увидел, но еще не проверял работает или нет.
А протеусе вроде как работает.