Вопросы и ответы по написанию программ

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

у тебя никогда не выполнится
чтобы выполнилось надо в main() эту функцию вызвать:
на вход МК поступают синхроимпульсы, 32 импульса по 1-му проводу (СИ) (всегда 1 с периодом 20 мкс, 32 шт.), по 2-му просто импульсы (ИМП) (тоже только 1,)
а ниже вы пишите что нужно различать 0 и 1, чтото логики нету

Посмотрев картинку кое что понятно. Чтобы оно работало вам надо использовать прерывание по переднему фронту, так проще всего.

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

глобальные переменные:
int dataready;
int x[32];

в обработчике пишем:
.....
{
int i;
dataready=0;
delay_us(4);
if (PINB.3 == 0) x[i]=0; //PINB.3 - допустим тут ваши информационные импульсы
else
x[i]=1;
i++;
if (i==32) 
{
i=0;
dataready=1;
}
}

Чтобы выполнить твои условия 
void analyse()
{
int j, tmp;
if (x[0] == 1 && x[7] == 1)
 if (x[1] == 0 && x[2] == 0 && x[3] == 0 && x[4] == 0 && x[5] == 0 && x[6] == 0)
  if (x[29] == 0 && x[30] == 0)
   {
     for (j=0; j<32; j++)
      tmp +=x[j];
     if ((tmp%2) != 0)
       if (dataready)
         transmit();
   }
}

Функция передачи 15-28 импульса

void transmit()
{
int i;
for (i=14;i<28;i++)
{
PORTD.5 = 1; //синхроимпульс на выход, если он нужн
if (x[i] == 0) PORTD.4 = 0; // порт вывода данных
else
PORTD.4 = 1;
delay_us(10); // корректировать по времени исполнения кода
PORTD.5 = 0;
PORTD.4 = 0;
delay_us(10);  // корректировать по времени исполнения кода
}
}

Как то так... Не проверял, но логика работы такая. Играйтесь
Не знаю, тут может и не важно это - но у АВР значение порта устанавливается не сразу, проходит несколько тактов. Поэтому если записать в порт значение, потом тут же его считать - будет бред. Просто вспомнил решил написать, может кому пригодится
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

BCluster, прикольно ты массив объявил и потом с ним работаешь...
Мелкокомпиляторы не поддерживают битовые массивы, не ?
Даже если попытаться объявить массив структур их одного бита,
struct{
unsigned bit_:1;
}bite[32];
ничего не получится, наверное, потому что структура не может занимать размер меньше байта. Неоправданный расход оперативки.
Уже лучше через юнионы.

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

#define BITSET(var,bitno) ((var) |= 1 << (bitno))   
#define BITCLR(var,bitno) ((var) &= ~(1 << (bitno)))
union{
struct{
unsigned char byte;
}byte_[4];
unsigned long all;
}un;
 volatile char count;
//-----------------------------------
в прерывании 
{
char tmp1,tmp2;
tmp1=count&0x7;
tmp2=count&0x18;
switch(tmp2)
	{
	case 00:
	if(PINB.3)
		{
		BITSET(un.byte_[0].byte,tmp1);
		}
		else
		{
		BITCLR(un.byte_[0].byte,tmp1);
		}
		break;
	case 08:
	if(PINB.3)
		{
		BITSET(un.byte_[1].byte,tmp1);
		}
		else
		{
		BITCLR(un.byte_[1].byte,tmp1);
		}
		break;
	case 0x10:
	if(PINB.3)
		{
		BITSET(un.byte_[2].byte,tmp1);
		}
		else
		{
		BITCLR(un.byte_[2].byte,tmp1);
		}
		break;
	case 0x18:
	if(PINB.3)
		{
		BITSET(un.byte_[3].byte,tmp1);
		}
		else
		{
		BITCLR(un.byte_[3].byte,tmp1);
		}
		break;
	      }
  count++;
if(count == 32) flag=1;
}
 Потом 
un.all&=MASK;
if(un.all^MASK_ETALON) и так далее
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

urry, не поддерживают битовые массивы, я их не объявлял нигде... Что я не так объявил?

расход оперативки? возможно. Только вы это автору объясните, который две строчки написать не может, а вы ему юнионы. У него там 128 мега, с памятью проблем нет (:
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Вот эти строчки мне непонятны, что с чем складываем..

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

 
 int j, tmp;   
 for (j=0; j<32; j++)
      tmp +=x[j];
     if ((tmp%2) != 0)
       if (dataready) 
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

тут мы складываем все элементы массива, определяем четность количества единиц - можно по другому написать если хотите:
for (j=0; j<32; j++)
tmp^=x[j];
if (tmp == 1)
...
Контактная информация:
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

Смотрю на Вас и чувствую себя идиотом
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18723
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

САША1987 писал(а):Смотрю на Вас и чувствую себя идиотом
надо было лекции посещать и учебники/книжки читать, которые препод рекомендовал. в крайнем случае, проявить инициативу и самостоятельно найти нужную литературу.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

подскажите, все время пишет одну ошибку undifined symbol "delay_us",
что надо дописать, "программирую" CVAVR
Пометил вазу. Хорошо...
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

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

#include <delay>

в начало
PS форум морочит голову - там где delay - delay . h бзе пробелов
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

заработало #include <delay> спасибо
Пометил вазу. Хорошо...
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

вот что у меня пока получилось с массивами:

#include <mega128>
#include <delay>
#include <stdio>
#include <math>
#define i PINB.1
int mas[32];
void init (void)
{
DDRB=0x00;
PORTB=0x00;
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0xFE;
TCNT1L=0xFE;
TIMSK=0x20;
}

void main (void)
{
for (i=0; i<32; i++) {
mas=~(PINB.0-PINB.1);
delay_us(19);}
}
Вложения
.txt
(333 байт) 181 скачивание
Пометил вазу. Хорошо...
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

И че оно так работает?)
У тебя i объявлено как макроопределение
mas=~(PINB.0-PINB.1);

а это что такое? Хоть попробуй понять что ты пишешь, а не лишь бы пиши... Тем более тебе сказали что оно должно синхронизироваться на каждом импульсе. Я пару постов назад распинался как это сделать. Посмотри, подумай, спроси наконец и сделай нормально.
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

Правильно ли будет если я напишу #define b PINB.1, т.е. я смогу проводить какие-либо арифметические операции с переменной b?(например вычитание) Будет ли этой переменой присваиваться значение пина?
Пометил вазу. Хорошо...
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

b это никакая не переменная. Слова "#define b PINB.1" означают только лишь то, что вместо символа b компилятор будет видеть PINB.1 И соответственно скомпилирует текст программы. И ничего более...
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

Как мне тогда присваивать переменной значение которое сейчас висит на пине? Что написать?
Пометил вазу. Хорошо...
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Написать надо примерно то, что в присоединённом файле. И вычитать Вам из бита синхроимпульса информационный бит ни нафиг не надо, потому, как, бит синхроимпульса всегда единица. Достаточно просто инвертировать информационный бит.
Вложения
kot87-2.txt
(1.35 КБ) 188 скачиваний
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

Подскажите, а как можно посчитать параметры ШИМ для мега16. или ссылку киньте. Пробовал и частоту менять и регистры OCR1BH=0x03; OCR1BL=0xFF; не получается, надо импульсы прямоугольные посчитать 50/50
Пометил вазу. Хорошо...
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

написал программу которая выдает 32 импульса 50/50 работает как надо, но есть проблема. никак не могу сделать так что-бы она запускалась по моей команде (например при появлении на одном из пинов появляется 1 при нажатиии на кнопку)
Вложения
32импульса.txt
(1 КБ) 255 скачиваний
Пометил вазу. Хорошо...
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт ноя 27, 2009 12:09:06

Сообщение САША1987 »

написал программу которая выдает 32 импульса 50/50 работает как надо, но есть проблема. никак не могу сделать так что-бы она запускалась по моей команде (например при появлении на одном из пинов появляется 1 при нажатии на кнопку)
Вложения
32импульса.txt
(1 КБ) 204 скачивания
Пометил вазу. Хорошо...
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

Организуйте глобальную переменную и используйте её как флаг. В самом начале обработчика прерывания проверяйте значение этой переменной. Если она == 0, то в обработчике прерывания ничего делать не надо... Как только в теле основной программы присвоите ей значение не равное нулю, так сразу начнёт работать Ваше прерывание, которое генерит Ваши импульсы...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»