здравствуйте! начинаю изучать 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();
}
}
}
-
- Чем программируете? Если пиккит + мплаб, то воспользуйтесь их отладкой и сами все найдете. - AlexBi(19.08.2010 15:19)
- Для начала читаем K&R и учимся писать на Си. - vanner(19.08.2010 13:39)
- Никому тут не интересно отлаживать чужой говнокод -- за это не платят. - fk0(19.08.2010 11:19)
- Правила: .. Не цепляйтесь к новичкам - General(19.08.2010 13:19)
- Я не прошу ничего отлаживать, я прошу указать, в чём "говнистость" говно-кода, night_light(558 знак., 19.08.2010 12:33)
- Он перед обедом злой. Да и после недобрый. - General(19.08.2010 13:20)