T/C2

Здесь все вопросы по языку программирования С
AVRIK
Сообщения: 146
Зарегистрирован: 24 сен 2016, 11:25
Откуда: Тбилиси

Re: T/C2

Сообщение AVRIK » 30 сен 2016, 22:45

Спасибо! Постараюсь глупостями не беспокоить.

AVRIK
Сообщения: 146
Зарегистрирован: 24 сен 2016, 11:25
Откуда: Тбилиси

Re: T/C2

Сообщение AVRIK » 30 сен 2016, 23:03

Посмотрел Фрунзе, он на ассемблере, жаль. Посоветовали мне Герберта Шилдса почитать, умен мужик! По его программе через VISUAL STUDIO 2015 желательно работать. Установил, но видимо что-то не так. В проекте #include не
включается. Как только пропишу, литеры из живого голубого в серый цвет переходят, наверно как то надо библиотеку подгружать. Пока не пойму в чем ошибаюсь. А вы пользуетесь VISUAL STUDIO ? И по Шилдсу что скажете?

Аватара пользователя
gurvinok
Сообщения: 1532
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: T/C2

Сообщение gurvinok » 30 сен 2016, 23:26

Вот, вот и вот. Все мое на Visual Studio 2010.
Если долго мучиться, может быть получится.

AVRIK
Сообщения: 146
Зарегистрирован: 24 сен 2016, 11:25
Откуда: Тбилиси

Re: T/C2

Сообщение AVRIK » 01 окт 2016, 07:04

Ну спасибо!!! Ша сгоняю на урал, и через пару дней засяду за ваш проект, уверен найду очень много интересного!

AVRIK
Сообщения: 146
Зарегистрирован: 24 сен 2016, 11:25
Откуда: Тбилиси

Re: T/C2

Сообщение AVRIK » 12 окт 2016, 22:30

Здравствуйте Алексей! Вникаю в ваш сериал, шедевр! Изначально бегло по картинкам просмотрел, недооценил, но вскоре "Я ВСЕ ПОНЯЛ"! Все изучу! НО! Тут я свою тему копаю, нужна подсказка, вся надега на вас! Я ставил тему на запрос подсказки, но как-то съехали от ответа. Я код подправил по-проще, просмотрите пожалуйста!
Задача: Вычислить лог.уровень кода, (на снимке протеуса(KOD)), в момент когда PINC0=1; Это часть тестового кода, где я пытаюсь путем наложения маски на PINC0/1; вычислить состояние PINC1; пропустив "А" через "фильтр" switch-a. Делал это вручную прописывая PINC0/1; в "main", switch работал, но в режиме "INT0", почему-то
на PINB0 число "А" не отражается.
КОД:
#define F_CPU8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char A;

void int0_set(void)
{
MCUCR = 0x00;
MCUCR |= (1<<ISC01); //настраиваем на срабатывание INT0 по спадающему
GICR |= (1<<INT0); //активируем прерывание по INT0;
}

ISR(INT0_vect)
{

PORTC|=(1<<0);
PORTC&=~(1<<0);
PORTC&=0b00000011; // определяем лог.состояние ПИНС.1 (и"0")


A=PORTC; // присваивае результат переменной "А".
switch (A)
{
case 3:
PORTB|=(1<<0); // условие при состоянии лог."1" переменной "А".
break;
case 1:
PORTB&=~(1<<0); // условие при состоянии лог."0" переменной "А"
break;
}

}

int main(void)
{

DDRD&=0x00;
PORTD&=0x04;
DDRB|=0xFF;
PORTB&=0x00;
DDRC|=0xFD; //ПИНС.1 установлен на вход ?-правильно?
PORTC&=0x00;
int0_set(); //запустили инициализацию прерывания.
sei(); //глобально разрешили прерывания

while(1)
{ }
}
Графика в протеусе:
Вложения
Снимок.PNG

AVRIK
Сообщения: 146
Зарегистрирован: 24 сен 2016, 11:25
Откуда: Тбилиси

Re: T/C2

Сообщение AVRIK » 12 окт 2016, 22:42

Приветствую! А по теме работы с GSM кина не будет? В "кино" -AXLIB вроде нет раздела и обсуждения. Может отдельно планируете. Спасибо большое за уроки!

Аватара пользователя
gurvinok
Сообщения: 1532
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: T/C2

Сообщение gurvinok » 14 окт 2016, 13:10

PORTC|=(1<<0);
PORTC&=~(1<<0);
PORTC&=0b00000011; // определяем лог.состояние ПИНС.1 (и"0")


A=PORTC; // присваивае результат переменной "А".
switch (A)
{
case 3:
PORTB|=(1<<0); // условие при состоянии лог."1" переменной "А".
break;
case 1:
PORTB&=~(1<<0); // условие при состоянии лог."0" переменной "А"
break;
}
Это что за бред?
У МК есть три регистра.
DDRx - регистр направления данных. Если пин в 0, то он настроен на вход, если в 1 то на выход.
PINx - регистр чтения. В него записываются текущие значения выводов микросхемы при DDRx = 0x00
PORTx - регистр чтения. Выводит значение на ножки микросхемы при DDRx = 0xFF

Отсюда, если нужно прочитать данные из порта:
unsigned char temp = 0; // Переменная для хранения данных из порта
DDRx = 0x00; // Переводим порт на вход
temp = PINx; // Прочитали данные из прта и положили в переменную

Включение подтяжке в питанию методов подключения внутренних резисторов
DDRx = 0x00; // Включили режим входа на всем порту
PORTx = 0xFF; // Подтянули все ножки к питанию внутренними резисторами.

Режим вывода данных в порт.
DDRx = 0xFF;// Все ноги порта на выход
PORTx = 0xFF; // На всех ножка порта появятся единицы.

Пример чтения нулевого бита порта B.

DDRB &= ~(1 << 0); // Настроили пин 0 порта В на вход
PORTB |= (1 << 0); // Включили подтяжку к питанию. Теперь если ничего не происходит на ножке, то на ней висит железная единица. Необходимо чтобы не ловить мусор из атмосферы.

if(PIN & (1 << PB0))
{

// Сюда придем если 1
}
else
{

// Сюда придем если 0
}
А по теме работы с GSM кина не будет?
А что конкретно интересует.
Если долго мучиться, может быть получится.

AVRIK
Сообщения: 146
Зарегистрирован: 24 сен 2016, 11:25
Откуда: Тбилиси

Re: T/C2

Сообщение AVRIK » 14 окт 2016, 15:32

Уважаемый Алексей! Внимательно прочитал ваши коррективы по поводу моего бреда, но ничего нового и отличного от использованного в моем коде не нашел. С регистрами ввода/вывода, в моем простом коде ничего сложного. Смысл подтягивающего резистора мне известен,но в моем коде он не нужен. Во избежании глюков пишу X&=~(1<<X) a не Х=0;, тут железный "0",это чтоб лапа была загружена а не махала встречным помехам. Вы предлагаете переменную для хранения данных:unsinged char temp=0;, а я воспользовался unsigned char A; есть разница? Подскажите. По поводу чтения числа, (бита), он в моем коде двух битный, 2-ка и 3-ка. (на порт "С"). Я его считываю маской и присваиваю значение переменной "А",а через switch/case вызываю реакцию на PORTB0. Да, я не воспользовался if-ом, но разве кто имеет что нибудь против switch-?
Я понимаю, с ваших высот разбираться в каком то бреде, как минимум лень, но пожалуйста поймите, и у меня есть цель, своя вершина на сегодняшний день, и я должен разобраться что к чему. Поможете, буду благодарен,нет так Бог вам в помощь!
Если все таки решите помочь разобраться, подскажите, почему результат обработки оператором switch переменной "А" не отображается на PINB0. Спасибо!
По поводу GSM интересует технология управления китайским модулем. На пример для передачи аварийного звонка.
Просто, звонок другу и все!

Аватара пользователя
gurvinok
Сообщения: 1532
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: T/C2

Сообщение gurvinok » 14 окт 2016, 15:48

Вот это бред.
A=PORTC; // присваивае результат переменной "А".
Внимательно прочитайте то что я писал выше. Пока не поймете почему данная строка является бредом, дальше изучать МК будет сложно. Не линитесь и внимательно прочитайте мой предыдущий пост и ответе мне в чем ошибка.
По поводу GSM вот ссылочка для затравки. Если захочется еще, то я как раз сейчас проектирую GPS трекер для квадрокоптера и по мере сборки могу киножки снять.
Если долго мучиться, может быть получится.

AVRIK
Сообщения: 146
Зарегистрирован: 24 сен 2016, 11:25
Откуда: Тбилиси

Re: T/C2

Сообщение AVRIK » 15 окт 2016, 08:56

Алексей! Вы колдун!!! Это что за условие: if(PIN&(1<<Pxx); -!??? и самое странное то что она работает!!!
Тем не менее я так и не могу понять как эта запись разжевывается! Вот к слову: PORTC&=0b00010110; означает:
(на пример PORTC=) 0b00010101;
&
0b00010110;
-------------------
0b00010100;
A вот как ваши таинственные символы расшифровываются, никак не могу себе представить! Может нарисуете? И где такие таинства писаны, что за книжки такие??? Как не загуглю "С++", так там такую пургу заметут, куда прешь не поймешь! Конкретно по мк. есть что? Или вся надежда на вас?
С уважением к вам!!!

Ответить