Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/67: Рейтинг темы: голосов - 67, средняя оценка - 4.60
Powto
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 4
1

Опрос состояния порта в AVR Studio 5.0

25.09.2013, 21:51. Просмотров 12248. Ответов 14
Метки нет (Все метки)

Доброго времени суток!
Недавно решил перейти со среды CVAVR в AVR Studyo, т.к. понял что лучше писать на чистом С, и сразу столкнулся с такой проблемой. Имеем МК мега8, к порту С на 4 пина приходит двоичный код с DTMF-дэкодера. И мне нужно прочитать состояние входов на МК после появления на оных кода. Уже перерыл кучу инфы по настройке и чтению состояний портов, пробовал и так и эдак, но результат остается одним и тем-же :( Вот и прошу у более опытных товарищей совета и/или помощи. Я считаю, что ято-то напутал с битовыми операциями и масками.
И чтобы, не быть голословным приведу код, что я набросал. Заранее спасиюо!
# define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>

#define PIN_INT0 PD2
#define PIM_DTMF1 PC0
#define PIM_DTMF2 PC1
#define PIM_DTMF3 PC2
#define PIM_DTMF4 PC3
#define LED_PIN PB0

#define BIT(x) (1 << (x))
#define SITBITS(x,y) ((x) |= (y))
#define CLEARBITS(x,y) ((x) &= (~(y)))
#define SITBIT(x,y) SITBITS((x), (BIT((y))))
#define CLEARBIT(x,y) CLEARBITS((x), (BIT((y))))
#define BITSIT(x,y) ((x) & (BIT(y)))
#define BITCLEAR(x,y) !BITSIT((x), (y))
#define BITSSIT(x,y) (((x) & (y)) == (y))
#define BITSCLEAR(x,y) (((x) & (y)) == 1)
#define BITVOT(x,y) (((x)>>(y)) & 1)

#define bit_get(p,m) ((p) & (m))
#define bit_set(p,m) ((p) |= (m))
#define bit_clear(p,m) ((p) &= ~(m))
#define bit_flip(p,m) ((p) ^= (m))
#define bit_write(c,p,m) (c ? bit_set(p,m) : bit_clear(p,m))
#define LONGBIT(x) ((unsykned long)0x00000001 << (x))
char l;
unsykned int k, h;
volatile unsykned char flagInt0 = 0;

int main(void)
{

PORTB = 0b00000000;
DDRB = 0b11111111;
DDRC &=~ ((1 << (PIM_DTMF1))|(1 << (PIM_DTMF2))|(1 << (PIM_DTMF3))|(1 << (PIM_DTMF4))); // Очистка битов 0,1,2 и 3 регистра направления порта D.
PORTC |= ((1 << (PIM_DTMF1))|(1 << (PIM_DTMF2))|(1 << (PIM_DTMF3))|(1 << (PIM_DTMF4)));
l = PINC;

//настраиваем вывод на вход
DDRD &= ~(1<<(PIN_INT0));
//включаем подтягивающий резистор
PORTD |= (1<<(PIN_INT0));
//разрешаем внешнее прерывание на int0
GICR |= (1<<(INT0));
//настраиваем условие прерывания
MCUCR |= (1<<ISC01)|(0<<ISC00);

sei();
while(1)
{
if (flagInt0){
if (CLEARBIT(PINC,PIM_DTMF1))
{
SITBIT(PINB,LED_PIN);
}
if (CLEARBIT(PINC,PIM_DTMF1)&& CLEARBIT(PINC,PIM_DTMF2))
{
CLEARBIT(PINB,LED_PIN);
}
}
flagInt0 = 0;
}
}

//внешнее прерывание. обработчик.

ISR(INT0_vect){ // прерывание по вектору INT0

unsykned char i = 0;
unsykned char count = 0;

while(i < 2){
if ((PIND & PIN_INT0) == 0) count++;
i++;
}
if (count > 1) flagInt0 = 1;

}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2013, 21:51
Ответы с готовыми решениями:

CAVR против AVR Studio, что не так в программе под AVR Studio
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все...

ацп опрос второго порта.
решил поразбираться с АЦП взял пример, вроде все понятно как выставить вывод...

Опрос клавиатуры....AVR attini2313
Доброго времени суток=) Помогите пож. допилить прогу , делаю динамический...

Опрос порта на нажатие кнопки (ASM, ATMega16)
Не могу разобраться в чем дело, в моем проекте порт РС настроен как приемник к...

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от...

14
stritsh
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
25.09.2013, 22:49 2
А вы посмотрите как определены биты регистров порта в avr/iom8.h, и сразу все поймете.
0
sitimur
0 / 0 / 0
Регистрация: 08.02.2012
Сообщений: 648
25.09.2013, 23:06 3
Если правильно понял то при получении данных с порта С ты на порту B включаешь выключаешь диоды, а зачем ты там порт D дергаешь?
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
25.09.2013, 23:15 4
Цитата Сообщение от Powto
Недавно решил перейти со среды CVAVR в AVR Studyo, т.к. понял что лучше писать на чистом С
А что, в CVAVR Си какой-то "не чистый" стал?
0
stritsh
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
25.09.2013, 23:27 5
Цитата Сообщение от sitimur
а зачем ты там порт D дергаешь?
Он его не дергает, а проверяет на 0 PIND2 в прерывании. Но дело-то не в этом, а в том, что ТС неправильно обращается к битам регистров.
0
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
26.09.2013, 01:06 6
В ваших дефайнах уже определены готовые битовые маски пинов, наверное. То-есть, PC3 это уже (1<<3), я думаю.
0
stritsh
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
26.09.2013, 09:10 7
У вас условия проверки пинов регистра PINC никогда не датут истину.
Код
 while(1)
{
if (flagInt0){
if (CLEARBIT(PINC,PIM_DTMF1))   //  PINC & = ~(1 << PIM_DTMF1) Вот это будет давать все время ноль
{
SITBIT(PINB,LED_PIN);
}
if (CLEARBIT(PINC,PIM_DTMF1)&& CLEARBIT(PINC,PIM_DTMF2))
{
CLEARBIT(PINB,LED_PIN);
}
}
flagInt0 = 0;
}
}
Сделайте так
Код
while(1)
{
if (flagInt0){
if ( !(PINC &  (1 << PIM_DTMF1) )
{
SITBIT(PORTB,LED_PIN);
}
if ( !(PINC &  (1 << PIM_DTMF1) ) && ( !(PINC &  (1 << PIM_DTMF2) )
{
CLEARBIT(PORTB,LED_PIN);
}
}
flagInt0 = 0;
}
}
И с дефайнами разберитесь, обращайтесь правильно к битам регистров которые определены в avr/iom8.h, а не так как вы делаете к битам регистра DDRC, обращаетесь битами регистра PORTC
DDRC &=~ ((1 << (PIM_DTMF1))|(1 << (PIM_DTMF2))|(1 << (PIM_DTMF3))|(1 << (PIM_DTMF4)));
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.09.2013, 13:22 8
Ну насоветовали тут... Насколько мне помнится, когда DTMF определен, мс выводит код и выставляет пин. В соответствии с даташитом. Какой декодер кстати? Также озвучьте свои хотелки, когда есть сигнал определения DTMF. То есть что должен делать проц, когда DTMF декодирован?
0
Powto
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 4
26.09.2013, 21:23 9
Доброго времени суток!
Спасибо что так быстро откликнулись!
Итак, по порядку:
Цитата Сообщение от stritsh
А вы посмотрите как определены биты регистров порта в avr/iom8.h, и сразу все поймете.
Просмотрел, но в этом файле только определения битов, конструкций я в нем не обнаружил (((

Цитата Сообщение от stritsh
Цитата Сообщение от sitimur
а зачем ты там порт D дергаешь?
Он его не дергает, а проверяет на 0 PIND2 в прерывании. Но дело-то не в этом, а в том, что ТС неправильно обращается к битам регистров.

Согласно даташиту на МС IL9270 после дэкодирования тонального сигнала на ноге ОЕ появляется сигнал логической 1, что дает МК сигнал о том, что нужно проверить порт.

Сделайте так
Код
while(1)
{
if (flagInt0){
if ( !(PINC &  (1 << PIM_DTMF1) )
{
SITBIT(PORTB,LED_PIN);
}
if ( !(PINC &  (1 << PIM_DTMF1) ) && ( !(PINC &  (1 << PIM_DTMF2) )
{
CLEARBIT(PORTB,LED_PIN);
}
}
flagInt0 = 0;
}
}
Попробую, о результатах сообщу.
Насчет этого, немного не понял
[QUOTE="stritsh"] И с дефайнами разберитесь, обращайтесь правильно к битам регистров которые определены в avr/iom8.h, а не так как вы делаете к битам регистра DDRC, обращаетесь битами регистра PORTC
Цитата Сообщение от Цитата:[/QUOTE]
DDRC &=~ ((1 << (PIM_DTMF1))|(1 << (PIM_DTMF2))|(1 << (PIM_DTMF3))|(1 << (PIM_DTMF4)));
Поясните пожалуйста...

dymyurk1978
Какой декодер кстати? Также озвучьте свои хотелки, когда есть сигнал определения DTMF. То есть что должен делать проц, когда DTMF декодирован?
Дэкодер IL 9270 . Хотелки: включение/выключение нагрузок, света ну и что-нибудь еще(аппетит приходит во время еды!:))
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.09.2013, 21:50 10
Цитата Сообщение от Powto
Согласно даташиту на МС IL9270 после дэкодирования тонального сигнала на ноге ОЕ появляется сигнал логической 1, что дает МК сигнал о том, что нужно проверить порт.
Возможно вы опечатались. Но считывать Q1-Q4 нужно после 1 на STD, а не OE. OE - разрешение выходов. 1 - разрешение, 0 - запрет, Q1-Q4 в состоянии Z.
0
Powto
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 4
26.09.2013, 21:59 11
Да, вы правы, я опечатался!
И поскольку, на выходе 1, а прерывание по нисходящему фронту, для инверсии, я использую транзистор bc547 или посоветуете использовать инверторы?
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.09.2013, 22:10 12
Цитата Сообщение от Powto
Да, вы правы, я опечатался!
И поскольку, на выходе 1, а прерывание по нисходящему фронту, для инверсии, я использую транзистор bc547 или посоветуете использовать инверторы?
Почитать внимательно даташит на кристалл. Прерывание можно настроить.
0
stritsh
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
26.09.2013, 22:57 13
[QUOTE="Powto"]Насчет этого, немного не понял[QUOTE="stritsh"] И с дефайнами разберитесь, обращайтесь правильно к битам регистров которые определены в avr/iom8.h, а не так как вы делаете к битам регистра DDRC, обращаетесь битами регистра PORTC
DDRC &=~ ((1 << (PIM_DTMF1))|(1 << (PIM_DTMF2))|(1 << (PIM_DTMF3))|(1 << (PIM_DTMF4)));
Поясните пожалуйста... У вас есть дефайны
Код
#define PIM_DTMF1 PC0
#define PIM_DTMF2 PC1
#define PIM_DTMF3 PC2
#define PIM_DTMF4 PC3
которые подразумевают переопределить биты РС0-РС3 регистра PORTC, это выглядит не корректно. Получается что вы дальше обращаетесь к регистру DDRC вот так
Код
DDRC &=~ ((1 << (PC0))|(1 << (PC1))|(1 << (PC2))|(1 << (PC3)));
хотя потом все это заменится цифрами, но согласитесь это выглядит как-то не так, ведь биты регистра DDRC определены в avr/iom8.h как DDC0-DDC6. Просто я бы написал так
Код
#define PIM_DTMF1 PINC0,  #define DDR_BIT_DTMF1 DDC0, #define PORT_BIT_DTMF1 PC0.
Как-то так.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
27.09.2013, 14:01 14
Автору (ТС-у (топикстартеру)). А у тебя с программированием вообще как? Понятие конечные автоматы знакомо? Я исходил из того, что ты новичок, накидал тебе малёхо. Разбирайся. Сделал от внешнего прерывания по фронту. То есть 1 на INT0 вызывает прерывание. Проект прикрепил.

[14.08 Кб]
0
Powto
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 4
27.09.2013, 23:16 15
2 deniurg1978 спасибо за проектик, будем разбираться! О результатах и вопросах сообщу позже
0
27.09.2013, 23:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2013, 23:16

GCC и AVR Studio 5 и AVR Studio 4.18
Доброго дня Всем! Кто может подсказать следующее - у меня установлена AVR...

AVR Studio 6 Avr simulator
Подскажите каким образом стартануть прогу в avr symulator с адреса boottooder...

Установить AVR Studio 6 после Visual Studio 10 SP1
При уже установленной Visual Studio 10 установщик AVR Studio 6 устанавливает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru