Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Ghost in shell писал(а):так правильно?
да, можно даже проще:

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

T0IE = !sec1;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Вопросы по С/С++ (СИ)

Сообщение Ghost in shell »

ARV писал(а):
Ghost in shell писал(а):так правильно?
да, можно даже проще:

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

T0IE = !sec1;

Спасибо, но это просто инвертирование состояния sec1, а нужно именно сравнение.
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Ghost in shell писал(а):Спасибо, но это просто инвертирование состояния sec1, а нужно именно сравнение.
а в чем разница? ;) кроме того, это НЕ ИНВЕРТИРОВАНИЕ, а ОТРИЦАНИЕ. инвертирование обозначается знаком тильда ~
если sec1 будет 0, то TOIE будет 1, если sec1 будет 1, то TOIE будет 0 - что не так?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение md5sum »

ARV писал(а):
Ghost in shell писал(а):Спасибо, но это просто инвертирование состояния sec1, а нужно именно сравнение.
а в чем разница? ;) кроме того, это НЕ ИНВЕРТИРОВАНИЕ, а ОТРИЦАНИЕ. инвертирование обозначается знаком тильда ~
если sec1 будет 0, то TOIE будет 1, если sec1 будет 1, то TOIE будет 0 - что не так?
Поправлю:
если sec1 будет 0, то TOIE будет 1, если sec1 будет НЕ 0, то TOIE будет 0
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Вопросы по С/С++ (СИ)

Сообщение Ghost in shell »

Теоретически все верно. :dont_know:
Буду пробовать.
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

md5sum писал(а):Поправлю:
напрасный труд - ранее топикстартер показал код, в котором sec1 определен как БИТ, то есть он не может быть НЕ НУЛЕМ, кроме как будучи ЕДИНИЦЕЙ. хотя я не стану спорить, что бит - нестандартная фича для Си, но раз уж есть... :beer:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Re: Вопросы по С/С++ (СИ)

Сообщение lix »

Hispanus писал(а):Как можно нарисовать линию в си?


алгоритм Брезенхема.
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Hispanus »

Зачем использовать таймер TMR0, если есть функция delay?)
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Hispanus писал(а):Зачем использовать таймер TMR0, если есть функция delay?)
где этот негодяй, который пытками заставляет вас это делать?! :)))

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

Мой уютный бложик... заходите!
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Hispanus »

ARV писал(а):
Hispanus писал(а):Зачем использовать таймер TMR0, если есть функция delay?)
где этот негодяй, который пытками заставляет вас это делать?! :)))

задержка по таймеру позволяет не терять время даром, в то время как задержка через функцию - тормозит основной цикл наглухо. решайте, что вам важнее.

Этот негодяй я) Просто подумал зачем напрягаться с этими регистрами, когда можно написать всё в одну строчку...
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Hispanus »

Если имеется МК с частотой кварца 4 МГц, какое значение предделителя нужно выбрать и какое значение надо загрузить в TMR0, чтобы получать переполнения через каждую секунду (если можно вместе с формулой)...не могу сообразить..
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение IfoR »

Ну так смотрим. За 1 секунду, при частоте 4 МГц, произойдёт: 4 Мгц * 1 с = 4000000 циклов.
Теперь подбираем.
Количество циклов, которое произойдет при переполнении счётчика при начальном значении делителя А и TMR0 будет таким: С = A*(256-TMR0)
Выразим TMR0: TMR0 = 256 - С/A
Учитывая условие, что TMR0 >= 0, подбираем А:
A = 1: TMR0 = 256 - 4000000/1 < 0
A = 8: TMR0 = 256 - 4000000/8 < 0
A = 64: TMR0 = 256 - 4000000/64 < 0
A = 256: TMR0 = 256 - 4000000/256 < 0
A = 1024: TMR0 = 256 - 4000000/1024 < 0

и всё! Больше значений делителя нет. Одним Таймером0 нельзя устроить задержку в 1 секунду при 4 МГц. Тут нужно либо использовать дополнительную глобальную переменную, либо использовать Таймер1, либо заводить внешнее тактирование на ножку T0.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

IfoR писал(а):Тут нужно либо использовать дополнительную глобальную переменную, либо использовать Таймер1, либо заводить внешнее тактирование на ножку T0.
переменную лучше заводить локальную, но статическую.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Hispanus »

IfoR писал(а):Ну так смотрим. За 1 секунду, при частоте 4 МГц, произойдёт: 4 Мгц * 1 с = 4000000 циклов.
Теперь подбираем.
Количество циклов, которое произойдет при переполнении счётчика при начальном значении делителя А и TMR0 будет таким: С = A*(256-TMR0)
Выразим TMR0: TMR0 = 256 - С/A
Учитывая условие, что TMR0 >= 0, подбираем А:
A = 1: TMR0 = 256 - 4000000/1 < 0
A = 8: TMR0 = 256 - 4000000/8 < 0
A = 64: TMR0 = 256 - 4000000/64 < 0
A = 256: TMR0 = 256 - 4000000/256 < 0
A = 1024: TMR0 = 256 - 4000000/1024 < 0

и всё! Больше значений делителя нет. Одним Таймером0 нельзя устроить задержку в 1 секунду при 4 МГц. Тут нужно либо использовать дополнительную глобальную переменную, либо использовать Таймер1, либо заводить внешнее тактирование на ножку T0.


Последовал вашему совету и вот что получилось: (поочередное переключение ножек порта В из низкого состояние в высокое с шагом примерно 1 секунда)

#include <16f84.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#byte PORTB = 0x06
#byte TRISB = 0x086
#byte INTCON = 0x0B
#bit TOIF = INTCON.2
#byte OPTION_REG = 0x081
#bit GIE = INTCON.7
#bit TOIE = INTCON.5
#bit PS0 = OPTION_REG.0
#bit PS1 = OPTION_REG.1
#bit PS2 = OPTION_REG.2
#bit TOCS = OPTION_REG.5
int variable=0;

#int_timer0
void timer0_isr (void);
main()
{
TOIE=1;
PS0=1;
PS1=1;
PS2=1;
GIE=1;
TOIF=1;
TOCS = 0;
PORTB=0;
TRISB=0;

PORTB=PORTB | 0x01;

while (1)
{
if (variable==16)
{
variable=0;
PORTB=PORTB<<1;
}

}
}
void timer0_isr(void)
{
TOIF=0; //Сбрасываем TOIF
variable++;
}

Всё ли правильно я сделал?)
Последний раз редактировалось Hispanus Чт июл 14, 2011 14:44:16, всего редактировалось 2 раза.
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение IfoR »

Ух-ты, сколько тут директив-то! :)
Да, так пойдёт.

Тут примерная формула оценки задержки будет такая:
С=R*D*(256 - TCNT0)
C - задержка в циклах; R - сравниваемое значение в регистре; D - делитель; TCNT0 - начальное значение в счётчике таймера.
Найти R можно так:
R=С/(D*(256 - TCNT0))

В вашем случае тут будут такие решения, при TCNT0 = 0:
D = 64 => R = 244
D = 256 => R = 61
D = 1024 => R ~= 15

Здесь лучше, наверное, использовать делитель в 256.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Вопросы по С/С++ (СИ)

Сообщение Antifritz »

Hispanus писал(а):if (variable==16)

Вместо этого лучше писать:
if (variable>=16)
на случай если по каким-то причинам проц пропустит тот момент, когда переменная стала именно 16, тем более если она будет изменятся не в основной программе, а в обработчике прерывания.
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Hispanus »

Протестил ее в протеусе..повылазила куча ошибок с таким названием: PIC16core PC=0x0010 Stack overflow pushing return address of interrupt.. что это?
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

Hispanus писал(а):Протестил ее в протеусе..повылазила куча ошибок с таким названием: PIC16core PC=0x0010 Stack overflow pushing return address of interrupt.. что это?

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

Мой уютный бложик... заходите!
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Hispanus »

Всё оказалось до ужаса просто :)) надо было лишь перенести функцию обработки прерывания до main, тоесть для нее не надо было писать отдельную подпрограмму..по видимому протеус понимает только так :))
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Hispanus »

И всё равно ничего не получилось))вместо красивого переключение какая то хаотичная картина))
Вот код:
#include <16f84.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#byte PORTB = 0x06
#byte TRISB = 0x086
#byte INTCON = 0x0B
#byte OPTION_REG = 0x081
#bit T0IF = INTCON.2
#bit GIE = INTCON.7
#bit T0IE = INTCON.5
#bit PS0 = OPTION_REG.0
#bit PS1 = OPTION_REG.1
#bit PS2 = OPTION_REG.2
#bit T0CS = OPTION_REG.5

int variable=0;

#int_timer0
void timer0_isr (void)
{
T0IF=0;
variable++;
}
main()
{
T0IE=1;
PS0=1;
PS1=1;
PS2=1;
GIE=1;
T0CS = 0;
PORTB=0;
TRISB=0;

PORTB=0b00000001;

while (1)
{
if (variable==15)
{
T0IE=0;
GIE=0;
variable=0;
PORTB=PORTB<<1;
T0IE=1;
GIE=1;
if (PORTB==0b10000000)
{T0IE=0;
GIE=0;
PORTB=0b00000001;
T0IE=1;
GIE=1;
}
}

}
}

И файл в протеусе
Вложения
Proteus.rar
(6.31 КБ) 153 скачивания
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Ответить

Вернуться в «Разные вопросы по МК»