Здравствуйте. Недавно начал изучать основы программирования в 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;}}};
http://radiokot.ru/circuit/digital/home/168/ - делаю такую же штуку по точно такому же принципу. Только схема отличается.)
Я только начал это изучать, поэтому ошибки неизбежны. Вот принципиалка
#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 нет, но и без него видно ваши грубые косяки.
Не говоря уже о логике работы программы:
это что такое и, главное, нафига?
В тело if вы попадете только если у вас на всем порте В (на всех 8-ми пинах от 0-го до 7-го) будет логическая единица. У вас там 3 кнопки, кварц весит, на секундочку.
Допустим, у вас переменные y и z имеют разные значения. Я повторяю свой вопрос: как вы собрались выходить из этого цикла в прерывании?
Это выражение, если вы почитали ту ссылку, что я скинул - должно считать длину одного сегмента.) 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;}
}
Теперь верю что собирается, хотя точку с запятой после фигурной скобки убрать можете. Также в main пара фигурных скобок дублирующая, но это так, замечание от компилятора не более того.
Как результат в протеус? Что-то происходит?
TomWake, вы расставьте отступы в исходнике, комментариев накидайте, хоть как-то опишите, что должна делать программа (про таймеры в первом посте понятно, но этого мало). Ещё тут на форуме есть тэг 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;}
}
// 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;}}}}}}