ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
22 ноября
206624
night_light (19.08.2010 09:33, просмотров: 5106)
здравствуйте! начинаю изучать dsPIC33FJ128GP706 (есть опыт только AVR Atmel 8 bit) программирую в среде microC PRO for dsPIC, столкнулся с проблемой: от одной включения к другому программа либо выполняется как и должна (индикация секунд на панели), либо выводит секунды только один раз, либо выводит секунды друг за другом только медленнее, чем должно быть. В чём может быть проблема? схема - микропроцессор, кварц на 10МГц и графический LCD-индикатор, для управления используется стандартная библиотека microC PRO и библиотека поддержки шрифтов xglcd_lib.c программа тоже простая: #include "custom_font.c" #include "xglcd_lib.c" //*****Переменные*************************************************************** int time_ms = 0; short last_s = 0; volatile short f_lcd_refresh = 1; //****************************************************************************** //*****Выводы для подключения Glcd********************************************** sbit GLCD_D7 at RD7_bit; sbit GLCD_D6 at RD6_bit; sbit GLCD_D5 at RD5_bit; sbit GLCD_D4 at RD4_bit; sbit GLCD_D3 at RD3_bit; sbit GLCD_D2 at RD2_bit; sbit GLCD_D1 at RD1_bit; sbit GLCD_D0 at RD0_bit; sbit GLCD_D7_Direction at TRISD7_bit; sbit GLCD_D6_Direction at TRISD6_bit; sbit GLCD_D5_Direction at TRISD5_bit; sbit GLCD_D4_Direction at TRISD4_bit; sbit GLCD_D3_Direction at TRISD3_bit; sbit GLCD_D2_Direction at TRISD2_bit; sbit GLCD_D1_Direction at TRISD1_bit; sbit GLCD_D0_Direction at TRISD0_bit; sbit GLCD_CS1 at LATB1_bit; sbit GLCD_CS2 at LATB0_bit; sbit GLCD_RS at LATB2_bit; sbit GLCD_RW at LATB3_bit; sbit GLCD_EN at LATB4_bit; sbit GLCD_RST at LATB5_bit; sbit GLCD_CS1_Direction at TRISB1_bit; sbit GLCD_CS2_Direction at TRISB0_bit; sbit GLCD_RS_Direction at TRISB2_bit; sbit GLCD_RW_Direction at TRISB3_bit; sbit GLCD_EN_Direction at TRISB4_bit; sbit GLCD_RST_Direction at TRISB5_bit; //****************************************************************************** //*****Инициализация тактового генератора*************************************** void osc_init(void) { CLKDIV = 0x3000; PLLFBD = 0x001E; // 80MHz = 40 MIPS = 10MHz/2*32/2 RCONbits.SWDTEN = 0; //выключаем watchdog while(OSCCONbits.LOCK != 1) ; //wait PLL to lock } //****************************************************************************** //*****Инициализация портов ввода-вывода**************************************** void port_init(void) { AD2PCFGL = 0xFFFF; //Без этой строки порты работают неправильно AD1PCFGH = 0xFFFF; AD1PCFGL = 0xFFFF; LATB = 0xFF00; //RB8..RB15 PullUP TRISB = 0xFF80; //RB7..RB15 - кнопки; RB0..RB5 - GLCD; RB6 - свободный LATD = 0; TRISD = 0x0000; //RD0..RD7 - GLCD; RD8..RD11 - свободные } //****************************************************************************** //*****Инициализация Timer1***************************************************** void timer1_init(void) { IPC0 = IPC0 | 0x1000; // interrupt priority level = 1 T1IF_bit = 0; // clear T1IF T1IE_bit = 1; // enable Timer1 interrupts TMR1 = 25536; T1CON = 0x8000; // Timer1 ON, internal clock FCY, prescaler 1:1 } //****************************************************************************** //*****Прерывание каждые 1мсек************************************************** void Timer1Int(void) org IVT_ADDR_T1INTERRUPT { //Таймер считает до 65536 от 25536 + 24 TMR1 = 25536 + 24; //Прерывние через 40 000 тактов - каждую 1 мсек, 24 цикла - поправка (теряется при обработке прерывания) T1IF_bit = 0; //Очищаем флаг прерывания time_ms++; if(time_ms == 1000) { time_ms = 0; time_s++; f_lcd_refresh = 1; } } //****************************************************************************** //*****Вывод данных на GLCD***************************************************** void glcd_data_refresh(void) { short cur_s; char text[20]; xGlcd_Set_Font(Terminal8x15, 8, 15, 32); IntToStr(last_s,text); xGlcd_Write_Text(text, 5, 40, 0); //стираем cur_s = time_s; IntToStr(cur_s,text); xGlcd_Write_Text(text, 5, 40, 1); //выводим last_s = cur_s; } //****************************************************************************** void main() { osc_init(); port_init(); Glcd_Init(); delay_ms(100); Glcd_Fill(0x00); timer1_init(); while(1) { if (f_lcd_refresh == 1) { f_lcd_refresh = 0; glcd_data_refresh(); } } }