Мне необходимо реализовать систему автополива, у меня есть 5 выходов RA каждый из которых отвечает за открытия крана.
У каждого порта есть время срабатывания и длительность полива. Как мне через заданное время подать на нужный выход RA логическую единицу и держать этот уровень определенное время.
Помогите, пожалуйста, с кодом 1000 сайтов прошерстил ничего не работает.
Мне нужно к примеру каждую минуту, чтобы порт RA1 загорался. Так мне будет легче понять логику работы.
Пробовал ЧТО-ТО ТАКОЕ СДЕЛАТЬ но компилятор ругается на
PR1Это код с таймером в 10 секунд. Он у меня не работает#include <p24fj128ga010.h>
_CONFIG2(FCKSM_CSDCMD&OSCIOFNC_ON&POSCMOD_HS&FNOSC_PRI)
#define SYSCLK 8000000
#define t1 0.5
#define PREG SYSCLK/2*t1/256
#define DELAY 20
#define PORTB_0 PORTBbits.RB0
void main(void)
{
int cnt = 0;
AD1PCFG = 0xffff;
TRISB = 0xfffe;
PR1 = PREG;
TMR1 = 0;
T1CON = 0x8030;
while (1)
{
if (_T1IF == 1)
{
_T1IF = 0;
if (cnt == DELAY)
{
cnt = 0;
PORTB_0 = ~PORTB_0;
}
cnt++;
}
}
}
Код проекта#define _XTAL_FREQ 8000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#include <xc.h>
#include "lcd.h";
#include <stdio.h>
// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG
char* plants[] = {//?????? ???????? ????????
"Ogurec",
"Yabloko",
"Apel'sin",
"Pomidor",
"Morkov'",
};
const int N_PLANTS = 5;
int plantsTime = {48};
int FlagTextChanged = 0;
int activeItem = 0;//???????? ????: ?????????????? ?? ??????
char num[3];
int plantsItems[5] = {0,3,0,0,0};//????????? ???????? ??? ??????? ????
void updateItem() {
Lcd_Clear();
Lcd_Set_Cursor(1, 1);
sprintf(num , "%d%c", activeItem + 1, '.');
Lcd_Write_String(num);
Lcd_Set_Cursor(1, 3);
Lcd_Write_String(plants[plantsItems[activeItem]]);
FlagTextChanged = 1;
}
void interrupt isr() {
if (INTF) {
INTF = 0; // reset interrupt flag/
updateItem();
}
if (RBIF || RBIE) {
if (RB6) {//????????????? ???????? ? ?????
plantsItems[activeItem] = (plantsItems[activeItem] + 1) % N_PLANTS;
updateItem();
}
if (RB7) {//????????? ???? (Next item)
activeItem = (activeItem + 1) % N_PLANTS;
updateItem();
}
RBIF = 0;
}
}
int main() {
TRISA = 0b00001111;
TRISB = 0B11000111;
PORTA = 0;
PORTB = 0;
INTF = 0; //reset the external interrupt flag
INTEDG = 1; //interrupt on the rising edge
INTE = 1; //enable the external interrupt
GIE = 1; //set the Global Interrupt Enable
RBIE = 1;
RBIF = 0;
unsigned int a;
TRISD = 0x00;
Lcd_Init();
while (1) {
if (FlagTextChanged == 1) {
FlagTextChanged = 0;
__delay_ms(10000);
__delay_ms(10000);
__delay_ms(10000);
__delay_ms(10000);
}
Lcd_Clear();
Lcd_Set_Cursor(1, 1);
Lcd_Write_String("Ogurec");
Lcd_Set_Cursor(2, 1);
Lcd_Write_String("MPLAB XC8");
__delay_ms(2000);
}
return 0;
}