3000 об/мин. Это 50Гц. За 1 период(20 мс.), таймер отсчитает 400'000 тактов. Делим 1'200'000'000 на 400'000, получаем 3000. _____ Не пойму. Подаю на ИНТ 50 герц и таймер насчитует проимерно 76598. Обьясните откуда 400? Всё считает но выводит не 3000 оборотов, а 15 с чемто тысяч.
Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Вт сен 27, 2011 15:41:55
Модератор
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4582 Откуда: Планета Земля
Рейтинг сообщения:1 Медали: 1
Цитата:
Подаю на ИНТ 50 герц и таймер насчитует проимерно 76598
А когда я подаю, у меня отсчитывает нормально. А если и считает неправильно, я вижу свой исходник, в отличии от Вашего, и не занимаюсь экстрасенсорикой. Собственно, как и любой из присутствующих здесь
Подаю на ИНТ 50 герц и таймер насчитует проимерно 76598
А когда я подаю, у меня отсчитывает нормально. А если и считает неправильно, я вижу свой исходник, в отличии от Вашего, и не занимаюсь экстрасенсорикой. Собственно, как и любой из присутствующих здесь
вот мой исходник
Код:
#include <pic.h> __CONFIG (XT & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS); unsigned int tmr1temp; unsigned int tmr1temp2; long tmp; unsigned int tmppr; int num10000; int num1000; int num100; int num10; int num1; void pauza (void) { // начало переменная unsigned int x; // локальная x = 100; // в tmp поместить некое максимальное число while (x-->0); }// конец функции
void podgot (void) { TRISA = 0b00000000; // направление работы ножек порта А. TRISB = 0b10000001; // направление работы ножек порта В. CMCON = 0x07; // отключение компараторов. PORTA = 0; // очищаем порт А PORTB = 0; // очищаем порт Б. GIE = 1; //разрешить глобальные прерывания . PEIE = 1; // OPTION BIT RBPU = 1; // подтягивающие R (0-вкл, 1-выкл). INTEDG = 0; //Прерывания INT по пер. фронту. T0CS = 1; // внешний тактовый сигнал T0SE = 0; // задний фронт преращения сигнала. //T1CON BIT T1CKPS1 = 0; T1CKPS0 = 0; //предделитель 1:1 T1OSCEN = 0; // внутренний тактовый генератор выкл. T1SYNC = 1; // не синхронизировать внешний сигнал TMR1CS = 0; // Внутреннй источник тактового сигнала. TMR1ON = 1; // таймер включен. INTE=1; ///////// TMR1IE = 1; // прерывание от 1 таймера on. tmp=0; }
void main (void) { podgot (); while (1) { // === массив констант с описанием 7-сегментных символов const unsigned int arr_seg1[12]= { 0b01111100, // 0й элемент, символ «0» 0b01100000, // 1й элемент, символ «1» 0b01011010, // 2й элемент, символ «2» 0b01110010, // 3й элемент, символ «3» 0b01100110, // 4й элемент, символ «4» 0b00110110, // 5й элемент, символ «5» 0b00111110, // 6й элемент, символ «6» 0b01100000, // 7й элемент, символ «7» 0b01111110, // 8й элемент, символ «8» 0b01110110, // 9й элемент, символ «9» 0b01000110, //10й элемент, символ градуса 0b00000000, //11й элемент, пробел }; // конец массива
// === массив констант с описанием 7-сегментных символов const unsigned int arr_seg2 [12]= { // начало массива // 0bABCDEFGH <– расположение сегментов по битам 1, // 0й элемент, символ «0» 0, // 1й элемент, символ «1» 1, // 2й элемент, символ «2» 1, // 3й элемент, символ «3» 0, // 4й элемент, символ «4» 1, // 5й элемент, символ «5» 1, // 6й элемент, символ «6» 1, // 7й элемент, символ «7» 1, // 8й элемент, символ «8» 1, // 9й элемент, символ «9» 1, //10й элемент, символ градуса 0, //11й элемент, пробел }; tmp=65536*tmr1temp2; //количество кругов таймера1 tmp=tmp+tmppr; // пребовляем то что осталось в таймере до обнуления tmp=1200000000/tmp; // делим число (20000000*60) на t num10000=tmp/10000; tmp %=10000; num1000=tmp/1000; // количество тысяч tmp %=1000; // остаток от деления на 1000 num100=tmp/100; // количество сотен tmp %=100; // остаток от деления на 100 num10=tmp/10; // кол-во десятков num1=tmp%10; // остаток - единицы
Лучшая практика по приведению типов: не делать этого. Потому что, если в программе потребовалось приведение типов, значит в этой программе с большой долей вероятности что-то неладно...
Собственно вопрос - а нафига Вам нужен этот float? Чай не на PIC32 пишем?
Лучшая практика по приведению типов: не делать этого. Потому что, если в программе потребовалось приведение типов, значит в этой программе с большой долей вероятности что-то неладно...
Собственно вопрос - а нафига Вам нужен этот float? Чай не на PIC32 пишем?
16ф628а .Я учусь по самоучителям с интернета. В основном с labkit.ru. Там как написано так и делаю. Ведь если не определять то ругается компилятор. float тошо большие числа с запятой. Аlex так почему у меня таймер не считает 400? Исходник жеш дал. И почему поллали меня на приведение типов.?
misterkuk, в самообучении всегда повышена вероятность нарваться на неподходящий учебник и как бы не старались разобраться в теме, но каменный цветок не будет выходить. В итоге только потраченное впустую время, но время - самый ценный ресурс в жизни (или нет, здоровье ценнее, но не суть). Не получается по одному учебнику - берите другой. Многие на эти грабли наступали. Если можете читать по-английски, то это резко увеличивает шансы на успех - берите оригиналы и изучайте тему по ним. Если осилите самостоятельно половину упражнений из K&R то гарантирую что проблем как сейчас не будет
Потому что в некоторых местах данные ограничиваются всего 2-мя байтами.
misterkuk писал(а):
И почему поллали меня на приведение типов.?
А Вы почитали ? Думаете напрасно Вам дают подобные ссылки ?
Всё считает, еслиб не хваталоб места то не считалоб. За ссылки спасибо . просто дали ссылку и всё, хотяб на что конкретно обратить внимание. я за то что у вас за 0.02 сек таймер насчитует 400000 циклов. Но как так.? у нас разные таймеры чтоли? Нет конечно. Кварц 20 мегагерц. 1 машинный цикл 200 наносекунд. Тоесть 200/1000000000=0.0000002 секунды и если мы 0.0000002*400000 как у вас то получим не 0.02 а 0.08.
Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Вт сен 27, 2011 23:17:12
Модератор
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4582 Откуда: Планета Земля
Рейтинг сообщения:1 Медали: 1
Тьфу ты, я все 20Мгц посчитал. Тактовая же в 4 раза меньше. Но в любом случае, принцип тот-же... об/мин = (тактовая * 60) / T В Вашем случе получится 300'000'000 / T. Для 3000 об/мин, таймер насчитает 100'000.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения