реклама на сайте
подробности

 
 
> 1 секунда на С
ZLOI
сообщение Apr 29 2008, 07:45
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 7-03-07
Из: Славный город Шелехов
Пользователь №: 25 967



Здравствуйте, интересно бы увидеть фрагмент кода на С, который бы позволял на 16 пике с 4 МГц кварцем каждую секунду увеличивать значение какой-нибудь переменной на 1. Интересно, вдруг я делаю неправильно.

Сообщение отредактировал ZLOI - Apr 29 2008, 07:46
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GVC
сообщение Apr 29 2008, 09:59
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 13-07-07
Из: Украина, Днепропетровск
Пользователь №: 29 095



Цитата(ZLOI @ Apr 29 2008, 10:45) *
Здравствуйте, интересно бы увидеть фрагмент кода на С, который бы позволял на 16 пике с 4 МГц кварцем каждую секунду увеличивать значение какой-нибудь переменной на 1. Интересно, вдруг я делаю неправильно.


Покажите что и как вы делаете, ну а мы уже скажем так или не так делает.
Конфигурирование таймера и прерывания этож класскика жанра. Показуйте свой код ...


--------------------
2b || !2b = ?
--------------------
Go to the top of the page
 
+Quote Post
ZLOI
сообщение Apr 30 2008, 09:49
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 7-03-07
Из: Славный город Шелехов
Пользователь №: 25 967



Цитата(GVC @ Apr 29 2008, 18:59) *
Покажите что и как вы делаете, ну а мы уже скажем так или не так делает.
Конфигурирование таймера и прерывания этож класскика жанра. Показуйте свой код ...

Забыл подписаться, поэтому не отвечал.
Код
#include    <pic12F6x.h>

int time;

void interrupt Times(void)
{
    if (++time==3906)
        {
            unsigned char to_delay=0;
            while (++to_delay<6)
                {}
            time=0;
            _asm NOP _endasm
            time=0;//    
            time=0;//Вообщем надо как-то паузу сделать,
            TMR0=0;//по грамотному, а то вдруг компилер сменил и всё, не пашет.
            GPIO=!GPIO;
            }
    T0IF = 0;
}
main()
{
    int x;
    GPIO=0;
    CMCON=7;
    TRISIO=254;
    GPIO=0;
    GIE=1;
    T0IE=1;
    T0CS=0;
    PSA=1;
    TMR0=1;
    for(;;)    {}
}

Собственно сейчас у меня компилера нет поэтому протестить особо не могу, но по памяти, что-то типа такого делал. И работало оно как надо, по крайней мере за неделю ни на секунду не сдвинулось.
Алгоритм простой, таймер инкрементиться каждые 256 машинных циклов таймер вызывает прерывание и увеличивает переменную time на 1. Секунда проходит через 1000 000 машинных циклов или через 3906 прерываний и ещё 64 такта. Вот у меня и вопрос, как сделать чисто на С, чтобы любой другой компилятор поставил и всё работает. Хочется знаете, увидеть как делают мастера.

Цитата(rezident @ Apr 29 2008, 21:00) *
Таймер разрядности менее, чем 32 можно программно расширить до 32-х разрядов. А с помощью 32-х разрядного уже можно отмерить интервал в 1с даже при тактовой 4ГГц.

Знаю. Проблем со "сделать" нет. Не хочется быть умным программистом, который тупым кодом делает гениальные вещи. Хочется делать красиво. Вот Вы мне скажете. Я посмотрю и подумаю: "Ёлки палки, да ведь здесь же надо в таком направлении двигаться, такие книжки читать и т.д.".

P.S.
Сомневаюсь, что буду когда-нибудь использовать такие бешеные частоты smile.gif
Go to the top of the page
 
+Quote Post
GVC
сообщение Apr 30 2008, 14:37
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 13-07-07
Из: Украина, Днепропетровск
Пользователь №: 29 095



Цитата(ZLOI @ Apr 30 2008, 12:49) *
Вот у меня и вопрос, как сделать чисто на С, чтобы любой другой компилятор поставил и всё работает. Хочется знаете, увидеть как делают мастера.


Принцип правильный, програмируете таймер на определённый интервал времени (не обязательно 256 машинных циклов, есть же делители у таймера wink.gif), в зависимости от требуемой дискреты (это добивается делителем для таймера а также значением загружаемым в счётчик таймера), например можно получить почти 1, 10, 100 мСек. Ну а далее в прерывании от этого таймера программно "считает" эти интервалы времени до требуемой вам величины.
Это чисто на си реализуемо просто.
А вот вся "обвязка" прерываний на си не имеет стандарта и в зависимости от компилятора вам всётаки прийдётся вносить изменения в обьявления векторов прерывания и обработчиков ... Такчто полной универсальности трудно добится, есть особенности у каждого компилятора.


--------------------
2b || !2b = ?
--------------------
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016