|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 4:15 pm
| Автор |
Съобщение |
|
bobi13
Ранг: Минаващ
Регистриран на: Сря Авг 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 |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: Проблем с таймер
unsigned char bdata CNTFSSB4 = 0x104; Това трябва да е променлива с адрес 0х104 ? Според мен не се пише така.
sbit FP = P1^5; това какво е? Според мен пак е некоректно, ама не съм сигурен, Ц-то го ползвам само за ПК.
500 реда код няма кой да ти прочете. Отделно правиш копи/пасте и разместането на Ц се губи - има бутон за постване на код. Намери темата за дебоунсването и я прочети.
|
| Вто Сеп 08, 2015 7:22 pm |
|
 |
|
bobi13
Ранг: Минаващ
Регистриран на: Сря Авг 07, 2013 1:11 am Мнения: 41
|
 Re: Проблем с таймер
sbit FP = P1^5; Това е начин на обяванене на компилатора. В този случай бутона се напира на пин 5 порт 1 Това трябва да е променлива с адрес 0х104 ? - Да това означава и така се пише поне тук.
|
| Вто Сеп 08, 2015 7:25 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: Проблем с таймер
Качи описанието , дето го пише това . За мене е инициализиране ,ама какво разбирам аз от Ц, де.
|
| Вто Сеп 08, 2015 7:29 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: Проблем с таймер
И да обяваваш адрес на променлива в Ц - трябва да имаш сериозна причина .
|
| Вто Сеп 08, 2015 7:31 pm |
|
 |
|
bobi13
Ранг: Минаващ
Регистриран на: Сря Авг 07, 2013 1:11 am Мнения: 41
|
 Re: Проблем с таймер
за да знам точно къде съм сложил променливата, може и без адреса, но мисля че това не пречи. Файала който съм качил е описано за дефиницията на порта. Погледни // Keil C51 // http://www.keil.com#elif defined __C51__
|
| Вто Сеп 08, 2015 7:37 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 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 |
|
 |
|
bobi13
Ранг: Минаващ
Регистриран на: Сря Авг 07, 2013 1:11 am Мнения: 41
|
 Re: Проблем с таймер
Няма го, но просто го знам, че в този компилатор е така. Ползвал съм го няколко пъти без проблем
|
| Вто Сеп 08, 2015 7:59 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: Проблем с таймер
|
| Вто Сеп 08, 2015 8:08 pm |
|
 |
|
bobi13
Ранг: Минаващ
Регистриран на: Сря Авг 07, 2013 1:11 am Мнения: 41
|
 Re: Проблем с таймер
Да, същото е.
|
| Вто Сеп 08, 2015 8:11 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: Проблем с таймер
Тогава unsigned char bdata CNTFSSB4 = 0x104; присвоява нещо (най вероятно 4) на някаква променлива.
|
| Вто Сеп 08, 2015 8:18 pm |
|
 |
|
bobi13
Ранг: Минаващ
Регистриран на: Сря Авг 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 |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: Проблем с таймер
това не е вярно, за останалото - не знам.
|
| Вто Сеп 08, 2015 8:40 pm |
|
 |
|
nordic
Ранг: Минаващ
Регистриран на: Пон Дек 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 |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: Проблем с таймер
Е, това на класическия '51 са 16 байта-128 бита, ако не се лъжа. Не виждам смисъл на процесор с xdata 4kB да разчиташ на тази памет, още повече на Ц. Трябва да си много навътре в нещата ,за да опреш до това. От друга страна - разполагането на битови флагове позволява (на компилатора )използването на битовите особености/обработка на '51 . Та зависи де.
|
| Вто Сеп 08, 2015 8:58 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 12 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|