Re: MPLAB и русский беда.
Добавлено: Вт окт 11, 2011 22:57:38
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
#define _XTAL_FREQ 20000000 // Define Frequency 20.0 MHz for function __delay_ms
//#include <pic.h> // Include header file for MCU
#include <lcd887.h> // Include Library for i2c bus
#include <1wire887.h> // Include Library for 1-Wire bus
#include <string.h> // Include Library for LCD display
#include <stdio.h> // Include Library for LCD display
#include <encoder.h>
__CONFIG(HS & WDTDIS & LVPDIS); // Config. High speed clock,Disable watchdog and Disable LVP
unsigned long freq=0, count = 0, time1 = 0, sys1 = 0;
char flag_capture = 0; // Keep status capture working
int resh = 0, resl = 0, maxadc = 0, adc=0, press = 0, iclr = 0, iclr1 = 0;
int it = 0, EncP = 0, TD = 0, TU = 0, knt = 0, processID = 0, Delay1 = 0;
int vak = 100, gister = 50;
unsigned long TimeLCD1 = 0, TimeLCD2 = 0, TimeStop = 0, timetemp = 0, TimeClose = 0, TimeOpen = 0, idleTime = 0, dispDel = 0;
unsigned int TimeUp = 0, TimeDn = 0, TimeAll = 1;
unsigned char menuId = 10;
char temp[12], vtemp[10];
void Delay_ms(unsigned int tick)
{
while(tick--) // Loop counter delay time
{
__delay_ms(1); // Delay 1 ms
}
}
void Delay_sound(unsigned int tick) // Delay 100 us per tick
{
while(tick--)
{
__delay_us(90); // Delay 90 us
}
}
void Sound(unsigned int freq,unsigned int time)
{
unsigned int dt=0,m=0; // Keep value and
TRISC0 = 0; // Set RC0 output mode
dt = 5000/freq; // Keep active logic delay
time = (5*time)/dt; // Keep counter for generate sound
for(m=0;m<time;m++) // Loop for generate sound(Toggle logic P0.12)
{
RC0 = 1; // RC0=1
Delay_sound(dt); // Delay for sound
RC0 = 0; // RC0=0
Delay_sound(dt); // Delay for sound
}
}
void interrupt CCP1_INT(void)
{
if (INTF)
{
INTF = 0;
count++;
if (time1 == 0) time1 = sys1;
else if (sys1 - time1 > 1000)
{
freq = count;
time1 = 0;
count = 0;
}
}
if (T0IF)
{
sys1+=13; // 13
TMR0=3; // 3
T0IF = 0;
}
}
//-------------------------------------------- Температура -----------------------------------------
unsigned int read_temp(void)
{
unsigned char temp_buff[2]; // Keep raw temp.
char err_status; // Keep respond status
err_status = onewire_reset(); // Reset onewire bus
if(err_status==0) // Check connection to DS1820
{
onewire_write_byte(0xCC); // Skip ROM
onewire_write_byte(0x44); // Start Conversion
// __delay_us(120); // Delay 120 us for state
onewire_reset(); // Restart
onewire_write_byte(0xCC); // Skip ROM
onewire_write_byte(0xBE); // Read Scratch Pad
temp_buff[0] = onewire_read_byte(); // Keep raw data
temp_buff[1] = onewire_read_byte(); // Keep raw data
}
return((temp_buff[1]<<8)+temp_buff[0]); // Return raw data
}
int i = 0, kn1 = 0, kn2 = 0, kn3 = 0,kn4=0,kn5=0,kn6=0,knplus = 0;
void pressure()
{
GODONE = 1; // Start conversion
while(GODONE); // Wait until conversion success
press = ADRESH<<2; //0-1020
}
//---------------------------------------Main Process ------------------------------
void mainprocess()
{
// vak = 600; // 800 максимум
// gister = 100;
if (processID == 0)
{
PORTE = 0b000;
}
else if (processID == 1)
{
PORTE = 0b101; //Запустить насос закрыть сброса открыть перепуск
if (timetemp == 0) timetemp = sys1;
else if (sys1 - timetemp > 150)
{
timetemp = 0;
//Delay_ms(150);
PORTE = 0b110;
processID = 11;
}
}
else if (processID == 11)
{
// меряем давление
if (press >= vak)
{
PORTE = 0b000;
//if (TimeOpen == 0) TimeOpen = sys1;
// else if (sys1 - TimeOpen > 400)
//{
TimeOpen = 0;
Delay_ms(400);
PORTE = 0b011; // Отключили насос, открыли все клапана.
processID = 2;
//}
}
}
else if (processID == 2)
{
if (press <= gister)
{
PORTE = 0b000;
//if (TimeClose == 0) TimeClose = sys1;
// else if (sys1 - TimeClose > 450)
//{
TimeClose = 0;
Delay_ms(450);
PORTE = 0b001; // По достиж. нижнего давления закрыли перепуск открыли сброс
processID = 1;
//}
}
}
if (processID == 3)
{
if (press > 100) PORTE = 0b011;
//if (TimeStop == 0) TimeStop = sys1;
// else if (sys1 - TimeStop > 100)
// {
TimeStop = 0;
Delay_ms(100);
if (press < 100)
{
PORTE = 0b000;
processID = 0;
}
//}
}
}
unsigned char encoder1roll = 0, encoder2roll = 0;
void StepUp(void) {
encoder1roll = 1;
}
void StepDn(void) {
encoder1roll = 2;
}
void StepUp2(void) {
encoder2roll = 1;
}
void StepDn2(void) {
encoder2roll = 2;
}
//Инициализация дисплея в соответсвие с пунктом меню
void initDisplay(){
if (menuId == 0 ) {
//Основной дисплей!!
//Вывод вакум таймер и состояние, стоп пауза или работает
lcd_clear();
lcd_puts(128,(char *)"Разряжение:");
}
else if (menuId == 1 ) {
//Настройка вакума!!
lcd_clear();
lcd_puts(128,(char *)"Разряжение_");
}
else if (menuId == 2 ) {
//Настройка гистрезиса!!
lcd_clear();
lcd_puts(192,(char *)"Гистерезис_");
}
else if (menuId == 3 ) {
//Таймер верх!!
lcd_clear();
lcd_puts(128,(char *)"Таймер верх:");
}
else if (menuId == 4 ) {
//Таймер низ!!
lcd_clear();
lcd_puts(128,(char *)"Таймер низ:");
}
else if (menuId == 5 ) {
//Обороты вентилятра, температуры!!
lcd_clear();
lcd_puts(128,(char *)"Темп. насоса: ");
lcd_puts(192,(char *)"Обороты: ");
}
else if (menuId == 6 ) {
//Таймер отчета времени!!
lcd_clear();
lcd_puts(128,"Время работы");
}
else if (menuId == 7 ) {
//Установка Таймер верх!!
lcd_clear();
lcd_puts(128,(char *)"Таймер верх_");
utoa(temp,65,10);
lcd_puts(140,temp);
}
else if (menuId == 8 ) {
//Установка Таймер низ!!
lcd_clear();
lcd_puts(192,(char *)"Таймер нижн_");
}
else if (menuId == 9 ) {
lcd_clear();
lcd_puts(128,(char *)"Установка таймера");
}
}
/*
0 - Основной дисплей
1 - Настройка вакума
2 - Настройка гистрезиса
3 - Таймер верх
4 - Таймер низ
5 - Обороты вентилятра, температуры
6 - Таймер отчета времени
7 - Установка Таймер верх
8 - Установка Таймер низ
9 - Установка Таймер отчета времени
*/
unsigned char encoder1ButPrev = 1, encoder2ButPrev = 1;
unsigned char encoder1pressed = 0, encoder2pressed = 0;
void execEncoder1But(void) {
if (encoder1ButPrev==0 && RA3==1) {
//Кнопку отпустили после нажатия
encoder1pressed =1; //Подняли флаг что кнопка нажата
}
if (encoder1ButPrev != RA3) encoder1ButPrev = RA3;
if (encoder2ButPrev==0 && RC5==1) {
//Кнопку отпустили после нажатия
encoder2pressed =1; //Подняли флаг что кнопка нажата
}
if (encoder2ButPrev != RC5) encoder2ButPrev = RC5;
}
void inputProcess(){
unsigned char isIdle = 1; //Флаг простоя
unsigned char menuIdprev = menuId; //Запомним текущее меню
//Крутят энкодер1 -------------------------------------------------
if (encoder1roll) {
Sound(2000,10); // Sound 2000Hz,0.5 sec
isIdle = 0; //Сбрасываем флаг простоя
//Если мы не в вакуме и не в гистрезисе переходим в вакум
if (menuId!=1 && menuId!=2) menuId = 1;
if (menuId==1) {
//Меняем значение вакума!!!
vak += (encoder1roll==1)? 10 : -10;
}
if (menuId==2){
//Меняем значение гистрезиса!!!
gister += (encoder1roll==1)? 10 : -10;
}
encoder1roll = 0;
}
//<<---------------------------------------
//Нажали энкодер1 --------------------------------------------------
if (encoder1pressed == 1)
{
Sound(2000,30); // Sound 2000Hz,0.5 sec
isIdle = 0; //Сбрасываем флаг простоя
//Если мы не в вакуме и не в гистрезисе переходим в вакум
if (menuId!=1 && menuId!=2) menuId = 1;
//Переключаемся между вакумом и гистрезисом
else menuId = (menuId==1)? 2 : 1;
encoder1pressed = 0;
}
//<<---------------------------------------//Крутят энкодер2 --------------------------------------------------
if (encoder2roll)
{
Sound(2000,10); // Sound 2000Hz,0.5 sec
isIdle = 0; //Сбрасываем флаг простоя
//Если мы не в изменении значений по энкодеру 2
if (menuId!=7 && menuId!=8 && menuId!=9)
{
if (encoder2roll==1){
if (menuId==0 || menuId==10) menuId=3;
else if (menuId==3) menuId=4;
else if (menuId==4) menuId=5;
else menuId=0;
} else {
if (menuId==0 || menuId==10) menuId=5;
else if (menuId==3) menuId=0;
else if (menuId==4) menuId=3;
else if (menuId==5) menuId=4;
else menuId=5;
}
}
else
{
if (menuId==7) {
TimeUp += (encoder2roll==1)? 1 : -1;
//Меняем значение Таймер верх!!
}
else if (menuId==8)
{
//Меняем значение Таймер низ!!!
TimeDn += (encoder2roll==1)? 1 : -1;
}
else if (menuId==9)
{
TimeAll += (encoder2roll==1)? 1 : -1;
//Меняем значение Установка таймер отчета времени!!
}
}
encoder2roll = 0;
}
//<<----------------------------------------
//Нажали энкодер2 ---------------------------------------------------------------
if (encoder2pressed==1){
Sound(2000,30); // Sound 2000Hz,0.5 sec
isIdle = 0; //Сбрасываем флаг простоя
if (menuId==7 || menuId==8 || menuId==9) menuId = 0; //Переход в основной вывод
else {
if (menuId==0 || menuId==10) menuId = 9; //Переход в Установка таймер отчета времени
if (menuId==3) menuId = 7; //Переход в Установка таймер верх
if (menuId==4) menuId = 8; //Переход в Установка таймер низ
}
encoder2pressed = 0;
}
//<<----------------------------------------
//Нажали кнопку старт -----------------------------------------------------------
if (RB2 == 0){
Sound(3000,30); // Sound 2000Hz,0.5 sec
isIdle = 0; //Сбрасываем флаг простоя
menuId = 0; //Переходим в основной дисплей
//Стартуем если нада
if (processID==0) processID=1; //Запуск со стопа
//Добавь в старт проверку даваления и если вакум есть,
//то открывай клапан и выжидай сборс
}
//<<----------------------------------------
//Нажали кнопку пауза стоп -------------------------------------------------------
if (RB1 == 0){
Sound(2000,30); // Sound 2000Hz,0.5 sec
isIdle = 0; //Сбрасываем флаг простоя
menuId = 0; //Переходим в основной дисплей
//Проверка и отработка стопа или паузы
processID = 0;
processID = 3;
}
//<<-----------------------------------------
//Простой
if (isIdle==0) idleTime = sys1; //Сбрасываем таймер простоя
if (sys1 - idleTime > 3000)
{
if (menuId!=0) menuId = 0; //Если долго не трогают меню перейти в основной дисплей
idleTime=sys1;
}
//Перерисуем дисплей в соответсвие с новым меню если нада
if (menuIdprev != menuId) initDisplay();
}
void redrawDisplay()
{
char v[10];
if (dispDel == 0) dispDel = sys1;
else if (sys1 - dispDel < 100) return;
dispDel = sys1;
if (menuId == 0 )
{
//Основной дисплей!!
//Вывод вакум таймер и состояние, стоп пауза или работает
itoa (v,press,10);
if (press >= 100) iclr = 0;
if (press < 100)
{
if (iclr == 0)
{
lcd_puts(140,(char *)" ");
iclr = 1;
}
}
if (press >= 10) iclr1 = 0;
if (press < 10)
{
if (iclr1 == 0)
{
lcd_puts(140,(char *)" ");
iclr1 = 1;
}
}
if (TimeLCD1 == 0) TimeLCD1 = sys1;
else if (sys1 - TimeLCD1 > 100)
{
TimeLCD1 = 0;
lcd_puts(140,v);
}
}
else if (menuId == 1 )
{
//Настройка вакума!!
//sprintf(v,"%ld ",vak);
if (TimeLCD1 == 0) TimeLCD1 = sys1;
else if (sys1 - TimeLCD1 > 200)
{
TimeLCD1 = 0;
utoa(v,vak,10);
lcd_puts(140,(char *)" ");
lcd_puts(140,v);
}
}
else if (menuId == 2 ) {
if (TimeLCD1 == 0) TimeLCD1 = sys1;
else if (sys1 - TimeLCD1 > 200)
{
TimeLCD1 = 0;
utoa(v,gister,10);
lcd_puts(204,(char *)" ");
lcd_puts(204,v);
}
//Настройка гистрезиса!!
}
else if (menuId == 3 ) {
// utoa(vtemp,TimeUp,10);
//lcd_puts(140,vtemp);
//Таймер верх!!
}
else if (menuId == 4 ) {
//Таймер низ!!
}
else if (menuId == 5 )
{
//lcd_puts(142,v);
//Обороты вентилятра, температуры!!
}
else if (menuId == 6 ) {
//Таймер отчета времени!!
}
else if (menuId == 7 ) {
//Установка Таймер верх!!
}
else if (menuId == 8 ) {
//Установка Таймер низ!!
}
else if (menuId == 9 ) {
//Установка Таймер отчета времени!!
}
}
void main()
{
lcd_init(); // Initial LCD
const unsigned char logo1 [18] = {0x3E, 0x3E, 0xA4, 0xE3, 0x70, 0x61, 0xB3, 0x63, 0xBF, 0xB3, 0x79, 0xB9, 0xBF, 0x65, 0x3C, 0x3C}; // Здравствуйте
lcd_puts(128,(char *)logo1);
TRISC2 = 0;
//------------------ Блок шим ----------------------------------------
STRA = 1; // Use P1A(RC1 pin)generate PWM output signal
// STRB = 0; // Use P1B(RD5 pin)generate invert PWM output signal
TRISC1 = 0; // Set RC1 output mode
// PWM2CON |= 0x3F; // Delay time 12.8 us нет в моем контроллере
CCP2CON = 0x8C; // CCP1 PWM mode,CCP1M3:CCP1M0=1100,P1M1:P1M0=10
PR2 = 0xFF; // Set Period counting
TMR2IF =0; // Ensure Clear overflow flag timer2
T2CON |= 0x01; // Prescaler 4
T2CON |= 0x04; // Start timer2
CCP2CON |= 0x30; // CCP1 PWM mode
// CCPR2L = 225;
char v[10];
//unsigned char VTemp[10];
unsigned int temp; // Keep raw temp.
T1CKPS0 = 1;
T1CKPS1 = 1;
TMR1CS = 0; // Use internal clock source
T1SYNC = 0; // Synchronize external clock input
// ANS8 = 0; // Set RB0 as digital port
//---------------------Инит для проса кнопок ----------------------------------
ANSEL=0;
ANSELH=0;
RBPU = 0;
TRISB = 0b11111111; // Set RB input mode
TRISE = 0b000;
PORTE = 0b000;
PORTB = 0b11111111;
//------------------------- Инит измерения вакуума -----------------------------
TRISA = 0b111111; // Set RA2 input mode
RA1 = 0;
RA2 = 0;
// ANS2 = 1; // Set RA2 analog port
ADCON0 = 0b11000001; // Select RC Mode,ANS2 active,ADON=1
ADCON1 = 0b00001110;
//----------------------------- для таймера -------------------------------------
TMR0 = 3;
T0CS = 0; // select internal clock
T0SE = 0; //Reacting low to high edge
PSA = 0; //Working with prescaler
PS0 = 1; //Prescale settings bit 0
PS1 = 1; //Prescale settings bit 1
PS2 = 1; //Prescale settings bit 2
T0IE = 1; // enable timer interrupt
// GIE = 1; // enable global interrupts
INTE = 1;
INTEDG = 1;
GIE = 1;
ANSELH = 0;
RBPU = 0;
lcd_clear();
Sound(3000,150); // Sound 2000Hz,0.5 sec
Sound(2000,50); // Sound 2000Hz,0.5 sec
Sound(1000,50); // Sound 2000Hz,0.5 sec
Sound(500, 50); // Sound 2000Hz,0.5 sec
lcd_puts(128,(char *)"Готов к работе!");
lcd_puts(192,(char *)"Прошивка V1.0");
//----------------------------------------------- ГЛАВНЫЙ ЦИКЛ -------------------------
while(1) // Infinite loop
{
unsigned char v1[10];
Encoder_Exe();
Encoder_Exe2();
execEncoder1But();
inputProcess();
redrawDisplay();
mainprocess();
//utoa(v1,PORTB,10);
//lcd_puts(128,v1);
unsigned long freq1 = freq * 30;
char freq_str[16];
// temp_str[16]; // Не пашет сука
sprintf(freq_str,"%ld ",freq1); // Convert frequency to string
temp = read_temp()>>1; // Read temp.
if (temp < 30)
{
it = 0;
RC2 = 0;
CCPR2L = 255;
}
else if (temp > 30 && temp < 40)
{
RC2 = 1;
CCPR2L = 255 - temp; // 1080 об/мин -1080
}
else if (temp > 40 && temp < 50)
{
RC2 = 1;
CCPR2L = 255 - temp*2; // 1590 об/мин - 1830
}
else if (temp > 50 && temp < 60)
{
RC2 = 1;
CCPR2L = 255 - temp*3; // 2370 об/мин - 2580
}
else if (temp > 60)
{
CCPR2L = 0; // 2880 об/мин
}
utoa(v,temp,10);
lcd_puts(142,v);
// lcd_puts(142,temp_str);
//--------------------------- Вакуум меряем --------------------------
pressure();
press = 960 - press;
press = (press/10) * 10;
if (press < 0) press = 0;
//------------------------------------ Энкодер------------------------------------
}
}У меня просто монитор 24 дюйма с разрешением 1920Х1080 У меня даже еще много много места остается.urry писал(а):std - это стандартная, pro - больная.
В новых компиляторах выбирают, в каком работать, как - не помнюя работаю в основном на 9.60 std pl3
Дальше, размер 1 функции желательно вместить в размер экрана монитора, у Вас читать невозможно.
Код: Выделить всё
char time[10];
sprintf(time,"%d ",TimeUp);
lcd_puts(128,time);
Код: Выделить всё
Если вместо TimeUp ченить вручную прописать типа 123 не выводится на дисплей.
У меня виснет прошивка. Что делать. Как сам код распределить по банкам? Все переменные я закинул в банк1.
А само тело программы где располагается? Как его по банкам раскидать?
А как они могу совпадать если ножек больше??urry писал(а):(с) Наш путь к вершине бесконечно труден...
Если бы вы потрудились посмотреть шит на другой контроллер , то наверняка обнаружили бы там больше ножек.Больше того, даже взяв какой - нить 18 пик (который я , кстати, не рекомендую) - ну например 18ф452 и приложили к Вашей плате, Вы увидели бы, что ножки совпадают. Ну это к слову.
Не мешаю больше.
