ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
431814
mazur (10.08.2013 21:29, просмотров: 79157) Kceния
Вопросы по переменным. Предыдущие вопросы удалили, сохранить не успел. Так что извините за повтор. Прошу отнестись с пониманием, на примерах из книжек не все понятно. На приведенных примерах мне легче понять, чем порой из книжек. Пока, когда переменные в одном файле, что-то получается. Когда переменная в пределах одной функции, тоже нормально. Скажем, здесь вопросов нет: //------------------------------------------------------------------------ void lcd_send_byte (u08 lcd_data) { DATA_DDR = (DATA_DDR | 0xF0); setb(CMD_PORT, EN); DATA_PORT = (DATA_PORT & 0x0F) | (lcd_data & 0xF0); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); clrb(CMD_PORT, EN); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); lcd_data = lcd_data << 4; lcd_send_nibble (lcd_data); } //------------------------------------------------------------------------ Сейчас затруднения следующие. 1 - Как правильно объявлять глобальные переменные, к которым могут обращаться любые функции, как подключенные в данный момент к проекту, так и не подключенные. Эти переменные могут использоваться и в функции main. То есть приведите пожалуйста примеры, что писать в *.h и в *.c. И, например, программа может из одного файла. 2 - Как правильно объявлять переменные в пределах одного модуля. И как правильно объявлять переменные к которым могут обращаться другие функции. Скажем, флаги, состояния автоматов, параметры. Пока получилось следующее: в *.h объявил extern u08 st_flags, в *.c ниже. Когда объявил static компилятор скомпилировал пустую функцию. С extern у st_flags в разных функция вроде один и тот же адрес. Файл *.h: #include "sys_timer.h" #include "avrlibtypes.h" //======================================================================== #define ST_TCNT TCNT0 #define ST_TIMSK TIMSK #define ST_OCIE OCIE0 #define ST_OCR OCR0 #define ST_TCCR TCCR0 #define CS0 CS00 #define CS1 CS01 #define CS2 CS02 //======================================================================== //======================================================================== #define SYS_TICK 1 // Ïåðèîä ñèñòåìíîãî òàéìåðà 1 ìñ //======================================================================== //======================================================================== #define ST_SIZE 2 //======================================================================== //======================================================================== //--------------------- Ôëàãè ñèñòåìíûõ òàéìåðîâ ------------------------- #define SYS_TICK_FLG 0 //------------------------------------------------------------------------ //------------------------------------------------------------------------ #define ST_UNLOCK_FLG 0 // Ôëàã àêòèâíîñòè òàéìåðà. #define ST_TIME_OUT_FLG 1 // Âðåìÿ âûøëî. //======================================================================== //======================================================================== extern u08 st_flags; //======================================================================== #define ST_QUANTITY 3 struct {u08 st_flags; u16 st_cnt} Sys_Timers_Queue [ST_QUANTITY]; enum { ST_KBD=0 }; void init_sys_timer(void); void service_timers(void); #endif Файл *.c: //======================================================================== #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "avrlibtypes.h" #include "sys_timer.h" //======================================================================== //======================================================================== u08 st_flags; void init_sys_timer(void) { st_flags = 0; ST_TCNT = 0; ST_TIMSK |= 1<<ST_OCIE; ST_OCR = (250); ST_TCCR |= (1<<CS0 | 1<<CS1); } //------------------------------------------------------------------------ //------------------------------------------------------------------------ u08 st_flags; ISR(TIMER0_COMP_vect) { ST_OCR = ST_OCR-(-250); st_flags |= 1<<SYS_TICK_FLG; } /* //======================================================================== Service_Timers: // Служба таймеров. sbrs FLAGS,SYS_TICK_FLG // Флаг очередного отсчета системного таймера установлен? ret // Нет, выход. cbr FLAGS,1<<SYS_TICK_FLG // Установлен, сброс флага. ldy ST_CNT_QUEUE // Указатель на начало очереди системных таймеров. clr CNT Service_Timers_ST_Cycle: ld r16,Y // Считывание байта-статуса системного таймера. sbrs r16,ST_UNLOCK_FLG // Таймер заблокирован? rjmp Process_Next_System_Timer // Да, переход к обработке следующего таймера. ldd r24,Y+1 // Считывание младшего байта таймера. ldd r25,Y+2 // Считывание старшего байта таймера. sbiw r24,1 // Уменьшаем значение таймера на единицу. std Y+1,r24 // Сохранение значения таймера. std Y+2,r25 // Сохранение значения таймера. brne Process_Next_System_Timer // Если время не вышло, то переход к обработке следующего таймера. sbr r16,1<<ST_TIME_OUT_FLG // Установка флага завершения работы таймера. Save_ST_Flags: st Y,r16 // Запись статуса таймера. Process_Next_System_Timer: adiw YL,3 // Смещение указателя на следущий таймер. inc CNT cpi CNT,ST_QUANTITY // Значение счетчика таймеров равно количеству таймеров? brlo Service_Timers_ST_Cycle // Меньше, обрабатываем следующие таймеры. Service_Timers_End: ret //======================================================================== */ u08 st_flags; void service_timers(void) { if (st_flags & (1<<SYS_TICK_FLG) == 1) { u08 cnt = 0; cnt = 0; st_flags = st_flags & (~(1<<SYS_TICK_FLG)); cnt = cnt++; } }