Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.56 KB | None | 0 0
  1. #include <xc.h>
  2. #include <htc.h>
  3. #define _XTAL_FREQ 5000000
  4.  
  5. // PIC18F2550 Configuration Bit Settings
  6.  
  7. // CONFIG1L
  8. #pragma config PLLDIV = 1 // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
  9. #pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
  10. #pragma config USBDIV = 1 // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale)
  11.  
  12. // CONFIG1H
  13. #pragma config FOSC = HS
  14. #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
  15. #pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
  16.  
  17. // CONFIG2L
  18. #pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled)
  19. #pragma config BOR = OFF // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
  20. #pragma config BORV = 3 // Brown-out Reset Voltage bits (Minimum setting 2.05V)
  21. #pragma config VREGEN = OFF // USB Voltage Regulator Enable bit (USB voltage regulator disabled)
  22.  
  23. // CONFIG2H
  24. #pragma config WDT = ON // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
  25. #pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
  26.  
  27. // CONFIG3H
  28. #pragma config CCP2MX = OFF // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
  29. #pragma config PBADEN = OFF // PORTB A/D Enable bit (PORTB<4:0> pins are configured as analog input channels on Reset)
  30. #pragma config LPT1OSC = OFF // Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
  31. #pragma config MCLRE = OFF // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
  32.  
  33. // CONFIG4L
  34. #pragma config STVREN = OFF // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
  35. #pragma config LVP = OFF // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
  36. #pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
  37.  
  38. // CONFIG5L
  39. #pragma config CP0 = OFF // Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
  40. #pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
  41. #pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
  42. #pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)
  43.  
  44. // CONFIG5H
  45. #pragma config CPB = OFF // Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
  46. #pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM is not code-protected)
  47.  
  48. // CONFIG6L
  49. #pragma config WRT0 = OFF // Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
  50. #pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
  51. #pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
  52. #pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)
  53.  
  54. // CONFIG6H
  55. #pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
  56. #pragma config WRTB = OFF // Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
  57. #pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM is not write-protected)
  58.  
  59. // CONFIG7L
  60. #pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
  61. #pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
  62. #pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
  63. #pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)
  64.  
  65. // CONFIG7H
  66. #pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not prote
  67.  
  68. int SaveU=1; //Настоящий уровень стабилизации
  69. unsigned int SU[5][4]={0,0,0,0,1,0,0,0,1,1,0,0,1,1,1,0,1,1,1,1};
  70. unsigned int SUU[5]={1,2,3,4,5};
  71. unsigned int FlagA=0;
  72. unsigned int FlagB=0;
  73. unsigned int FlagC=0;
  74. unsigned int FlagT=0;
  75. unsigned int FlagDA=0;
  76. unsigned int FlagDB=0;
  77. unsigned int FlagDC=0;
  78. unsigned char TA=0;
  79. unsigned char TB=0;
  80. unsigned char TC=0;
  81.  
  82. float ADCU=0; //?????????? ?? ???
  83. float TrueU=.0f; //???????????????? ?????????? ????? ???
  84. int i=0, j=0; //Изначально уровень 0\0
  85.  
  86. void Button(void);
  87. void ADC (void);
  88. void Comparison(void);
  89. void FuncSUj(void);
  90. void FuncA (void);
  91. void FuncB (void);
  92. void FuncC (void);
  93.  
  94.  
  95.  
  96.  
  97. void main(void) {
  98.  
  99. //Настройка портов
  100. TRISB=0xFF; //Весь В на вход
  101. PORTB=0x00; //Очистка B
  102. TRISC=0x00; //Весь С на выход
  103. PORTC=0x00;
  104. ADCON1=0x0E; //AN0 - аналоговый пин
  105. //Остальные А - цифровые пины
  106. TRISA=0x01; //AN0 вход, остальные выход
  107. PORTA=0x00; //Сброс А
  108.  
  109. //Настройка АЦП
  110. ADCON2=0x9A; //Fosc\32
  111. //2Tad
  112. //Tad=1,6???
  113. ADCON0=0x01; //Канал АЦП - AN0
  114. //Модуль АЦП Вкл
  115.  
  116. //Настройка таймера
  117. T08BIT = 0; // Timer0 - 16бит
  118. T0CS = 0; // TMR0 тактирование от внутреннего генератора
  119. T0SE = 0; // TMR0 инкрементирование от меньшего к большему
  120. PSA = 0; // Предделитель вкл
  121. T0PS2 = 1; // Предделитель 1\256
  122. T0PS1 = 1;
  123. T0PS0 = 1;
  124. TMR0ON=0; //TMR0 стоп
  125.  
  126. //Настройка прерываний
  127. RBIE=1; //Прерывание от RB4-7 (кнопка) Вкл
  128. RBIF=0; //Флаг RB4-7 снят
  129. GIE=1; //Разрешение глобальных прерываний
  130.  
  131. LATA1=1;
  132. LATA2=0;
  133. LATA3=0;
  134. //Основное тело программы
  135. while(1){
  136. ADC(); //Функция АЦП
  137. Comparison(); //Функция сравнения
  138. // FuncSUj(); //Функция передачи СУ
  139. }
  140. }
  141.  
  142. void __interrupt () PBInt (void){ //Функция обработки прерываний
  143.  
  144. if (RBIE && RBIF){ //Проверка на прерывание RB4-7 (Кнопка)
  145. PORTB=PORTB; //Инициализация ПортВ
  146. RBIF=0; //Флаг RBIE снят
  147. RBIE=0; //RBIE Откл
  148. Button(); //Функция обработки кнопки
  149. }
  150.  
  151. if (INT0IE && INT0IF){ //Прерывание детектора фазы А
  152. INT0IF=0;
  153. FuncA();
  154. }
  155.  
  156. if (INT1IE && INT1IF){ //Прерывание детектора фазы В
  157. INT1IF=0;
  158. FuncB();
  159. }
  160.  
  161. if (INT2IE && INT2IF){ //Прерывание детектора фазы С
  162. INT2IF=0;
  163. FuncC();
  164. }
  165.  
  166. }
  167.  
  168. void Button (void){ //Функция кнопки
  169. if (LATB4){ //Нажата ли кнопка?
  170. __delay_ms(300); //Ждём 300мс
  171. if (LATB4){ //Нажата ли всё ещё?
  172. if (SaveU==3) SaveU=1; //Если стоит уровень 3, меняем на 1й
  173. else SaveU=SaveU+1; //Иначе увеличиваем уровень на 1
  174. }
  175. }
  176. switch (SaveU){ //Обработка индикаторов уровня
  177. case 1: //В случае если уровень 1
  178. LATA=0x00; //Обнуляем порт
  179. LATA1=1; //Зажигаем первую лампочку
  180. break; //Выход из Switch
  181. case 2: //Аналогично
  182. LATA=0x00;
  183. LATA2=1;
  184. break;
  185. case 3:
  186. LATA=0x00;
  187. LATA3=1;
  188. break;
  189. }
  190. __delay_ms(300); //Ещё одно ожидание?
  191. RBIE=1; //Разрешаем прерывание от кнопки
  192.  
  193. }
  194.  
  195. void ADC (void){ //Функция АЦП
  196. __delay_ms(5); //Маленькая пауза
  197. GO=1; //АЦП запуск обработки
  198. while(GO); //Ждём завершения обработки
  199. ADCU=(ADRESH << 8)+ADRESL; //Занесение младшего и старшего бита АЦП в один регистр
  200. TrueU=(ADCU*5)/1024; //Высчитываем измеренное значение
  201. __delay_ms(10); //Маленькая пауза
  202.  
  203.  
  204. }
  205.  
  206. void FuncSUj (void){
  207. INT0IE=1; //Прерывание детектора А
  208. INT1IE=1; //Прерывание детектора В
  209. INT2IE=1; //Прерывание детектора С
  210. for (j=0;j<=3;j++){
  211. do{
  212. if (FlagA && FlagB && FlagC){
  213. FlagT=1;
  214. }
  215. }while (!FlagT);
  216. FlagT=0;
  217. FlagA=0;
  218. FlagB=0;
  219. FlagC=0;
  220. }
  221. }
  222.  
  223. void FuncA (void){
  224. switch(TA){
  225. case 0:
  226. if (SU[i][j]==0){
  227. LATA5=1;
  228. LATA4=0;
  229. }
  230. else{
  231. LATA5=0;
  232. LATA4=1;
  233. }
  234. TA++;
  235. break;
  236. case 1:
  237. TA=0;
  238. FlagA=1;
  239. break;
  240. }
  241. }
  242.  
  243. void FuncB (void){
  244. switch(TB){
  245. case 0:
  246. if (SU[i][j]==0){
  247. LATC1=1;
  248. LATC0=0;
  249. }
  250. else{
  251. LATC1=0;
  252. LATC0=1;
  253. }
  254. TB++;
  255. break;
  256. case 1:
  257. TB=0;
  258. FlagB=1;
  259. break;
  260. }
  261. }
  262.  
  263. void FuncC (void){
  264. switch(TC){
  265. case 0:
  266. if (SU[i][j]==0){
  267. LATC7=1;
  268. LATC6=0;
  269. }
  270. else{
  271. LATC7=0;
  272. LATC6=1;
  273. }
  274. TC++;
  275. break;
  276. case 1:
  277. TC=0;
  278. FlagC=1;
  279. break;
  280. }
  281. }
  282.  
  283.  
  284.  
  285. void Comparison (void){ //Функция сравнения
  286. if (TrueU>=SaveU){
  287. TMR0H = 0x1B; //3 сек таймер
  288. TMR0L = 0x1E;
  289. TMR0ON=1; //Включаем таймер
  290. do{
  291. ADC();
  292. if (TrueU>=SaveU){
  293. FuncSUj();
  294. }
  295. else{
  296. TMR0ON=0; //Остановка таймера
  297. return; //Выход из функции сравнения
  298. }
  299. }while(!TMR0IF);
  300. TMR0IF=0;
  301. do{ //Делаем цикл, пока не поднимется флаг TMR0 (3сек)
  302. if (SUU[i]>=2){
  303. i--; //Понижение уровня СУ
  304. TMR0H = 0x1B; //3 сек таймер
  305. TMR0L = 0x1E;
  306. TMR0ON=1; //Включаем таймер
  307. do{
  308. FuncSUj();
  309. }while(!TMR0IF); //Делаем в течение 3х сек
  310. }
  311. else return;
  312. ADC();
  313. }while(TrueU>=SUU[i]);
  314. i++;
  315. FuncSUj();
  316. return;
  317. }
  318. else{
  319. if (abs(SUU[i]-SaveU)<=2){
  320. i++;
  321. FuncSUj();
  322. }
  323. }
  324.  
  325. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement