Помогите пофиксить баги

Обсуждаем контроллеры компании Atmel.
Ответить
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

Пишу под attiny2313 в atmel studio. К мк подключен кварц на 10 мгц. Рассчитал прерывания таймера каждую секунду, но почему то прерывание происходит каждые 10 секунд.
Точность хода очень плохая, за 30 минут натикало 36 минут. Понять в чем дело не могу.
(в коде используется header файл, для удобства)
Вложения
mlib.h
(1.87 КБ) 229 скачиваний
main.cpp
(1.25 КБ) 214 скачиваний
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Расширение исходника должно быть .c, а не .cpp - никакими С++ в вашем коде и не пахнет), не читает правила построения проектов в студии... :facepalm:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

/* Обращает все порты в 0 */
void clear()
{
PORTB = PORTB >> 8 << 8;
PORTD = PORTD >> 2 << 2;
}
Весьма оригинальный способ обнуления портов. А что помешало сделать по-человечески?
void show(int n, int m, int N)
{
if(m == 1)
{
PORTD = 0b00000001;
if (n == 0)PORTB = 0b11100111;
if (n == 1)PORTB = 0b10000100;
if (n == 2)PORTB = 0b11010011;
if (n == 3)PORTB = 0b11010110;
if (n == 4)PORTB = 0b10110100;
if (n == 5)PORTB = 0b01110110;
if (n == 6)PORTB = 0b01110111;
if (n == 7)PORTB = 0b11000100;
if (n == 8)PORTB = 0b11110111;
if (n == 9)PORTB = 0b11110110;
}
Аналогично. Как вы думаете сколько времени пройдет от входа в процедуру до выполнения кода m=2; n=9? Ну и использование магических чисел плохая идея.
_delay_ms(-.55);
А чего вы хотели добиться задавая отрицательную задержку, путешествия во времени?
TCCR1B = 0b00000100;
GIMSK = 0b11000000;
MCUCR = 0b00001111;
Что мешало оформить по-человечески? Думаете нам доставляет неимоверное удовольствие искать в даташите что же вы хотели сказать своим магическим числом? Ни биты не поименованы, ни даже комментариев.
ISR(TIMER1_OVF_vect)
{
TCNT1 = 26473;
ATTiny2313 поддерживает режим CTC, почему вы им не воспользовались? Выставлять задержку вручную можно на ассемблере, хотя и там любое прерывание собьет счет, но на Си это и вовсе бред.
#include "mlib.h"
#define F_CPU 1000000UL
логика подсказывает, что компилятор должен ругаться на необъявленную частоту. Вообще, выставлять ее внутри кода - плохая идея. Тем более что указано 1 МГц, а не 10 МГц и не 10 миллигерц, как написано у вас (и где такой кварц нашли?). Учитывая, что ошибка гораздо меньше чем в 10 раз, вы используете встроенный RC-генератор. И после этого удивляетесь такой точности.

Алгоритмические решения и форматирование вызывает ужас. Единственное в форматировании что ужаса не вызывает - отступы.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

Путаница с расширением файлов возникла из-за того что по привычке создал с++ проект. А чем по вашему пахнет с++ код?
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

Спойлер
COKPOWEHEU писал(а):
/* Обращает все порты в 0 */
void clear()
{
PORTB = PORTB >> 8 << 8;
PORTD = PORTD >> 2 << 2;
}
Весьма оригинальный способ обнуления портов. А что помешало сделать по-человечески?
void show(int n, int m, int N)
{
if(m == 1)
{
PORTD = 0b00000001;
if (n == 0)PORTB = 0b11100111;
if (n == 1)PORTB = 0b10000100;
if (n == 2)PORTB = 0b11010011;
if (n == 3)PORTB = 0b11010110;
if (n == 4)PORTB = 0b10110100;
if (n == 5)PORTB = 0b01110110;
if (n == 6)PORTB = 0b01110111;
if (n == 7)PORTB = 0b11000100;
if (n == 8)PORTB = 0b11110111;
if (n == 9)PORTB = 0b11110110;
}
Аналогично. Как вы думаете сколько времени пройдет от входа в процедуру до выполнения кода m=2; n=9? Ну и использование магических чисел плохая идея.
_delay_ms(-.55);
А чего вы хотели добиться задавая отрицательную задержку, путешествия во времени?
TCCR1B = 0b00000100;
GIMSK = 0b11000000;
MCUCR = 0b00001111;
Что мешало оформить по-человечески? Думаете нам доставляет неимоверное удовольствие искать в даташите что же вы хотели сказать своим магическим числом? Ни биты не поименованы, ни даже комментариев.
ISR(TIMER1_OVF_vect)
{
TCNT1 = 26473;
ATTiny2313 поддерживает режим CTC, почему вы им не воспользовались? Выставлять задержку вручную можно на ассемблере, хотя и там любое прерывание собьет счет, но на Си это и вовсе бред.
#include "mlib.h"
#define F_CPU 1000000UL
логика подсказывает, что компилятор должен ругаться на необъявленную частоту. Вообще, выставлять ее внутри кода - плохая идея. Тем более что указано 1 МГц, а не 10 МГц и не 10 миллигерц, как написано у вас (и где такой кварц нашли?). Учитывая, что ошибка гораздо меньше чем в 10 раз, вы используете встроенный RC-генератор. И после этого удивляетесь такой точности.
Думал помочь... передумал. :dont_know:
Вот с этим согласен. Алгоритмические решения и форматирование вызывает ужас. Единственное в форматировании что ужаса не вызывает - отступы.
А какая разница как обнулять восьмибитный тип
В с++ нет процедур(это вам не паскаль), только функции. А время выполнения будет очень мало
Отрицательная задержка это опечатка, очень странно что с ней компилилось
Я только начал под МК кодить, про CTCне знал, а вот с частотой я и в правду накосячил
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Прошу вас пояснить мне некоторые туманные вопросы:
daaar писал(а):А какая разница как обнулять восьмибитный тип
на самом деле нет разницы между

Код: Выделить всё

PORTB=0; 
PORTB ^= PORTB; 
PORTB = PORTB - PORTB; 
PORTB <<= 9;
?
заодно: PORTB какой тип Си имеет?
daaar писал(а):В с++ нет процедур(это вам не паскаль), только функции
а в чем разница между процедурой и функцией? отличается ли

Код: Выделить всё

void proc(int i);
от

Код: Выделить всё

procedure proc(i : integer);
? если отличается, то чем именно?
daaar писал(а):Отрицательная задержка это опечатка, очень странно что с ней компилилось
неужели программист не понимает, почему компилилось?! я вот, дилетант, понимаю... но, конечно же, гуру поучать не смею.
daaar писал(а):Я только начал под МК кодить
а можно посмотреть на исходники того, чем вы раньше занимались? хотя бы отдельные куски? Просто любопытно посмотреть, как настоящие программисты пишут...

еще вопросы, которые вами не затрагивались, но, как настоящий программист, вы наверняка сможете просветить дилетанта:
- что такое "магические числа" и как к ним относятся настоящие программисты?
- какой макрос лучше применить и почему:
#define set_and_clear(x) PORTB |= x; PORTC &= ~x;
или
#define set_and_clear(x) do { PORTB |= (x); PORTC &= ~(x); } while(0)
- какое значение примет переменная var:

Код: Выделить всё

float var =  250 / 15;
daaar писал(а):А чем по вашему пахнет с++ код
как по моему дилетантскому мнению, так С++ пахнет ООП, т.е. классами и их экземплярами. ну а вообще, AVR-GCC по-разному обрабатывает исходники .c и .cpp - настолько по-разному, что могут быть на ровном месте ошибки компиляции. ну вам-то об этом известно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

Я так понимаю вы не имеете четкого понимания о программировании.
Процедура ничего не возвращает
Там была не совсем отрицательная задержка, там была -.55, если бы компилятор считал польской записью, то он бы крашнулся
нету разницы в компиляции с-кода в g++ или gcс
вы кроме классов ничего не знаете? А как же потоки, перегрузка операторов, ссылки?
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

daaar писал(а):Я так понимаю вы не имеете четкого понимания о программировании
допустим, это так и есть.
daaar писал(а):Процедура ничего не возвращает
что возвращает void func(void); ?
daaar писал(а):Там была не совсем отрицательная задержка, там была -.55
понятно, теперь я знаю, что -0.55 это не совсем отрицательное число. надеюсь хоть -1.5 - это уже совсем отрицательное?
daaar писал(а):нету разницы в компиляции с-кода в g++ или gcс
сочувствую
daaar писал(а):вы кроме классов ничего не знаете? А как же потоки, перегрузка операторов, ссылки?
да я и классов-то не кончал, если церковно-приходскую школу не считать... куда мне-то...

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

Мой уютный бложик... заходите!
Контактная информация:
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

Код: Выделить всё

ISR(INT1_vect)
{
	sei();
:tea:
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

зараза к заразе не пристанет :)))

обидно, что все только хвастаются, а на вопросы ответить никто не хочет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

заодно: PORTB какой тип Си имеет?
Вот это кстати интересный вопрос, потому что объявлен он страшно - значение указателя на фиксированный адрес, да еще с макропреобразованиями. И мне тоже интересна версия гуру-программиста.
а в чем разница между процедурой и функцией?
В терминологии. С одной стороны, теоретически, функция Си всегда возвращает хотя бы void (пофиг что там ничего нет), тогда процедур там нет. С другой, практически, возвращаемое значение нигде не используется и не учитывается даже в самых недрах контроллера, тогда можно считать процедурой. С третьей стороны, психологически, излишне строгая терминология может мешать и тогда ее стоит ограничить, тогда назвать процедуру функцией или наоборот не будет серьезной ошибкой.
- какой макрос лучше применить и почему:
Из этих двух я бы применил хотя бы {PORTB &=~x;} потому что первый оператор там бесполезен :-)
вы кроме классов ничего не знаете? А как же потоки, перегрузка операторов, ссылки?
В контроллерах этим не пользуются, а разговор именно про них. Вот классами и шаблонами пользоваться можно, если знать как.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

COKPOWEHEU писал(а):хотя бы {PORTB &=~x;}
в моём вопросе такого нет :)))
но в целом я спрашивал не вас, уж простите меня, дилетанта :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

А это и не ответы на ваши вопросы!
в моём вопросе такого нет :)))
Я имел в виду вместо предложенных вариантов, поскольку делает тоже самое на 1-3 такта (в 2 раза) быстрее.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

daaar писал(а):Там была не совсем отрицательная задержка, там была -.55,
Чуть-чуть беременная.
daaar писал(а):Я так понимаю вы не имеете четкого понимания о программировании.
Процедура ничего не возвращает
Вот же млять, я ей денег одолжил.

-----------

daaar, напишите функцию, процедуру и метод на ассемблере, "Ты ж программист, тебе ничё не стоит", и найдите 15 отличий. Опишите хотя бы одно, ну так, для нас, служителей прихода.

----------------
З.Ы. Если бы Вы засунули своего Наполеона глубоко в Эльбу, Вам бы помогли с удовольствием. Вы не поверите, но этот "гад" ARV затратил свое время и помог многим. На счет чуть-чуть отрицательного, попробуйте посмотреть чему будет равно unsigned int i=-1;. Минус 1 тоже не очень отрицательное, почти 0. Конечно если Вы сможете перешагнуть, через "я программист", ни или покиньте этот форум, куда ж нам до Вас.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

Z_h_e писал(а):З.Ы. Если бы Вы засунули своего Наполеона глубоко в Эльбу, Вам бы помогли с удовольствием. Вы не поверите, но этот "гад" ARV затратил свое время и помог многим.
Я задал вопрос конкретно описав проблему, а мне начали говорить, что в моем коде стилистические ошибки.
Z_h_e писал(а):На счет чуть-чуть отрицательного, попробуйте посмотреть чему будет равно unsigned int i=-1;. Минус 1 тоже не очень отрицательное, почти 0.
Вы действительно считаете что это смешно?
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Может вместо демагогии Вы ответите на все заданные Вам вопросы. Они заданы не просто так, ответьте на них и Вы решите свою задачу.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

daaar писал(а):Я программист и пишу достаточно сносный код,
Хотелось бы уточнить по коду.

Код: Выделить всё

ISR(INT1_vect)
{
	sei();
	_delay_ms(10);
....
}
В чем тайный смысл разрешать прерывания внутри обработчика прерывания? Ладно, это я ещё могу придумать.
Но, зачем в обработчике прерывания нужны ЗАДЕРЖКИ?!
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

mas123 писал(а):
daaar писал(а):Я программист и пишу достаточно сносный код,
Хотелось бы уточнить по коду.

Код: Выделить всё

ISR(INT1_vect)
{
	sei();
	_delay_ms(10);
....
}
В чем тайный смысл разрешать прерывания внутри обработчика прерывания? Ладно, это я ещё могу придумать.
Но, зачем в обработчике прерывания нужны ЗАДЕРЖКИ?!
Во время выполнения прерывания все другие прерывания ставятся в очередь, чтобы этого не происходило я разрешаю прерывания.
А задержка нужна для проверки кнопки еще раз

Код: Выделить всё

ISR(INT1_vect)
{
	sei();
	_delay_ms(10);
	if (PIND << 4 >> 7 == 1)
        {
         ...
        }
}
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Z_h_e писал(а):попробуйте посмотреть чему будет равно unsigned int i=-1;.
Справедливости ради, функция _delay_ms() принимает значение double а не unsigned int, так что присвоить отрицательное число возможно. Вот только ЗАЧЕМ???
В чем тайный смысл разрешать прерывания внутри обработчика прерывания? Ладно, это я ещё могу придумать.
Но, зачем в обработчике прерывания нужны ЗАДЕРЖКИ?!
У меня обратный вопрос. Ладно задержка - антидребезг (и изредка это может быть оправдано), но зачем разрешать прерывания? Чтобы во время антидребезга это же прерывание набилось в стеке еще десяток раз?
daaar, напишите функцию, процедуру и метод на ассемблере
Можно я? Можно я? :idea: :lol: Пара отличий все-таки будет.
Я задал вопрос конкретно описав проблему, а мне начали говорить, что в моем коде стилистические ошибки.
Честно вам сказать - у хорошего программиста не должно быть в коде таких ошибок оформления, на которые на форуме народ пальцем показывает. Здесь не серьезная IT-компания и не экзаменационная комиссия института, здесь на большинство недочетов оформления смотрят сквозь пальцы.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

COKPOWEHEU писал(а):Здесь не серьезная IT-компания и не экзаменационная комиссия института, здесь на большинство недочетов оформления смотрят сквозь пальцы.
А вы уверены? Тут то явно "сквозь пальцы" смотрят
Контактная информация:
Ответить

Вернуться в «AVR»