Отговори на тема  [ 41 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща
Проблем с таймер 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с таймер
#include "c8051F020.h"
#include <intrins.h>
//#include "delay.h"

unsigned char bdata BUT1FL = 0x100;
sbit BUT1FL_0 = BUT1FL^0;
sbit BUT1FL_1 = BUT1FL^1;
sbit BUT1FL_2 = BUT1FL^2;
sbit BUT1FL_3 = BUT1FL^3;
sbit BUT1FL_4 = BUT1FL^4;
sbit BUT1FL_5 = BUT1FL^5;
sbit BUT1FL_6 = BUT1FL^6;
sbit BUT1FL_7 = BUT1FL^7;

unsigned char bdata BUT2FL = 0x101;
sbit BUT2FL_0 = BUT2FL^0;
sbit BUT2FL_1 = BUT2FL^1;
sbit BUT2FL_2 = BUT2FL^2;
sbit BUT2FL_3 = BUT2FL^3;
sbit BUT2FL_4 = BUT2FL^4;
sbit BUT2FL_5 = BUT2FL^5;
sbit BUT2FL_6 = BUT2FL^6;
sbit BUT2FL_7 = BUT2FL^7;

unsigned char bdata FFP = 0x102;
sbit FFP_0 = FFP^0;
sbit FFP_1 = FFP^1;
sbit FFP_2 = FFP^2;
sbit FFP_3 = FFP^3;
sbit FFP_4 = FFP^4;
sbit FFP_5 = FFP^5;
sbit FFP_6 = FFP^6;
sbit FFP_7 = FFP^7;


unsigned char bdata FSS = 0x103;
sbit FSS_0 = FSS^0;
sbit FSS_1 = FSS^1;
sbit FSS_2 = FSS^2;
sbit FSS_3 = FSS^3;
sbit FSS_4 = FSS^4;
sbit FSS_5 = FSS^5;
sbit FSS_6 = FSS^6;
sbit FSS_7 = FSS^7;
unsigned char bdata CNTFSSB4 = 0x104;
unsigned char bdata CNTB2 = 0x105;
unsigned char bdata CNTB1 = 0x106;
unsigned char bdata CNTFFPB3 = 0x107;
void but_plus(); // Button up
void butplus ();
void but_minus(); // Button down
void butminus ();
void but_FP(); // Button frquency/pulse selector
void but_Start_Stop();
void Start_Stop();
void Master_button();

sbit FP = P1^5; // Frequency/Pulse width selector
sbit Start = P1^6; // Start/stop button for signal
sbit Plus = P2^3; // Plus
sbit Minus = P2^4; // Minus
sbit Valve_on = P0^5;//output for valve

sbit LED = P1^7; // Pulse indicator


unsigned char c;
unsigned int CNTIMP;
unsigned int CNTIMP1;
unsigned int CNTFRQ;

unsigned int FRQ1;
unsigned int FRQ;

#define LCD_DATA P3
sbit LCD_RS = P0^2;
sbit LCD_EN = P0^4;

unsigned char data_ind[3];
char init_value;
#define lcd_delay 400

void delay(unsigned int j)//Просто закъснение за инициализацията на ЛЦД-то. минава само веднъж когато се инициализира
{
unsigned int i=0;
for(i=0;i<j;i++);
}

void itoa(int number) // превръщам шестайсетично в десетично
{
data_ind[2] = '\0';
data_ind[1] = (number%10);
data_ind[0] = ((number%100) - data_ind[1])/10;

data_ind[1] = data_ind[1] + '0';
data_ind[0] = data_ind[0] + '0';

}

void LCD_show()
{
itoa(CNTFRQ); // Записва стойстта на клетктата CNTFRQ в масива.
lcd_goto(0x00);
lcd_puts("FRQ");

lcd_goto(0x05);
lcd_puts(data_ind);

lcd_goto(0x09);
lcd_puts("Hz");

itoa(CNTIMP);
lcd_goto(0x40);
lcd_puts("PWM");

lcd_goto(0x45);
lcd_puts(data_ind);

lcd_goto(0x49);
lcd_puts("ms");
}


void Start_Stop(void) // Функция за стартиране на Т1 за да започне да генерира импулс с определени параметри
{
if (Start==0)
{
TR1=1; //Enable
}
else
{

TR1=0; // Disable

}

}

void FP_Selector(void) // Изписвам на дисплея какво искам да променям - честота или импулс
{

if (FP==0)
{

// Start only Timer0
lcd_goto(0x4d);
lcd_puts(" ");
lcd_goto(0x4e);
lcd_puts(" ");
lcd_goto(0x0d);
lcd_puts("<<");


}

else
{
lcd_goto(0x0d);
lcd_puts(" ");
lcd_goto(0x0e);
lcd_puts(" ");
lcd_goto(0x4d);
lcd_puts("<<");

}

}




void Timer_Init()
{
TMOD = 0x11; // Timer0/Timer1 16 bit
IP = 0x08; // Най- висок приоритет на Т1
OSCICN = 0x07; // 16Мхц вътрешен осцилатор
WDTCN = 0xDE;
WDTCN = 0xAD;
IE = 0x8A; // timer0/1 interrupt

}

void Port_init()
{

P0MDOUT = 0x3C;
P1MDOUT = 0x06;
P2MDOUT = 0x18;
P3MDOUT = 0x0F;
XBR2 = 0x40;

}


void main(void)
{
TR0=0;
// TR1=0;
//TL1 = 0x65; //Lower Byte
//TH1 = 0xFD; //Upper Byte
// TH1 = 0xFA; //1ms
// TL1 = 0xCB;
// TH0 = 0xE5;//5ms
// TL0 = 0xF5;
Port_init();
Timer_Init();
lcd_init();
TR0=1;
Valve_on = 1;
CNTFRQ = 1; // Начална ст-ст на честота
CNTIMP =1; // Начална ст-ст на импулс

while(1);

}


void timer1_ISR(void) interrupt 3 // Таймер на 1мс, когато се стартира герерира прекъсване на 1мс, което ми представлява стъпката с която променям импулса
{

TH1 = 0xFA; //1ms
TL1 = 0xCB;


FRQ1 = FRQ1 - 1;
if(FRQ1 == 0)
{
Valve_on = 1; // valve OFF
FRQ1=FRQ;
CNTIMP1=CNTIMP;
CNTIMP1++;

}

CNTIMP1 = CNTIMP1 - 1;
if(CNTIMP1 == 0)
{

CNTIMP1=CNTIMP;

Valve_on = 0; // valve ON

}

}
void timer0_ISR (void) interrupt 1
{
TH0 = 0xE5;//5ms
TL0 = 0xF5;


Master_button();// Следя дали има вдигнат флаг, че е натиснат някой от бутонитте - плюс, минус, старт/стоп
LCD_show();// Извежда надпис на LCD
FP_Selector();//Изписвам на дисплея какво искам да променям - честота или импулс
but_plus();//Чрез флагове следя дали бутона е наистина настиснат или е някакъв артефакт. Вътре има брояч, като след всяко минаване през бутона се намалява - CNTB1=1; В този случай ще направи 10мс закъснение преди да го обработи. Същото се отнася и за другите два бутона отдолу.
but_minus();//
but_Start_Stop();//


}
void Master_button()
{

if(Plus==0)
{
BUT1FL_7=1;
}
else
{
BUT1FL=0;
}

if(Minus==0)
{
BUT2FL_7=1;
}
else
{
BUT2FL=0;
}

if(Start==0)
{
FSS_7=1;
}
else
{
FSS=0;
}



}


void broiach_FRQ() // Функция, която ми определя каква честота ще подам.
{
FRQ = 1000/CNTFRQ;//брояч за честотата в зависимост от таймер 1. Формулата е почти вярна. Има отклоение в честота като я гледам на осцилоскопа
FRQ1 = FRQ;


}

void butplus () // Броя за увеличаване на честота и импулса в зависимост от положение на бутона FP - честота или импулс. От тук се взимат стойностите за да се покажат на екрана CNTFRQ и CNTIMP. В зависимост от това колко пъти съм натиснал бутона с толкова ще се увеличи съответната променлива
{

if (FP==0)
{
if(CNTFRQ==30)
{;}
else
{
CNTFRQ = CNTFRQ+1;
broiach_FRQ();


}
}
else //PWM
{
if(CNTIMP==30)
{;}
else
{
CNTIMP = CNTIMP+1;

}
}
}


void butminus () // Бутон за намаляване на стойността. Същата логика като бутон плюс
{

if (FP==0)
{
if(CNTFRQ==1)
{;}
else
{
CNTFRQ = CNTFRQ-1;
broiach_FRQ();

}
}
else //PWM
{
if(CNTIMP==1)
{;}
else
{
CNTIMP = CNTIMP-1;

}



}

}

/*====================================

BUTTON FLAG

======================================*/
// Чрез флагове определям дали наистина бутона е натиснат, ако не е натиснат просто я прескача. Преминава през бутоните на всеки 5мс, в зависимост от таймер 1
void but_Start_Stop () // BUTTON FREQ OR PWM
{
if(FSS_7==1)
{
if(FSS_5==0)
{
if(FSS_0==0) //Стартира 10мс закъснение за проверка дали наистина е натиснат бутона
{
FSS_0=1;
CNTFSSB4=2;
}
else
{
if (FSS_2==1)
{
FSS_5=1;
// Start = ~Start;
Start_Stop();
}
else
{
CNTFSSB4--;
if(CNTFSSB4==0)
{
FSS_2=1;
}
}
}
}
}
else
{
Start_Stop();
}
}

void but_plus ()
{
if(BUT1FL_7==1)
{
if(BUT1FL_5==0)
{
if(BUT1FL_0==0)
{
BUT1FL_0=1;
CNTB1=1;
}
else
{
if (BUT1FL_2==1)
{
BUT1FL_5=1;
butplus();
}
else
{
CNTB1--;
if(CNTB1==0)
{
BUT1FL_2=1;
}
}}}}}

void but_minus ()
{
if(BUT2FL_7==1)
{
if(BUT2FL_5==0)
{
if(BUT2FL_0==0)
{
BUT2FL_0=1;
CNTB2=1;
}

else
{
if (BUT2FL_2==1)
{
BUT2FL_5=1;
butminus();
}
else
{
CNTB2--;
if(CNTB2==0)
{
BUT2FL_2=1;
}
}}}}}


Вто Сеп 08, 2015 7:10 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: Проблем с таймер
unsigned char bdata CNTFSSB4 = 0x104;
Това трябва да е променлива с адрес 0х104 ?
Според мен не се пише така.


sbit FP = P1^5;
това какво е?
Според мен пак е некоректно, ама не съм сигурен, Ц-то го ползвам само за ПК.

500 реда код няма кой да ти прочете.
Отделно правиш копи/пасте и разместането на Ц се губи - има бутон за постване на код.
Намери темата за дебоунсването и я прочети.


Вто Сеп 08, 2015 7:22 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с таймер
sbit FP = P1^5; Това е начин на обяванене на компилатора. В този случай бутона се напира на пин 5 порт 1
Това трябва да е променлива с адрес 0х104 ? - Да това означава и така се пише поне тук.


Вто Сеп 08, 2015 7:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: Проблем с таймер
Качи описанието , дето го пише това .
За мене е инициализиране ,ама какво разбирам аз от Ц, де.


Вто Сеп 08, 2015 7:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: Проблем с таймер
И да обяваваш адрес на променлива в Ц - трябва да имаш сериозна причина .


Вто Сеп 08, 2015 7:31 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с таймер
Цитат:
И да обяваваш адрес на променлива в Ц - трябва да имаш сериозна причина .

за да знам точно къде съм сложил променливата, може и без адреса, но мисля че това не пречи. Файала който съм качил е описано за дефиницията на порта. Погледни
// Keil C51
// http://www.keil.com
#elif defined __C51__


Прикачени файлове:
compiler_defs.h [23.49 KiB]
179 пъти
Вто Сеп 08, 2015 7:37 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: Проблем с таймер
Виждам това
#define SBIT(name, addr, bit) sbit name = addr^bit

Може би твоите дефиниции за битове да са верни. Аз не бих го написал така - бих ползвал
"define" , но сигурно някой по-сведущ ще го коментира по-добре.

В този файл не зърнах как
unsigned char xxx=0x104;
описва променлива с адрес 104х.
За мене е друго.


Вто Сеп 08, 2015 7:48 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с таймер
Няма го, но просто го знам, че в този компилатор е така. Ползвал съм го няколко пъти без проблем


Вто Сеп 08, 2015 7:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: Проблем с таймер
в Кеил?
Цитат:
Absolute Variable Location
Variables may be located at absolute memory locations in your C program source modules using the _at_ keyword. The usage for this feature is:

<[>memory_type<]> type variable_name _at_ constant;


Цитат:
The unsigned type modifier specifies that a char or int variable stores only positive values. It is used as follows:

unsigned data-type name <[>= value<]>;
Where

data-type is the data type (char or int) of the variable.
name is the name of the variable.
value is the value to assign to the variable.


Вто Сеп 08, 2015 8:08 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с таймер
Да, същото е.


Вто Сеп 08, 2015 8:11 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: Проблем с таймер
Тогава
unsigned char bdata CNTFSSB4 = 0x104;
присвоява нещо (най вероятно 4) на някаква променлива.


Вто Сеп 08, 2015 8:18 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Авг 07, 2013 1:11 am
Мнения: 41
Мнение Re: Проблем с таймер
Казвам му къде се намира дадена променлива в адреса.
unsigned char bdata BUT1FL = 0x100; // адрес
sbit BUT1FL_0 = BUT1FL^0; // на бит 0 се намира BUT1FL_0.
sbit BUT1FL_1 = BUT1FL^1;
Подобно е писането като в h файловете за микроконтролерите. Например това е взето от h файла на моят контролер
Код:
// SPI0CN 0xF8
SBIT (SPIF, SFR_SPI0CN, 7);            // SPI 0 Interrupt Flag
SBIT (WCOL, SFR_SPI0CN, 6);            // SPI 0 Write Collision Flag
SBIT (MODF, SFR_SPI0CN, 5);            // SPI 0 Mode Fault Flag
SBIT (RXOVRN, SFR_SPI0CN, 4);          // SPI 0 Rx Overrun Flag
SBIT (TXBSY, SFR_SPI0CN, 3);           // SPI 0 Tx Busy Flag
SBIT (SLVSEL, SFR_SPI0CN, 2);          // SPI 0 Slave Select
SBIT (MSTEN, SFR_SPI0CN, 1);           // SPI 0 Master Enable
SBIT (SPIEN, SFR_SPI0CN, 0);           // SPI 0 SPI Enable


Вто Сеп 08, 2015 8:30 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: Проблем с таймер
Цитат:
unsigned char bdata BUT1FL = 0x100; // адрес

това не е вярно, за останалото - не знам.


Вто Сеп 08, 2015 8:40 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 22, 2014 10:53 pm
Мнения: 4
Мнение Re: Проблем с таймер
The bdata memory type may be used to declare variables only. You may not declare bdata functions. This memory is directly accessed using 8-bit addresses and is the on-chip bit-addressable RAM of the 8051. Variables declared with the bdata type are bit-addressable and may be read and written using bit instructions.

Variables declared bdata are located in the BDATA memory class.


Вто Сеп 08, 2015 8:42 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: Проблем с таймер
Е, това на класическия '51 са 16 байта-128 бита, ако не се лъжа.
Не виждам смисъл на процесор с xdata 4kB да разчиташ на тази памет, още повече на Ц.
Трябва да си много навътре в нещата ,за да опреш до това.
От друга страна - разполагането на битови флагове позволява (на компилатора )използването на битовите особености/обработка на '51 .
Та зависи де.


Вто Сеп 08, 2015 8:58 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 41 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни