Точность хода очень плохая, за 30 минут натикало 36 минут. Понять в чем дело не могу.
(в коде используется header файл, для удобства)
Весьма оригинальный способ обнуления портов. А что помешало сделать по-человечески?/* Обращает все порты в 0 */
void clear()
{
PORTB = PORTB >> 8 << 8;
PORTD = PORTD >> 2 << 2;
}
Аналогично. Как вы думаете сколько времени пройдет от входа в процедуру до выполнения кода m=2; n=9? Ну и использование магических чисел плохая идея.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;
}
А чего вы хотели добиться задавая отрицательную задержку, путешествия во времени?_delay_ms(-.55);
Что мешало оформить по-человечески? Думаете нам доставляет неимоверное удовольствие искать в даташите что же вы хотели сказать своим магическим числом? Ни биты не поименованы, ни даже комментариев.TCCR1B = 0b00000100;
GIMSK = 0b11000000;
MCUCR = 0b00001111;
ATTiny2313 поддерживает режим CTC, почему вы им не воспользовались? Выставлять задержку вручную можно на ассемблере, хотя и там любое прерывание собьет счет, но на Си это и вовсе бред.ISR(TIMER1_OVF_vect)
{
TCNT1 = 26473;
логика подсказывает, что компилятор должен ругаться на необъявленную частоту. Вообще, выставлять ее внутри кода - плохая идея. Тем более что указано 1 МГц, а не 10 МГц и не 10 миллигерц, как написано у вас (и где такой кварц нашли?). Учитывая, что ошибка гораздо меньше чем в 10 раз, вы используете встроенный RC-генератор. И после этого удивляетесь такой точности.#include "mlib.h"
#define F_CPU 1000000UL
COKPOWEHEU писал(а):Весьма оригинальный способ обнуления портов. А что помешало сделать по-человечески?/* Обращает все порты в 0 */
void clear()
{
PORTB = PORTB >> 8 << 8;
PORTD = PORTD >> 2 << 2;
}Аналогично. Как вы думаете сколько времени пройдет от входа в процедуру до выполнения кода m=2; n=9? Ну и использование магических чисел плохая идея.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;
}А чего вы хотели добиться задавая отрицательную задержку, путешествия во времени?_delay_ms(-.55);Что мешало оформить по-человечески? Думаете нам доставляет неимоверное удовольствие искать в даташите что же вы хотели сказать своим магическим числом? Ни биты не поименованы, ни даже комментариев.TCCR1B = 0b00000100;
GIMSK = 0b11000000;
MCUCR = 0b00001111;ATTiny2313 поддерживает режим CTC, почему вы им не воспользовались? Выставлять задержку вручную можно на ассемблере, хотя и там любое прерывание собьет счет, но на Си это и вовсе бред.ISR(TIMER1_OVF_vect)
{
TCNT1 = 26473;логика подсказывает, что компилятор должен ругаться на необъявленную частоту. Вообще, выставлять ее внутри кода - плохая идея. Тем более что указано 1 МГц, а не 10 МГц и не 10 миллигерц, как написано у вас (и где такой кварц нашли?). Учитывая, что ошибка гораздо меньше чем в 10 раз, вы используете встроенный RC-генератор. И после этого удивляетесь такой точности.#include "mlib.h"
#define F_CPU 1000000ULВот с этим согласен. Алгоритмические решения и форматирование вызывает ужас. Единственное в форматировании что ужаса не вызывает - отступы.Думал помочь... передумал.
на самом деле нет разницы междуdaaar писал(а):А какая разница как обнулять восьмибитный тип
Код: Выделить всё
PORTB=0;
PORTB ^= PORTB;
PORTB = PORTB - PORTB;
PORTB <<= 9;а в чем разница между процедурой и функцией? отличается лиdaaar писал(а):В с++ нет процедур(это вам не паскаль), только функции
Код: Выделить всё
void proc(int i);Код: Выделить всё
procedure proc(i : integer);неужели программист не понимает, почему компилилось?! я вот, дилетант, понимаю... но, конечно же, гуру поучать не смею.daaar писал(а):Отрицательная задержка это опечатка, очень странно что с ней компилилось
а можно посмотреть на исходники того, чем вы раньше занимались? хотя бы отдельные куски? Просто любопытно посмотреть, как настоящие программисты пишут...daaar писал(а):Я только начал под МК кодить
Код: Выделить всё
float var = 250 / 15;как по моему дилетантскому мнению, так С++ пахнет ООП, т.е. классами и их экземплярами. ну а вообще, AVR-GCC по-разному обрабатывает исходники .c и .cpp - настолько по-разному, что могут быть на ровном месте ошибки компиляции. ну вам-то об этом известно...daaar писал(а):А чем по вашему пахнет с++ код
допустим, это так и есть.daaar писал(а):Я так понимаю вы не имеете четкого понимания о программировании
что возвращает void func(void); ?daaar писал(а):Процедура ничего не возвращает
понятно, теперь я знаю, что -0.55 это не совсем отрицательное число. надеюсь хоть -1.5 - это уже совсем отрицательное?daaar писал(а):Там была не совсем отрицательная задержка, там была -.55
сочувствуюdaaar писал(а):нету разницы в компиляции с-кода в g++ или gcс
да я и классов-то не кончал, если церковно-приходскую школу не считать... куда мне-то...daaar писал(а):вы кроме классов ничего не знаете? А как же потоки, перегрузка операторов, ссылки?
Код: Выделить всё
ISR(INT1_vect)
{
sei();Вот это кстати интересный вопрос, потому что объявлен он страшно - значение указателя на фиксированный адрес, да еще с макропреобразованиями. И мне тоже интересна версия гуру-программиста.заодно: PORTB какой тип Си имеет?
В терминологии. С одной стороны, теоретически, функция Си всегда возвращает хотя бы void (пофиг что там ничего нет), тогда процедур там нет. С другой, практически, возвращаемое значение нигде не используется и не учитывается даже в самых недрах контроллера, тогда можно считать процедурой. С третьей стороны, психологически, излишне строгая терминология может мешать и тогда ее стоит ограничить, тогда назвать процедуру функцией или наоборот не будет серьезной ошибкой.а в чем разница между процедурой и функцией?
Из этих двух я бы применил хотя бы {PORTB &=~x;} потому что первый оператор там бесполезен- какой макрос лучше применить и почему:
В контроллерах этим не пользуются, а разговор именно про них. Вот классами и шаблонами пользоваться можно, если знать как.вы кроме классов ничего не знаете? А как же потоки, перегрузка операторов, ссылки?
в моём вопросе такого нетCOKPOWEHEU писал(а):хотя бы {PORTB &=~x;}
Я имел в виду вместо предложенных вариантов, поскольку делает тоже самое на 1-3 такта (в 2 раза) быстрее.в моём вопросе такого нет
Чуть-чуть беременная.daaar писал(а):Там была не совсем отрицательная задержка, там была -.55,
Вот же млять, я ей денег одолжил.daaar писал(а):Я так понимаю вы не имеете четкого понимания о программировании.
Процедура ничего не возвращает
Я задал вопрос конкретно описав проблему, а мне начали говорить, что в моем коде стилистические ошибки.Z_h_e писал(а):З.Ы. Если бы Вы засунули своего Наполеона глубоко в Эльбу, Вам бы помогли с удовольствием. Вы не поверите, но этот "гад" ARV затратил свое время и помог многим.
Вы действительно считаете что это смешно?Z_h_e писал(а):На счет чуть-чуть отрицательного, попробуйте посмотреть чему будет равно unsigned int i=-1;. Минус 1 тоже не очень отрицательное, почти 0.
Хотелось бы уточнить по коду.daaar писал(а):Я программист и пишу достаточно сносный код,
Код: Выделить всё
ISR(INT1_vect)
{
sei();
_delay_ms(10);
....
}Во время выполнения прерывания все другие прерывания ставятся в очередь, чтобы этого не происходило я разрешаю прерывания.mas123 писал(а):Хотелось бы уточнить по коду.daaar писал(а):Я программист и пишу достаточно сносный код,В чем тайный смысл разрешать прерывания внутри обработчика прерывания? Ладно, это я ещё могу придумать.Код: Выделить всё
ISR(INT1_vect) { sei(); _delay_ms(10); .... }
Но, зачем в обработчике прерывания нужны ЗАДЕРЖКИ?!
Код: Выделить всё
ISR(INT1_vect)
{
sei();
_delay_ms(10);
if (PIND << 4 >> 7 == 1)
{
...
}
}
Справедливости ради, функция _delay_ms() принимает значение double а не unsigned int, так что присвоить отрицательное число возможно. Вот только ЗАЧЕМ???Z_h_e писал(а):попробуйте посмотреть чему будет равно unsigned int i=-1;.
У меня обратный вопрос. Ладно задержка - антидребезг (и изредка это может быть оправдано), но зачем разрешать прерывания? Чтобы во время антидребезга это же прерывание набилось в стеке еще десяток раз?В чем тайный смысл разрешать прерывания внутри обработчика прерывания? Ладно, это я ещё могу придумать.
Но, зачем в обработчике прерывания нужны ЗАДЕРЖКИ?!
Можно я? Можно я?daaar, напишите функцию, процедуру и метод на ассемблере
Честно вам сказать - у хорошего программиста не должно быть в коде таких ошибок оформления, на которые на форуме народ пальцем показывает. Здесь не серьезная IT-компания и не экзаменационная комиссия института, здесь на большинство недочетов оформления смотрят сквозь пальцы.Я задал вопрос конкретно описав проблему, а мне начали говорить, что в моем коде стилистические ошибки.
А вы уверены? Тут то явно "сквозь пальцы" смотрятCOKPOWEHEU писал(а):Здесь не серьезная IT-компания и не экзаменационная комиссия института, здесь на большинство недочетов оформления смотрят сквозь пальцы.