Страница 1 из 7

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

Добавлено: Чт июл 14, 2016 19:57:15
daaar
Пишу под attiny2313 в atmel studio. К мк подключен кварц на 10 мгц. Рассчитал прерывания таймера каждую секунду, но почему то прерывание происходит каждые 10 секунд.
Точность хода очень плохая, за 30 минут натикало 36 минут. Понять в чем дело не могу.
(в коде используется header файл, для удобства)

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

Добавлено: Чт июл 14, 2016 20:45:56
ARV
Расширение исходника должно быть .c, а не .cpp - никакими С++ в вашем коде и не пахнет), не читает правила построения проектов в студии... :facepalm:

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

Добавлено: Чт июл 14, 2016 20:52:44
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-генератор. И после этого удивляетесь такой точности.

Алгоритмические решения и форматирование вызывает ужас. Единственное в форматировании что ужаса не вызывает - отступы.

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

Добавлено: Пт июл 15, 2016 07:01:13
daaar
Путаница с расширением файлов возникла из-за того что по привычке создал с++ проект. А чем по вашему пахнет с++ код?

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

Добавлено: Пт июл 15, 2016 07:43:08
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не знал, а вот с частотой я и в правду накосячил

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

Добавлено: Пт июл 15, 2016 07:55:27
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 - настолько по-разному, что могут быть на ровном месте ошибки компиляции. ну вам-то об этом известно...

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

Добавлено: Пт июл 15, 2016 08:15:53
daaar
Я так понимаю вы не имеете четкого понимания о программировании.
Процедура ничего не возвращает
Там была не совсем отрицательная задержка, там была -.55, если бы компилятор считал польской записью, то он бы крашнулся
нету разницы в компиляции с-кода в g++ или gcс
вы кроме классов ничего не знаете? А как же потоки, перегрузка операторов, ссылки?

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

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

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

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

Добавлено: Пт июл 15, 2016 09:45:01
pcb

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

ISR(INT1_vect)
{
	sei();
:tea:

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

Добавлено: Пт июл 15, 2016 09:56:40
ARV
зараза к заразе не пристанет :)))

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

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

Добавлено: Пт июл 15, 2016 15:55:50
COKPOWEHEU
заодно: PORTB какой тип Си имеет?
Вот это кстати интересный вопрос, потому что объявлен он страшно - значение указателя на фиксированный адрес, да еще с макропреобразованиями. И мне тоже интересна версия гуру-программиста.
а в чем разница между процедурой и функцией?
В терминологии. С одной стороны, теоретически, функция Си всегда возвращает хотя бы void (пофиг что там ничего нет), тогда процедур там нет. С другой, практически, возвращаемое значение нигде не используется и не учитывается даже в самых недрах контроллера, тогда можно считать процедурой. С третьей стороны, психологически, излишне строгая терминология может мешать и тогда ее стоит ограничить, тогда назвать процедуру функцией или наоборот не будет серьезной ошибкой.
- какой макрос лучше применить и почему:
Из этих двух я бы применил хотя бы {PORTB &=~x;} потому что первый оператор там бесполезен :-)
вы кроме классов ничего не знаете? А как же потоки, перегрузка операторов, ссылки?
В контроллерах этим не пользуются, а разговор именно про них. Вот классами и шаблонами пользоваться можно, если знать как.

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

Добавлено: Пт июл 15, 2016 17:13:43
ARV
COKPOWEHEU писал(а):хотя бы {PORTB &=~x;}
в моём вопросе такого нет :)))
но в целом я спрашивал не вас, уж простите меня, дилетанта :)

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

Добавлено: Пт июл 15, 2016 17:25:42
COKPOWEHEU
А это и не ответы на ваши вопросы!
в моём вопросе такого нет :)))
Я имел в виду вместо предложенных вариантов, поскольку делает тоже самое на 1-3 такта (в 2 раза) быстрее.

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

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

-----------

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

----------------
З.Ы. Если бы Вы засунули своего Наполеона глубоко в Эльбу, Вам бы помогли с удовольствием. Вы не поверите, но этот "гад" ARV затратил свое время и помог многим. На счет чуть-чуть отрицательного, попробуйте посмотреть чему будет равно unsigned int i=-1;. Минус 1 тоже не очень отрицательное, почти 0. Конечно если Вы сможете перешагнуть, через "я программист", ни или покиньте этот форум, куда ж нам до Вас.

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

Добавлено: Пт июл 15, 2016 18:57:24
daaar
Z_h_e писал(а):З.Ы. Если бы Вы засунули своего Наполеона глубоко в Эльбу, Вам бы помогли с удовольствием. Вы не поверите, но этот "гад" ARV затратил свое время и помог многим.
Я задал вопрос конкретно описав проблему, а мне начали говорить, что в моем коде стилистические ошибки.
Z_h_e писал(а):На счет чуть-чуть отрицательного, попробуйте посмотреть чему будет равно unsigned int i=-1;. Минус 1 тоже не очень отрицательное, почти 0.
Вы действительно считаете что это смешно?

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

Добавлено: Пт июл 15, 2016 19:02:08
Z_h_e
Может вместо демагогии Вы ответите на все заданные Вам вопросы. Они заданы не просто так, ответьте на них и Вы решите свою задачу.

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

Добавлено: Пт июл 15, 2016 19:06:12
mas123
daaar писал(а):Я программист и пишу достаточно сносный код,
Хотелось бы уточнить по коду.

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

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

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

Добавлено: Пт июл 15, 2016 19:27:47
daaar
mas123 писал(а):
daaar писал(а):Я программист и пишу достаточно сносный код,
Хотелось бы уточнить по коду.

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

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

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

ISR(INT1_vect)
{
	sei();
	_delay_ms(10);
	if (PIND << 4 >> 7 == 1)
        {
         ...
        }
}

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

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

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

Добавлено: Пт июл 15, 2016 19:43:02
daaar
COKPOWEHEU писал(а):Здесь не серьезная IT-компания и не экзаменационная комиссия института, здесь на большинство недочетов оформления смотрят сквозь пальцы.
А вы уверены? Тут то явно "сквозь пальцы" смотрят