вывод числа вы должны делать по мере того, как число изменилось думал, думал................., не могу я придумать алгоритм работы данной функции..........., кое-какие обрывки мыслей есть, а слепить их в кучу не могу..............., предполагаю что в данной ф-ции должно производится сравнение переменной var с другой переменной ........, а вот что дальше и как быть не знаю......(((
Experience is the name everyone give to his mistakes.
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7314
ARV(Администратор)
Администратор
Постов: 2386
В ответ на: Мелкие вопросы 18.03.2012 23:01
Репутация: 176  
плохо. эта функция должна получать в виде параметра число, которое затем должна разбить на части, которые заносятся в массив индикаторов. все, как у вас было раньше без функции.
Не стыдно не знать, стыдно не учиться
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7315
FreshMan(Пользователь)
Специалист
Постов: 177
В ответ на: Мелкие вопросы 19.03.2012 00:16
Репутация: 1  
да это как бы понятно.............., мне непонятно как она должна определять само число..........., изменилось ли оно от предыдущего вывода или нет, если не изменилось то и выводить его не следует..........., вот этот момент непонятен.......(((
Experience is the name everyone give to his mistakes.
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7316
ARV(Администратор)
Администратор
Постов: 2386
В ответ на: Мелкие вопросы 19.03.2012 10:27
Репутация: 176  
эта функция может и не определять, изминилось число или нет - ей это и не нужно. это, если необходимо, вы должны делать перед вызовом этой функции. а дело функции тупо сформировать нужные значения в массиве индикации.
Не стыдно не знать, стыдно не учиться
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7323
FreshMan(Пользователь)
Специалист
Постов: 177
В ответ на: Мелкие вопросы 19.03.2012 21:53
Репутация: 1  
написал:
Code:
#include <mega8.h>
#include <delay.h>
#define PC4 4
#define PC5 5
#define DIG1 (1<<PC4)
#define DIG2 (1<<PC5)
#define DELTA 1
#define MAX_VAL 99
#define MIN_VAL 0
char index;
char number[2];
int var = MIN_VAL; // начальное значение числа пусть будет минимальным
int delta_value = DELTA; // приращение по умолчанию
void output(int var)
{
number[0]=var%10;
number[1]=var/10;
}
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
PORTC=0;
PORTC = number[index & 1]; // вывели в дешифратор нужный код
PORTC |= index & 1 ? DIG2 : DIG1; // включили нужный индикатор
index++; // готовим номер разряда/индикатора для следующего прерывания
}
void main(void)
{
PORTC=0x00;
DDRC=0x7F;
PORTD=0xFF;
DDRD=0x00;
TCCR1A=0x00;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x02;
OCR1AL=0x71;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei")
while (1)
{
output(var); // вывели текущее значение числа
delay_ms(1000);
if((var >= MAX_VAL)||(var<= MIN_VAL)) {delta_val = - delta_val;};
var += delta_val; // изменяем число
};
}
при компиляции выдает ошибки:
Error: C:Documents and SettingsUserРабочий стол66.c(77): undefined symbol 'delta_val'
Error: C:Documents and SettingsUserРабочий стол66.c(79): undefined symbol 'delta_val'
к чему бы это ? ведь указанная константа у меня уже инициализирована .....(((
Experience is the name everyone give to his mistakes.
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7324
ARV(Администратор)
Администратор
Постов: 2386
В ответ на: Мелкие вопросы 19.03.2012 23:45
Репутация: 176  
может, повнимательнее посмотрите, ЧТО ИМЕННО у вас инициализировано и НА ЧТО именно компилятор ругается? так и будем по всякому пустяку на форуме спрашивать? может, надо чуть напрягаться все-таки?
Не стыдно не знать, стыдно не учиться
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7326
FreshMan(Пользователь)
Специалист
Постов: 177
В ответ на: Мелкие вопросы 21.03.2012 19:01
Репутация: 1  
переделал..........., компилится нормально но не работает...........,подскажите пожалуйста в какой степи искать ошибку
Code:
#include <mega8.h>
#include <delay.h>
#define PC4 4
#define PC5 5
#define DIG1 (1<<PC4)
#define DIG2 (1<<PC5)
#define DELTA 1
#define MAX_VAL 99
#define MIN_VAL 0
char index;
char number[2];
int var = MIN_VAL; // начальное значение числа пусть будет минимальным
int delta_value = DELTA; // приращение по умолчанию
void output(int var)
{
number[0]=var%10;
number[1]=var/10;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void) // Timer1 срабатывает каждые 5мс
{
PORTC=0;
PORTC = number[index & 1]; // вывели в дешифратор нужный код
PORTC |= index & 1 ? DIG2 : DIG1; // включили нужный индикатор
index++; // готовим номер разряда/индикатора для следующего прерывания
}
void main(void)
{
PORTC=0x00;
DDRC=0x7F;
PORTD=0xFF;
DDRD=0x00;
TCCR1A=0x00;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x02;
OCR1AL=0x71;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei")
while (1)
{
output(var); // вывели текущее значение числа
delay_ms(1000);
if((var >= MAX_VAL)||(var<= MIN_VAL)) {delta_value = - delta_value;};
var += delta_value; // изменяем число
};
}
Содержимое поста отредактировано: FreshMan, в: 21.03.2012 19:02
Experience is the name everyone give to his mistakes.
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7327
ARV(Администратор)
Администратор
Постов: 2386
В ответ на: Мелкие вопросы 21.03.2012 22:45
Репутация: 176  
if((var >= MAX_VAL)||(var<= MIN_VAL)) {delta_value = - delta_value;}; вот это у вас что означает? особенно то, что в скобках if-а? как я вам ранее советовал, прочитайте это по-русски и подумайте над тем, что за условие вы написали.
Не стыдно не знать, стыдно не учиться
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7328
FreshMan(Пользователь)
Специалист
Постов: 177
В ответ на: Мелкие вопросы 21.03.2012 23:15
Репутация: 1  
смысл приведенной вами команды в следующем: если переменная var стала больше или равна 99 ИЛИ она меньше или равна 0 то мы меняем знак приращения на противоположный.......
Содержимое поста отредактировано: FreshMan, в: 21.03.2012 23:16
Experience is the name everyone give to his mistakes.
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7329
FreshMan(Пользователь)
Специалист
Постов: 177
В ответ на: Мелкие вопросы 26.03.2012 22:51
Репутация: 1  
ну вот, сбылась мечта идиота, я написал примитивную прогу для своих будущих часов......
Code:
#include <mega8.h>
#include <delay.h>
#define kn_sec_reset PINC.0 // на 0 пин порта С подключена кнопка сброса секунд
#define kn_min_up PINC.1 // на 1 пин порта С подключена кнопка инкремента минут
unsigned int x;
unsigned char sec, min,i;
unsigned char number[4]; // в этом массиве мы будем хранить десятки и единици секунд и минут
unsigned char znak[4]={16,32,64,128}; // в этом массиве мы храним номер анода индикатора определенного разряда
interrupt [TIM0_OVF] void timer0_ovf_isr(void)// Timer 0 срабатывает каждую мс
{
// Reinitialize Timer 0 value
TCNT0=0x83;
// Place your code here
if(++x==1000) {sec++; x=0;};
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)// Timer 1 срабатывает каждые 5мс
{
PORTD=0;
switch (i)
{
case 0:PORTD=number[i]|znak[i];break;
case 1:PORTD=number[i]|znak[i];break;
case 2:PORTD=number[i]|znak[i];break;
case 3:PORTD=number[i]|znak[i];break;
};
if (++i==4)i=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=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=P State0=P
PORTC=0x03;
DDRC=0x00;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
TCCR0=0x02;
TCNT0=0x83;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,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: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x02;
OCR1AL=0x71;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x11;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
number[0]=sec%10; //в массив записываем остаток от деления преременной sec
number[1]=sec/10; // в массив записываем целую часть от деления преременной sec
number[2]=min%10; // в массив записываем остаток от деления преременной min
number[3]=min/10; // в массив записываем целую часть от деления преременной min
if (sec==60) {sec=0; min++;};
if (min==60) min=0;
if (kn_sec_reset==0) {delay_ms(10);sec=0; while(kn_sec_reset==0){}; delay_ms(10);};
if (kn_min_up==0) {delay_ms(10);min++; while(kn_min_up==0){}; delay_ms(10);};
};
}
Experience is the name everyone give to his mistakes.
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.