Jump to content
psinetron

ATTiny13 Проблема с blink

Recommended Posts

Здравствуйте. Решил попробовать в деле ATTiny13. Решил начать с самого простого - поморгать светодиодами. ОК, запустил platformIO, скопировал пример - вроде все работает. Светодиод моргает. Но. как только решил поменять значение _delay_ms, то понял, что что-то пошло не так.

Дело в том, что светодиод моргает вообще игнорируя этот самый delay. Не важно сколько бы ms задержки я там не выставил - получается эпилептическое моргание. 

Прошиваю через Arduino Uno. AtTiny опробовал пару разных - на второй микрухе тот же самый эффект. Причем если не прописывать включать светодиод - он не горит. Примеры пробовал разные, эффект везде один. Уже и не знаю на что думать

Пример моего кода:
 

#define F_CPU 120000UL // Указываем тактовую частоту МК
#define LED PB2         // Используем светодиод, подключенный к PB2 (7 пин)
#include <avr/io.h>     // Подключаем определения ввода/вывода
#include <util/delay.h> // Подключаем библиотеку функций задержки

int main(void)
{
  // Светодиод
  DDRB |= (1<<LED);     // конфигурируем пин как выход

while (1) {
  PORTB |= (1<<LED);
  _delay_us(1000L);
  PORTB &= ~(1<<LED);
  _delay_ms(10000L);
} 
}

 

На всякий случай конфигурация platformIo:


[env:attiny13a]
platform = atmelavr
board = attiny13

; change microcontroller
board_build.mcu = attiny13

; change MCU frequency
board_build.f_cpu = 1200000L

upload_protocol = stk500v1
; each flag in a new line
upload_flags =
    -P$UPLOAD_PORT
    -b$UPLOAD_SPEED

; edit these lines
upload_port = COM3
upload_speed = 19200

 

Share this post


Link to post
Share on other sites

Попробую добавить ясности. В онлайн эмуляторе от Tinkercad все работает без проблем. У меня складывается впечатление, что МК перезагружается где-то в этом моменте:

DDRB |= (1<<LED);

потому что при вставке _delay_ms в в начало цикла - лампочка все-равно загорается сразу же после подачи питания на МК. Ресет пробовал на "+" выводить - без изменений.
Светодиод ставил без резистора, но и напряжение подавал 3.3V, думал может 5V слишком много на ногу, но нет. Результат тот же :( 
 

Share this post


Link to post
Share on other sites
1 час назад, psinetron сказал:

Светодиод ставил без резистора

С большой вероятностью этот порт уже сгорел.


Я не раздаю рыбу. Я раздаю удочки.

ПРОСТОТА - ХУЖЕ ВОРОВСТВА!!!

Share this post


Link to post
Share on other sites

Металл-композит как альтернатива ферриту: дроссели Panasonic семейства ETQP

Современные электронные устройства требуют все более компактных и эффективных компонентов. Новые металл-композитные дроссели обладают рядом преимуществ перед дросселями с ферритовым сердечником. Они не имеют ярко выраженного насыщения, обладают отличными частотными свойствами и способны работать при температурах до 150°C и выше. Все это делает их альтернативой стандартным дросселям с ферритовым сердечником в широком спектре автомобильных и промышленных приложений.

Подробнее

_delay_us(1000L);

...

 _delay_ms(10000L);

микро и милли. Верно?

Чтобы спалить порт, это постараться нужно.

15 часов назад, psinetron сказал:

поменять значение _delay_ms

Вообще говоря, условий много. От "а компилировала ли ты код, Дездемона?" до "проверь фьюзы".


Я не раздаю удочки. Я продаю рыбу.

Share this post


Link to post
Share on other sites
Цитата

Вообще говоря, условий много. От "а компилировала ли ты код, Дездемона?" до "проверь фьюзы".

По поводу компиляции - код проверял на ардуине - все замечательно. Писал код для Digispark с tiny85 - тоже никаких проблем не испытывал. Мне почему-то казалось что с tiny13a никаких проблем не должно было быть. Делал обычный blink с сайтов, коих полно, практически везде примеры одинаковые. Что уж тут говорить - брал пример с морганием светодиода прямо с Arduino IDE. Код превосходно заливается, никаких сообщений об ошибках, все  SUCCESS. Если не прописывать PORTB &= ~(1<<LED);, то и светодиод молчит, т.е. что-то там точно скомпилировано.
По поводу фьюзов - вот тут возможно что-то не так. Но, я их специально и не менял. Просто взял МК подключил к ардуине, залил через нее вышеуказанный. По идее фьюзы все заводские. Правда тиньки заказал с алиэкспресса, может и там чего-то напутано. На вскидку - что может быть не так с фьюзами?

Цитата

микро и милли. Верно?

Пробовал и то и то. Так для успокоения души. Эффекта нет. 

Цитата

С большой вероятностью этот порт уже сгорел.

В таком случае он бы не моргал? Неужели порт так легко спалить?

На всякий случай добавлю, что тини у меня в корпусе SOIC. Использую через DIP переходник. Раз на эмуляторе работает, то в коде я думаю проблем нет. Да и слишком он простой, чтобы в нем ошибиться. 
Может какую-то обвязку нужно дополнительно?

Share this post


Link to post
Share on other sites
                     

Новые литиевые ХИТы Fanso работают даже при +150ºС!

Когда приходится учитывать работу в экстремальных условиях, к выбору электронных компонентов подходишь с особой тщательностью. Высокие температуры, большие перепады давления, труднодоступность – все это требует специальной продукции. Склад КОМПЭЛ пополнился новыми литиевыми ХИТами Fanso, стабильно работающими даже при температуре до 150 ºС. Батарейки имеют номинальное напряжение 3,6 В, обладают ёмкостью от 700 до 14000 мАч, работоспособны в широком температурном диапазоне -20…150ºС и имеют низкий саморазряд (не более 3% в год в нормальных условиях хранения).

Подробнее о высокотемпературной линейке

5 минут назад, Геннадий сказал:

Частота CPU - 120кГц, а в реальности - 1,2МГц?

Заявлено китайцами как ATTiny13A-ssu. На сколько я знаю она по умолчанию на 1,2Мгц. Если я правильно понимаю код, то для библиотеки delay мы указываем частоту вот в этом месте:
 

#define F_CPU 120000UL

В настройках при прошивке так же выбираю частоту 1,2Мгц. что через Arduino IDE, что через PlatformIO. 

Я так же пробовал ставить задержку в 10 секунд (_delay_ms(10000L)) Если бы частота была указана неправильно, то наверное все-равно была бы какая-то разница в морганиях? Или я не прав и нужно подбирать частоту? Осциллографа у меня к сожалению нет, точно узнать частоту я не смогу, если она не 1,2
Вы меня озадачили =)

Share this post


Link to post
Share on other sites
20 минут назад, psinetron сказал:

точно узнать частоту я не смогу, если она не 1,2

Это элементарно - запрограммируйте  генератор на 1Гц .

И все-таки поставьте резистор на светодиод и отключите во фьюзах  контроль  питания . 

Edited by colorad

Share this post


Link to post
Share on other sites
15 минут назад, colorad сказал:

И все-таки поставьте резистор на светодиод и отключите во фьюзах  контроль  питания . 

Понял. попробую, по результатам отпишусь.
 

Share this post


Link to post
Share on other sites
1 час назад, psinetron сказал:

На сколько я знаю она по умолчанию на 1,2Мгц. Если я правильно понимаю код, то для библиотеки delay мы указываем частоту вот в этом месте:
 


#define F_CPU 120000UL

В настройках при прошивке так же выбираю частоту 1,2Мгц. что через Arduino IDE, что через PlatformIO. 

Так зачем Вы указываете частоту 120кГц (посчитайте нули)? Я Вам про этот параметр и намекал.

Share this post


Link to post
Share on other sites

Тактовая частота указывается полностью в герцах. 16000000UL. В скобках delay указываете число как есть.

_delay_ms (1000);

 Если не знаете что делать, не делайте сразу что попало. Хоть немного думайте.

Там микросекунды, а там миллисекунды.

Не помню как у тини13 с ватчдогом. Фьюзами или программно. Если фьюзами, и в программе нет настройки ватчдога, он по умолчанию работает на 16 мс. Если он полностью программный, тогда отбой.

Вообще, не читая книг по архитектуре сразу бросаться с голой пяткой на саблю верх глупости... 

Edited by demiurg1978

Share this post


Link to post
Share on other sites

я вот не пойму неужели с такой ошибкой код компильнулся. не авр студия не код вижен себе такого не позволит. или вы не вкурсе компилируется проэкт или нет)? не пишите не каких букв в делей. а также есть ограничение и нельзя поставить в одном делее огромное число если чесно не помню максимум ибо большие задержки так не кто не делает) но это так на будущее. 

Share this post


Link to post
Share on other sites

 

10.01.2020 в 17:13, Геннадий сказал:

Так зачем Вы указываете частоту 120кГц (посчитайте нули)? Я Вам про этот параметр и намекал.

Да, спасибо, на это я позже обратил внимание. На самом деле в коде изначально правильно написано было. Это уже опечатка.

В общем, как обещал - отвечаю после того, как во всем разобрался. Во первых сразу опробовал подключать светодиоды через резисторы. Эффекта никакого, только диод светит тускнее. ПРичем опробовал даже на ранее неиспользованных тиньках, так что сожжение порта исключено.
Так же вообще избавился от _delay_ms и понял. что МК перезагружается как только идет открытие порта. Т.е. моргание связано не с delay, а скорее всего связано с перезагрузкой тиньки :(

Дальше я просто психанул и заехал в чип и дип и взял там две attiny13a, одну в DIP, другую в SOIC корпусе. И как и ожидалось - обе тиньки сразу же завелись и работают правильно. Вот теперь вопрос, Либо у меня все пять китайских тинек бракованные, либо я с ними что-то делаю не так.
Судя по отзывам к товару у китацйцев - пишут, что тиньку нужно полностью перепрошить и сбросить фьюзы. Пока не понял как перепрошить через программатор на ардуинке, но надеюсь это поможет.

Всем, кто отвечал по делу большое спасибо!

 

 

Теперь отвечу на сообщения не по делу:

20 часов назад, demiurg1978 сказал:

Тактовая частота указывается полностью в герцах. 16000000UL. В скобках delay указываете число как есть.

_delay_ms (1000);

 Если не знаете что делать, не делайте сразу что попало. Хоть немного думайте.

Уважаемый, я знаю чем отличается ms от us. Если вы прочтете все сообщения в этой ветке, то увидите, что я писал, что пробовал оба варианта.

19 часов назад, Bass85 сказал:

я вот не пойму неужели с такой ошибкой код компильнулся. не авр студия не код вижен себе такого не позволит. или вы не вкурсе компилируется проэкт или нет)? не пишите не каких букв в делей. а также есть ограничение и нельзя поставить в одном делее огромное число если чесно не помню максимум ибо большие задержки так не кто не делает) но это так на будущее. 

Вам на будущее тоже хотел бы намекнуть, что кода я в своей жизни написал прорву и без компилятора понимаю какой код соберется, а какой нет. В случае  с буквой L, которая вас вдруг смутила - она относится к типизации данных и указывает, что число является Long double а не Int. И AvrStudio и VS studio с platform IO и Arduino IDE прекрасно обрабатывают этот код. Ах, да, на купленых в чипе тиньках код тоже работает.
 

Edited by psinetron

Share this post


Link to post
Share on other sites

тоесть вы хотите сказать что чип частично выполняет код) вы сами в это верите?) ему что облом повисеть в делей?))) 

у вас какаято проблема с делей.  это или тактовая не верно или в чипе тактирование не то выбрано. либо в функции чтото поменяли но это врядли.  возмите без делей промто на порт 1 зашейте посмотрите либо сделайте цыкл вместо делея. 

Share this post


Link to post
Share on other sites

Самое грустное, нынешние начинающие не читают книги по архитектуре. Они берут и делают. А потом бегут на форумы плакаться. Я начал так: купил несколько книг. STK-500. И с нуля на ассемблере начал сам. На форумы потом пошёл, когда начались вопросы касающиеся именно приёмов программирования. Алгоритмы и так далее. Изредка были непонятки по внутрянкам.

А ардуина и вовсе сломало изучение архитектуры МК. На куа? Есть абдурина, есть иде. Есть кубики. Ляпай не хачю. 

Share this post


Link to post
Share on other sites
10 часов назад, Bass85 сказал:

тоесть вы хотите сказать что чип частично выполняет код) вы сами в это верите?) ему что облом повисеть в делей?)))

Именно. Кроме того, если совсем убрать делеи и просто открыть порт для того чтобы светодиод постоянно горел - будет то же самое моргание. Делеи тут не причем.

 

Перепрошил китайские тиньки. 4 из 5 заработали нормально.

 

 

 

Share this post


Link to post
Share on other sites
4 минуты назад, demiurg1978 сказал:

Я уже писал об этом.

простите, не читал вообще тему) увидел только последние сообщения про BOD и ваше про ардуино и куб с которым был согласен)) 

Share this post


Link to post
Share on other sites

Ресетится из-за перегрузки по току. Поставьте последовательно со светодиодом резистор 330 Ом и всё заработает нормально.


Пока ты жив, надежда есть.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • Guest vit2700
      By Guest vit2700
      Доброго дня всем гуру  программирования в BASCOM AVR !  В программировании я также как и в космической отрасли ... Увлекаюсь рыбалкой, использую электронные сигнализаторы поклевки (китайские). У меня их с приказавшим долго жить микроконтроллером уже больше десятка. Появилась идея , в корпуса изготовить свою плату на МК attiny13, соответственно без полного набора функций как у оригинала. Здесь на сайте нашел  статью "Музыкальный звонок на МК Attiny13". В готовую схему в колхозил светодиод. По факту кнопку планирую заменить на геркон. 
       Не могу разобраться как сделать чтоб при нажатии  кнопки, контролер выполнил программу один раз и остановил цикл даже с нажатой кнопкой(это тот случай когда магнит на ролике остановился возле геркон и замкнул контакт ) ? Отпустил,нажал еще раз  все повторилось.
      Есть вторая проблема, во время цикла контролер  не реагирует на кнопку .Как сделать чтоб при повторном нажатии происходил сброс программы (уже действующего цикла) и запускалась новая программа (цикл)? 
      $regfile = "attiny13.dat"
      $crystal = 1200000
      $hwstack = 16
      $swstack = 16
      $framesize = 16
      $noramclear
      Config PINB.1 = Input
      Config PORTB.2 = Output
      Toch Alias PINB.1
      Led Alias PORTB.2
      Config INT0 = Low Level
      On INT0 Button:
      Enable Interrupts
      Enable INT0
      Declare Sub Melodi1()
      Dim Melcount As Byte
      Do
      Powerdown
      Loop
      End
      Sub Melodi1()
      Do
      Sound , PORTB.0 , 30 , 100
      Waitms 10
      Sound , PORTB.0 , 30 , 150
      Waitms 10
      Melcount = Melcount + 1
      Loop Until Melcount = 5
      Melcount = 0
      if Toch = 1 Then Led = 0
      if Toch = 0 Then Led = 1
      Led = 1
      Waitms 200
      Led = 0
      Waitms 200
      Led = 1
      Waitms 200
      Led = 0
      Waitms 200
      Led = 1
      Waitms 200
      Led = 0
      Waitms 200
      Led = 1
      Waitms 200
      Led = 0
      Waitms 200
      Led = 1
      Waitms 200
      Led = 0
      Waitms 200
      End Sub
      Button:
      Call Melodi1()
      GIFR = 64
      Return
      Спасибо всем кто откликнется! Буду рад любой помощи.
       

      ver 1.1.0.bas
    • By Сергей Фомин
      Изучаю прерывания на attiny13. Пока остановился на прерываниях по переполнению. Сделал тестовый код в Atmel Studio и сразу через программатор заливаю на тиньку со светодиодом. Проблема в том что гореть он должен 10 секунд и выключаться, а горит примерно 20-23 секунды. Прошу помощи в правильном расчёте. Код ниже (пока учусь сильно не ругайтесь) :
      #define F_CPU 1000000 #define LED PB2 #include <avr/io.h> //#include <util/delay.h> #include <avr/interrupt.h> unsigned char work_time =384;    //  1000000/1024/256=3.8  (0.026 сек)    10/0.026=384 volatile unsigned char temp =0; ISR (TIM0_OVF_vect) {      TCNT0=0x00;     temp ++;     if (temp>=work_time)     {         PORTB &=~(1<<LED);  //Инвертируем состояние         TCCR0B=0x00    // остановка таймера         cli (); //общее запрещение прерываний     } } int main (void) {     init();               while (1)     {              } } void init () {          DDRB |= (1<<LED); // выход     PORTB =(1<<LED); //включен     TCCR0B =0x05; // установка делителя на 1024     TIMSK0 |= _BV(TOIE0);     sei();   // Либо SREG |= (1<<SREG_I); //Разрешаем прерывания глобально     TCNT0 = 0X00;        //Обнулить счётный регистр }  
    • By mal333
      Всем привет.
      Есть задачка на 2 пина контроллера посадить 4 кнопки и распознавать их состояние, а так же состояние "ни одна не нажата". Есть схемы подключения их в матрицу R2R и последующее аналоговое измерение, но я почему-то думаю, что можно считывать и чисто цифровым методом. Пораскинув мозгами, получилась эта схема.В ней опрос будет такой- сначала читаем состояние выводов, потом переключаем пины попеременно в 1 и смотрим состояние другого вывода. Может есть схемы проще, но вот что-то не нашел.

    • By Юра Махович
      Доброго времени суток!
      Друг попросил сделать эму некий аппарат: пищалку, которая издает звук с определенным периодом.
      Пример работы: сигнал 2 секунды, тишина 1 минуту, потом опять по новой.

      Так вот, программу написал, и вроде как даже работает, но как-то не стабильно..
      Иногда пропустит один цикл, иногда (почти всегда) после нескольких минут вообще перестает работать.
      Использую сон ради экономии батареи, т.к. устройство автономно.
      Генерирую ШИМ на ноге PB0. переключатели подсоединены к PB3 PB4.
      Прошу помогите найти ошибку, а то я уже не знаю что тут не так..
    • By авмаппипв апиаи
      Доброго времени суток! Имеется такая схема для управления яркостью светодиода и стабилизации по току  , схемы не мои а содраны из разных источников, я их соединил. Прошу мне помочь из проверкой схемы может где что то подправить , доработать в общем помогите мне в этом деле! Питать буду от 18650 через плату заряда с защитой от розряда .  

  • Сообщения

    • Предпраздничная цена )))600+пересыл.
    • Не только эта причина, есть и другая - отечественные мастерские еще с прошлого века прославились кидаловом. Поэтому Витюше верят больше.  Опять же, если Витюша и кинет, то ему, в отличие от мастерской, можно запросто морду набить.   
    • @malenich , это для вас рашка, а для меня Россия. Это моя Родина, я гражданин этой страны и проживаю в ней с рождения. И меня, как гражданина России, волнуют в первую очередь наши российские проблемы, по крайней мере гораздо больше внутриукраинских, особенно таких, которые характерны для многих стран, включая и мою. Поведение наших пропагандистских СМИ понятно - им за это бешеные бабки платят, но Вы-то  на кой ляд тащите сюда их пропаганду? Кто Вас до детей допустил, у Вас же начисто отключено критической мышление! Чему Вы их научите? Кричать хайль?   @Pont 007 , протесты против размещения с подозрением на заражение понятны, но вот официальный запрет на въезд в страну  граждан страны пахнет совсем по другому: Россия прекратит пропуск граждан Китая через свою границу с нуля часов 20 февраля по местному времени — распоряжение об этом накануне подписал премьер Михаил Мишустин.
    • Так, может, цехового электрика в помощь пригласить? Он расскажет, что есть такие штуки - автоматические выключатели. А то, может, и схема у него есть, давно уже восстановленная. Ибо, судя по всему, ОГЭ и ОГМ на предприятии работают и документация на действующее оборудования должна быть.
    • Почему надо его жалеть если сами разрабы его не жалеют. Модератор мог бы и отредактировать.
    • В некоторых коллективах, обычно, с большим процентом условно одиноких баб или гуманитариев, мужик, умеющий держать в руках не только гранёный стакан, автоматически получает статус мастера на все руки и ему начинают тащить всякое, от чайника до ноутбука, ибо "в мастерской больна дорохо, а Витюша молодец".
×
×
  • Create New...