Не могу отладить программу часов на HDD

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

Здравствуйте. Недавно начал изучать основы программирования в CodeVision AVR. Мне необходимо написать программу для стробоскопических часов реального времени на базе HDD. Помогите с ошибками в коде. ))
Таймер 1 считает часы реального времени от внешнего кварца на 16. Второй таймер должен каждые 10микросекунд вызывать прерывание.


#include <mega8.h>
#include <delay.h>
char second, minute, hour;
long x=0,y=0,z=0,s=0;
// Declare your global variables here
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
second++;
if(second == 60)
{ second = 0;
minute++;
if(minute == 60)
{ minute = 0;
hour++;
if(hour == 12)
hour = 0;
}
}}

int (void)
// Timer2 CTC
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
x++;
if (PORTB==1){z=x/60;x=0;}
{s++;
y++;}
while (s!= second, minute, hour*5)
{
while (y!=z)
{PORTC.0=1;
PORTC.3=1;}
{y=0;}}
if (s == second)
{while (y!=z)
{PORTC.1=1;
PORTC.4=1;}y=0;}
else
{if (s == minute)
{while (y!=z)
{PORTC.2=1;
PORTC.4=1;};y=0;}
else
{if (s == hour)
{while (y!=z)
{PORTC.0=1;
PORTC.5=1;
PORTC.4=1;}y=0;}}};

PORTB=0x00;
DDRB=0x00;


PORTC=0x00;
DDRC=0x7F;


PORTD=0x00;
DDRD=0x00;

TCCR1A=0x00;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x09;
TCNT2=0x00;
OCR2=0x78;

TIMSK=0x60;

#asm("sei")
while (1)
{}}}}
Вложения
106437_480x360_00.jpg
Часы
(85.52 КБ) 343 скачивания
Реклама
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

И что не работает то ?
int (void) <<<--------------------------------- Что эта за фигня ?
// Timer2 CTC
interrupt [TIM2_COMP] void timer2_comp_isr(void)
В обработчике таймера 2 наверное скобочек не хватает не увидел где он закрывается.
И вообще где main ?
Реклама
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

main void (main)
// Timer2 CTC
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
x++;
if (PORTB==1){z=x/60;x=0;}
{s++;
y++;}
while (s!= second, minute, hour*5)
{
while (y!=z)
{PORTC.0=1;
PORTC.3=1;}
{y=0;}}
if (s == second)
{while (y!=z)
{PORTC.1=1;
PORTC.4=1;}y=0;}
else
{if (s == minute)
{while (y!=z)
{PORTC.2=1;
PORTC.4=1;};y=0;}
else
{if (s == hour)
{while (y!=z)
{PORTC.0=1;
PORTC.5=1;
PORTC.4=1;}y=0;}}};

Так?) Где не хватает скобочек? Найти не могу.) И обработчик прерывания до main void (main) или после?)
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

void main (void)
{
// Timer2 CTC
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
x++;
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

Ошибки исправил, но в Протеусе ничего не работает.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Это вы только явные ошибки исправили. Теперь ловите логических мух.

Нахера, прости Господи, вы прерывание в main запихнули????????????? :shock: :facepalm: В жизни не поверю что это компилируется :facepalm:

Кинули бы свою схему, проще было бы разобраться в вашем коде. Навскидку, вас интересует весь порт В в единице или только конкретный пин?

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

if (PORTB==1)
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Вот вам ваш код в удобоваримом виде. Там действительно не хватает двух закрывающихся скобок.
Спойлер

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

void main(void)
{
	// Timer2 CTC
	interrupt [TIM2_COMP] void timer2_comp_isr(void)
	{
		x++; 
		if (PORTB==1)
		{
			z = x / 60;
			x = 0;
		}
		{
			s++;
			y++;
		}
		while (s != second, minute, hour * 5)
		{ 
			while (y != z) 
			{
				PORTC.0 = 1;
				PORTC.3 = 1;
			}
			{
				y=0;
			}
		}
		if (s == second)
		{
			while (y != z)
			{
				PORTC.1 = 1;
				PORTC.4 = 1;
			}
			y=0;
		}
		else
		{
			if (s == minute)
			{
				while (y != z)
				{
					PORTC.2 = 1;
					PORTC.4 = 1;
				};
				y=0;
			}
			else
			{
				if (s == hour)
				{
					while (y != z)
					{
						PORTC.0 = 1;
						PORTC.5 = 1;
						PORTC.4 = 1;
					}
					y=0;
				}
			}
		};
Точка с запятой после фигурной скобки улыбает :))
Объясните мне как вы можите выйти из этого цикла

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

while (y != z)
если внутри его переменные y и z не меняются, а сам цикл в прерывании?
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

http://radiokot.ru/circuit/digital/home/168/ - делаю такую же штуку по точно такому же принципу. Только схема отличается.)
Я только начал это изучать, поэтому ошибки неизбежны. Вот принципиалка
Вложения
Безымянный.jpg
(54.56 КБ) 313 скачиваний
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

#include <mega8.h>
#include <delay.h>
char second, minute, hour;
long x=0,y=0,z=0,s=0;
// Declare your global variables here
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
second++;
if(second == 60)
{ second = 0;
minute++;
if(minute == 60)
{ minute = 0;
hour++;
if(hour == 12)
hour = 0;
}
}}
// Timer2 CTC
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
x++;
s++;
y++;
if (PORTB==1){z=x/60;x=0;}
while (s!= second, minute, hour*5)
{
while (y!=z)
{PORTC.0=1;
PORTC.3=1;}
{y=0;}}
if (s == second)
{while (y!=z)
{PORTC.1=1;
PORTC.4=1;}y=0;}
else
{if (s == minute)
{while (y!=z)
{PORTC.2=1;
PORTC.4=1;};y=0;}
else
{if (s == hour)
{while (y!=z)
{PORTC.0=1;
PORTC.5=1;
PORTC.4=1;}y=0;}}}}

void main (void)

{ {


// Declare your local variables here

// Input/Output Ports initialization
// 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
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0x7F;

// 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;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: CTC top=OCR2
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x09;
TCNT2=0x00;
OCR2=0x78;

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

// Global enable interrupts
#asm("sei")
while (1)
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Спойлер

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

#include <mega8.h>
#include <delay.h>

char second, minute, hour;
long x=0,y=0,z=0,s=0;

// Declare your global variables here
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
	second++; 
	if(second == 60) 
	{ 
		second = 0;
		minute++; 
		if(minute == 60) 
		{
			minute = 0;
			hour++; 
			if(hour == 12) 
				hour = 0;
		}
	}
}

// Timer2 CTC
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
	x++; 
	s++;
	y++;
	if (PORTB == 1)
	{
		z=x/60;
		x=0;
	}
	while (s!= second, minute, hour*5)
	{ 
		while (y!=z) 
		{
			PORTC.0=1;
			PORTC.3=1;
		}
		{
			y=0;
		}
	}
	if (s == second)
	{
		while (y != z)
		{
			PORTC.1=1;
			PORTC.4=1;
		}
		y=0;
	}
	else
	{
		if (s == minute)
		{
			while (y!=z)
			{
				PORTC.2=1;
				PORTC.4=1;
			};
			y=0;
		}
		else
		{
			if (s == hour)
			{
				while (y != z)
				{
					PORTC.0=1;
					PORTC.5=1;
					PORTC.4=1;
				}
				y=0;
			}
		}
	}
}

void main (void)
{ 
{ 


	// Declare your local variables here

	// Input/Output Ports initialization
	// 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
	// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
	// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
	PORTC=0x00;
	DDRC=0x7F;

	// 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;

	// Timer/Counter 1 initialization
	// Clock source: System Clock
	// Clock value: 16000,000 kHz
	// Mode: CTC top=OCR1A
	// OC1A output: Discon.
	// OC1B output: Discon.
	// Noise Canceler: Off
	// Input Capture on Falling Edge
	// Timer1 Overflow Interrupt: Off
	// Input Capture Interrupt: Off
	// Compare A Match Interrupt: Off
	// Compare B Match Interrupt: Off
	TCCR1A=0x00;
	TCCR1B=0x09;
	TCNT1H=0x00;
	TCNT1L=0x00;
	ICR1H=0x00;
	ICR1L=0x00;
	OCR1AH=0x00;
	OCR1AL=0x00;
	OCR1BH=0x00;
	OCR1BL=0x00;

	// Timer/Counter 2 initialization
	// Clock source: System Clock
	// Clock value: 16000,000 kHz
	// Mode: CTC top=OCR2
	// OC2 output: Disconnected
	ASSR=0x00;
	TCCR2=0x09;
	TCNT2=0x00;
	OCR2=0x78;

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

	// Global enable interrupts
	#asm("sei")
	while (1)
Вы свой код или не компилируете или кидаете на форум то, на что компилятор ругается. Хотя бы удосужились ошибки посмотреть. У меня CodeVisionAVR нет, но и без него видно ваши грубые косяки.
Не говоря уже о логике работы программы:
это что такое и, главное, нафига?

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

void main (void)
{ 
{ 
main у вас не закрывается. Последняя запись

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

while (1)
и все... прострация. Если вы хотите сделать пустой бесконечный цикл, то

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

while (1) ;
и фигурную скобку main закройте.
Теперь явные логические ошибки. Они все те же:

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

if (PORTB == 1)
	{
		z=x/60;
		x=0;
	}
В тело if вы попадете только если у вас на всем порте В (на всех 8-ми пинах от 0-го до 7-го) будет логическая единица. У вас там 3 кнопки, кварц весит, на секундочку.
Допустим, у вас переменные y и z имеют разные значения. Я повторяю свой вопрос: как вы собрались выходить из этого цикла в прерывании?

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

while (y!=z) 
		{
			PORTC.0=1;
			PORTC.3=1;
		}
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

Это выражение, если вы почитали ту ссылку, что я скинул - должно считать длину одного сегмента.) Y должен считаться до того момента, пока не станет равен значению z (посчитанная МК длина сегмента ). Потом цикл проверки должен повторяться.
Код компилируется без проблем. Не знаю почему. )


Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
char second, minute, hour;
long x=0,y=0,z=0,s=0;
// Declare your global variables here
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
second++;
if(second == 60)
{ second = 0;
minute++;
if(minute == 60)
{ minute = 0;
hour++;
if(hour == 12)
hour = 0;
}
}}
// Timer2 CTC
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
x++;
s++;
y++;
if (PORTB.0==1){z=x/60;x=0;}
}

void main (void)

{ {


// Declare your local variables here

// Input/Output Ports initialization
// 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
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0x7F;

// 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;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: CTC top=OCR2
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x09;
TCNT2=0x00;
OCR2=0x78;

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

// Global enable interrupts
#asm("sei")
while (1)
{while (s!= second, minute, hour*5)
{
while (y!=z)
{PORTC.0=1;
PORTC.3=1;}
{y=0;}}
if (s == second)
{while (y!=z)
{PORTC.1=1;
PORTC.4=1;}y=0;}
else
{if (s == minute)
{while (y!=z)
{PORTC.2=1;
PORTC.4=1;};y=0;}
else
{if (s == hour)
{while (y!=z)
{PORTC.0=1;
PORTC.5=1;
PORTC.4=1;}y=0;}}}};}}
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Теперь верю что собирается, хотя точку с запятой после фигурной скобки убрать можете. Также в main пара фигурных скобок дублирующая, но это так, замечание от компилятора не более того.
Как результат в протеус? Что-то происходит?
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

Нет. Вообще ничего. Вместо оптопары поставил генератор импульсов прямоугольных. Но ни один цвет не загорается.(
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Вывод com uln2003 висит на +питания?
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

Тут дело не в ULN, а в том, что МК вообще никакого сигнала не выдает.
Прикрепляю фото схемы в Протеус.
Вложения
Безымянный.jpg
(137.25 КБ) 332 скачивания
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

Старую схему отправил.) Вот нормальная._
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

...
Вложения
11.jpg
(151.88 КБ) 331 скачивание
Встал на лапы
Аватара пользователя
Сообщения: 109
Зарегистрирован: Пн янв 26, 2015 07:48:56
Откуда: Москва, Троицк

Сообщение diafour »

TomWake, вы расставьте отступы в исходнике, комментариев накидайте, хоть как-то опишите, что должна делать программа (про таймеры в первом посте понятно, но этого мало). Ещё тут на форуме есть тэг code - текст исходника помещайте в него. Так приятнее читать будет и понятнее станет ваша проблема другим.

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

while (s!= second, minute, hour*5)
Что это?
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

Вот комментарии. Думаю, дело в s счетчике.

code

Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
char second, minute, hour;
long x=0,y=0,z=0,s=0;
// Declare your global variables here
//Таймер реального времени на кварце 16 mGhz. Большой точности не надо._)
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
second++;
if(second == 60)
{ second = 0;
minute++;
if(minute == 60)
{ minute = 0;
hour++;
if(hour == 12)
hour = 0;
}
}}
/*Таймер отсчета временных интервалов по 10 мкс.
//Переменная x - время одного оборота, y - счетчик одного сегмента
s - счетчик для определения когда зажигать часы, миуты и секунды. Походу дело в нем*/
// Timer2 CTC
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
x++;
//PORTC.0=x;
s++;
//PORTC.1=x;
y++;
//PORTC.2=x;
if (PORTB.0==1){z=x/60;x=0;s=0;}
}

void main (void)

{


// Declare your local variables here

// Input/Output Ports initialization
// 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
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0x7F;

// 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;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: CTC top=OCR2
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x29;
TCNT2=0x00;
OCR2=0x78;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x60;
TIMSK=0x80;

// Global enable interrupts
#asm("sei")
while (1)
{ /*сравнение с секундами, минутами и часами, чтоб стрелки выводить.
Остальной код для выведения стрелок*/
if (s!= second, minute, hour*5)
{
while (y!=z)
{PORTC.0=1;
PORTC.3=1;}
{y=0;}}
else
{if (s == second)
{while (y!=z)
{PORTC.1=1;
PORTC.4=1;}y=0;}

else

{if (s == minute)
{while (y!=z)
{PORTC.2=1;
PORTC.4=1;};y=0;}

else

{if (s == hour)
{while (y!=z)
{PORTC.0=1;
PORTC.5=1;
PORTC.4=1;}y=0;}}}}}}
Родился
Сообщения: 15
Зарегистрирован: Чт май 14, 2015 10:27:35

Сообщение TomWake »

Как у вас теги оформлять?)
Ответить

Вернуться в «AVR»