Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

непонятное поведение dsPIC33

Отправлено night_light (92.255.194.37) 19 августа 2010, г. 09:38


здравствуйте!
начинаю изучать 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();
}

}
}


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите 6 на два:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru