Страница 1 из 3

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

Добавлено: Пт ноя 27, 2009 12:18:45
САША1987
Помогите написать программу в CVAVR на mega128. Программа должна принимать 32 импульса с периодом 20 мкс, и присваивать соответствующим переменным значения этих импульсов (0 или 1). пробовал через массивы не получается. за ранее СПАСИБО

Добавлено: Пт ноя 27, 2009 13:06:22
Danko
для мега128 программ никогда не писал, тем более для такой задачи ресурсов мега128 будет недостаточно. Минимум нужно Четырехядерный Пеньтиум, а про тактовую частоту и говорить боюсь.

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

unsigned char i, x[32];

for (i=0; i<32; i++) {
  x[i]=PINB.0;
  delay_us(20);
}

Добавлено: Пт ноя 27, 2009 13:14:07
ibiza11
я пытался на Core 2 Duo 2.8 ГГц. не получилось..... :cry: :cry: :cry:

Добавлено: Пт ноя 27, 2009 14:34:37
САША1987
спасибо. может я не совсем правиьлно выразился (я только начинаю с МК). но задача моя состоит в следующем:
на вход МК поступают синхроимпульсы, 32 импульса по 1-му проводу (СИ) (всегда 1 с периодом 20 мкс, 32 шт.), по 2-му просто импульсы (ИМП) (тоже только 1,), но межимпульснй интервал разный. длительность импульсов 10 мкс, импульсы синхронны(рис.ris1 ниже)
мне надо пропустить дальше в схему 15 - 28 импульсы если:
1)1,8 импульсы = 1;
2)2-7 импульсы =0;
3)30, 31 импульсы =0;
4)количество единиц поступающих по 2-му проводу не четное;
5)количество СИ должно быть строго 32 шт.
Почти месяц мучаюсь.

Была идея сделать массив, каждой переменой массива присваивать значение соответствующего импульса, а исходя из полностью заполненного массива выполнять условия 1,2,3,4,5!

Добавлено: Пт ноя 27, 2009 16:16:38
Барсик
Курсовик? Интересно, почему выбрана такая ломовая мега для решения такой пустяковой задачки?
А в чём прблема то, в заполнении массива или в формировании выходных импульсов?

Добавлено: Пт ноя 27, 2009 16:20:32
Danko
во первых синхроимпульсы заведи на внешнее прерывание (по переднему фронту).

При возникновении прерывания читай данные из пина с информационными импульсами и загоняй их в массив.

Добавлено: Пт ноя 27, 2009 18:16:17
САША1987
Только мега 128 потому-что это только % эдак 10. Спасибо! так и делал, но проблема с записью в массив, мне кажется там ошибка ( пишет ошибку),но, не могу найти!
можешь начало проги написать, для CVAVR.

Добавлено: Пт ноя 27, 2009 20:42:45
Negor
А может автор покажет свой листинг и текст ошибки? Ну чтоб мы не подумали что автор хочет чтоб мы всё за него(автора) сделали. Это так-мысли вслух.

Добавлено: Пт ноя 27, 2009 21:44:07
САША1987
Вот текст:

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.7 beta 5 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 27.11.2009
Author : F4CG
Company : F4CG
Comments:


Chip type : ATmega128
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 1024
*****************************************************/

#include <mega128>
#include <stdio>
// Declare your global variables here
unsigned char a2[4][8], b=PINB.4, c=PINB.3
bit a=TOV1; //4р порта B принимает СИ, 3р порта В принимает только положительные импульсы
void initialization(void)
{

// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTE=0x00;
DDRE=0x00;

// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTF=0x00;
DDRF=0x00;

// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=T State3=T State2=T State1=T State0=T
PORTG=0x00;
DDRG=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0xFE;
TCNT1L=0xFE;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer 3 Stopped
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Timer 3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x20;
ETIMSK=0x20;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
}
void main (void)

{

{
if (a==1)
{a[0][0]=!(b-c);}
_delay_us(19);
if (a==1)
{a[0][1]=!(b-c);}
_delay_us(19);
if (a==1)
{a[0][2]=!(b-c);}
_delay_us(19);
if (a==1)
{a[0][3]=!(b-c);}
_delay_us(19);
if (a==1)
{a[0][4]=!(b-c);}
_delay_us(19);
if (a==1)
{a[0][5]=!(b-c);}
_delay_us(19);
if (a==1)
{a[0][6]=!(b-c);}
_delay_us(19);
if (a==1)
{a[0][7]=!(b-c);}
_delay_us(19);
if (a==1)
{a[1][0]=!(b-c);}
_delay_us(19);
if (a==1)
{a[1][1]=!(b-c);}
_delay_us(19);
if (a==1)
{a[1][2]=!(b-c);}
_delay_us(19);
if (a==1)
{a[1][3]=!(b-c);}
_delay_us(19);
if (a==1)
{a[1][4]=!(b-c);}
_delay_us(19);
if (a==1)
{a[1][5]=!(b-c);}
_delay_us(19);
if (a==1)
{a[1][6]=!(b-c);}
_delay_us(19);
if (a==1)
{a[1][7]=!(b-c);}
_delay_us(19);
if (a==1)
{a[2][0]=!(b-c);}
_delay_us(19);
if (TOV1==1)
{a[2][1]=!(b-c);}
_delay_us(19);
if (a==1)
{a[2][2]=!(b-c);}
_delay_us(19);
if (a==1)
{a[2][3]=!(b-c);}
_delay_us(19);
if (a==1)
{a[2][4]=!(b-c);}
_delay_us(19);
if (a==1)
{a[2][5]=!(b-c);}
_delay_us(19);
if (a==1)
{a[2][6]=!(b-c);}
_delay_us(19);
if (a==1)
{a[2][7]=!(b-c);}
_delay_us(19);
if (a==1)
{a[3][0]=!(b-c);}
_delay_us(19);
if (a==1)
{a[3][1]=!(b-c);}
_delay_us(19);
if (a==1)
{a[3][2]=!(b-c);}
_delay_us(19);
if (a==1)
{a[3][3]=!(b-c);}
_delay_us(19);
if (a==1)
{a[3][4]=!(b-c);}
_delay_us(19);
if (a==1)
{a[3][5]=!(b-c);}
_delay_us(19);
if (a==1)
{a[3][6]=!(b-c);}
_delay_us(19);
if (a==1)
{a[3][7]=!(b-c);}
_delay_us(19);
}
}

Добавлено: Пт ноя 27, 2009 23:50:15
САША1987
или еще тоже немножко по другому:


#include <mega128>
#include <stdio>
#include <math>

flash bit b, c, a, x[4][8];
void init (void)
{
DDRB=0x00;
PORTB=0x00;
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0xFE;
TCNT1L=0xFE;
TIMSK=0x20;
ETIMSK=0x20;
}

void main (void)
{
b=PINB.4;
c=PINB.3
a=TOV1;
if (a==1)
{x[0][0]=!(b-c);}
_delay_us(19);
if (a==1)
{x[0][1]=!(b-c);}
_delay_us(19);
if (a==1)
{x[0][2]=!(b-c);}
_delay_us(19);
if (a==1)
{x[0][3]=!(b-c);}
_delay_us(19);
if (a==1)
{x[0][4]=!(b-c);}
_delay_us(19);
if (a==1)
{x[0][5]=!(b-c);}
_delay_us(19);
if (a==1)
{x[0][6]=!(b-c);}
_delay_us(19);
if (a==1)
{x[0][7]=!(b-c);}
_delay_us(19);
if (a==1)
{x[1][0]=!(b-c);}
_delay_us(19);
if (a==1)
{x[1][1]=!(b-c);}
_delay_us(19);
if (a==1)
{x[1][2]=!(b-c);}
_delay_us(19);
if (a==1)
{x[1][3]=!(b-c);}
_delay_us(19);
if (a==1)
{x[1][4]=!(b-c);}
_delay_us(19);
if (a==1)
{x[1][5]=!(b-c);}
_delay_us(19);
if (a==1)
{x[1][6]=!(b-c);}
_delay_us(19);
if (a==1)
{x[1][7]=!(b-c);}
_delay_us(19);
if (a==1)
{x[2][0]=!(b-c);}
_delay_us(19);
if (a==1)
{x[2][1]=!(b-c);}
_delay_us(19);
if (a==1)
{x[2][2]=!(b-c);}
_delay_us(19);
if (a==1)
{x[2][3]=!(b-c);}
_delay_us(19);
if (a==1)
{x[2][4]=!(b-c);}
_delay_us(19);
if (a==1)
{x[2][5]=!(b-c);}
_delay_us(19);
if (a==1)
{x[2][6]=!(b-c);}
_delay_us(19);
if (a==1)
{x[2][7]=!(b-c);}
_delay_us(19);
if (a==1)
{x[3][0]=!(b-c);}
_delay_us(19);
if (a==1)
{x[3][1]=!(b-c);}
_delay_us(19);
if (a==1)
{x[3][2]=!(b-c);}
_delay_us(19);
if (a==1)
{x[3][3]=!(b-c);}
_delay_us(19);
if (a==1)
{x[3][4]=!(b-c);}
_delay_us(19);
if (a==1)
{x[3][5]=!(b-c);}
_delay_us(19);
if (a==1)
{x[3][6]=!(b-c);}
_delay_us(19);
if (a==1)
{x[3][7]=!(b-c);}
_delay_us(89);

}

Добавлено: Сб ноя 28, 2009 00:16:17
Аlex
Какой ужассс..... :cry:

Добавлено: Сб ноя 28, 2009 00:16:35
Danko

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

flash bit b, c, a, x[4][8];
если ты объявляешь flash, что ты при это имеешь ввиду?

главная функция main выполняется один раз, вот по этому в ней и организовывают "вечный" цикл

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

while (1) {}
возможно в других языках функции прописанные по тексту выше main и выполняются, но в Си это не так.

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

void init (void) {
...
}
у тебя никогда не выполнится

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

void main (void)
{
b=PINB.4;
c=PINB.3
a=TOV1;
if (a==1)
{x[0][0]=!(b-c);}
_delay_us(19);
if (a==1)
{x[0][1]=!(b-c);}
_delay_us(19);
и через 19 мкСек и через час у b и c будут одни и теже значения присвоенные в начале

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

b=PINB.4;
c=PINB.3
это не макроподстановка

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

#define b PINB.4
#define c PINB.3
при этом b и c это уже не переменные.

Добавлено: Сб ноя 28, 2009 00:28:30
САША1987
Спасибо! Вроде начинаю понимать.

Добавлено: Сб ноя 28, 2009 00:57:52
Qwertty
САША1987 писал(а):Только мега 128 потому-что это только % эдак 10. Спасибо! так и делал, но проблема с записью в массив, мне кажется там ошибка ( пишет ошибку),но, не могу найти!
можешь начало проги написать, для CVAVR.
Зачем массивы то? 32 бита прекрасно помещаются в unsigned long. Или в uint32_t по стандарту С99. Я уже с трудом вспоминаю разрядности стандартных типов так привык к новому стандарту языка.
Так что в тексте uint32_t - unsigned long, uint8_t unsigned char
И биты я нумерую с 0 по 31-ый :)
Итак прием:

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



#define DATA_PIN PINB
#define DATA_INPUT PB3
// дефайны от фонаря :)

volatile uint16_t RxData;		// сюда положим принятые данные. Если старший бит=1, то данные помещены в буфер



ISR(vector по фронту на тактовом входе) // это синтаксис GCC, замените на CV самостоятельно
{
static unsigned long RxBuf = 0; 	// приемный буфер
uint8_t  tmp;
	RxData <<= 1;
	if(DATA_PIN  & (1<<DATA_INPUT>> 24);		// старший байт
	if(tmp & 0x3E) return; 		// проверяем биты 1-6 на 0, если не 0 в буфере туфта 
	if((tmp & 0x81) != 0x81) return; 	// проверка 0 и 7-го бита, если не 1 - в буфере туфта
	tmp =(uint8_t)( RxBuf); 		// получим младший байт
	if(tmp & 0x03) return; 		// проверяем 30 и 31 бит, если не 0 в буфере туфта
// если дошли до сюда - в буфере валидный пакет 
	RxData = ((RxBuf >> 4) & 0x3FFF) | 0x8000; // поместим биты 14-27 в RxData, сбросив незначащие и установив старший бит
	RxBuf = 0; // необязательно, тут явно протокол с самосинхронизацией
}

int16_t main(void)
{
// настройки всякие переферии
// необходимо настроить любое прерывание по фронту тактового сигнала

	sei();
	while(1)
		{
		if(RxData |= 0)
			{
			// собственно тут чего то делаем не забыв сбросить старший бит в RxData
			// по окончании обработки RxData = 0;
			// в идеале это лучше сделать сразу, предварительно скопировав RxData в какую нибудь
			// локальную переменную запретив прерывания на время копирования
			}

		}

}
Это методика выделения из сплошного битового потока данных по шаблону. Не требует счетчика бит и позволяет восстановить синхронизацию при сбоях. В Вашем случае явно используется именно такой метод передачи - с шаблонами. В общем примерно так, если нигде не накосячил - писал "вживую" не проверяя. :)

Блин, чего то криво отображается код.
Вложу как txt

Добавлено: Сб ноя 28, 2009 21:34:47
САША1987
пробовал еще так все равно ошибки!

#include <mega128>
#define f PINB.5
#use_delay

// Declare your global variables here
unsigned char c, b, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32;
void init (void)
{
DDRB=0x00;
PORTB=0x00;
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0xFE;
TCNT1L=0xFE;
TIMSK=0x20;
ETIMSK=0x20;
}
void main(void)
{
while (1)
{
b=PINB.4, c=PINB.3;
if (f==1)
{x1=~(b-c);
}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x2=~(b-c);
}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x3=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x4=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x5=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x6=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x7=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x8=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x9=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x10=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x11=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x12=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x13=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x14=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x15=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x16=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x17=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x18=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x19=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x20=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x21=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x22=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x23=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x24=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x25=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x26=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x27=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x28=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x29=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x30=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x31=~(b-c);}
delay_us(19);
b=PINB.4, c=PINB.3;
if (f==1)
{x32=~(b-c);}
delay_us(89);


}
}

Добавлено: Сб ноя 28, 2009 22:05:28
Барсик
САША1987, прикрепляйте, пожалуйста, тексты своих программ в виде файлов. А то движок форума искажает текст программ...

Добавлено: Сб ноя 28, 2009 22:21:06
Сэр Мурр
САША1987 Переоформите свои посты. Кнопка "правка" поможет это сделать.

Добавлено: Сб ноя 28, 2009 23:24:34
САША1987
Может кто-то объяснит мне, как написать программу в том виде как я предлагаю? Я просто по другому не понимаю, пока-что. Спасибо за ранее, а закончить надо уже в середине следующей недели.

Добавлено: Вс ноя 29, 2009 08:58:22
Qwertty
САША1987 писал(а):Может кто-то объяснит мне, как написать программу в том виде как я предлагаю? Я просто по другому не понимаю, пока-что. Спасибо за ранее, а закончить надо уже в середине следующей недели.
А в каком виде Вы предлагаете??? Начните не с кода, а с алгоритма. Рспишите НА БУМАГЕ что, куда, зачем и как. Переложить готовый алгоритм на С займет не более 5 минут.
Кстати - что это за протокол? Кто этот сигнал производит? Эти посылки идут без пауз?

Добавлено: Вс ноя 29, 2009 09:50:43
urry
(C) Мыши плакали, кололись, но продолжали есть кактус...
В том виде, как Вы написали, программа неработоспособная полностью.
Смотрите, импульсы могут придти в любой момент, а не тогда, когда Вы запустили программу на исполнение. Второе - задержки по 19 микросекунд - Вы считаете, что выполнение кода анализа вообще не занимает время ? Теперь, если Вы даже правильно поймали первые пару импульсов, ошибка отсчета времени будет накапливаться.
Синхронизироваться нужно по каждому импульсу, поэтому. как правильно заметил Qwertty тактовые подаем на вход внешнего прерывания, который перед этим сконфигурим по rising - по нарастающему фронту.
Без вариантов.