Wrzucam kod z wyciętym wszystkim co nie dotyczy przykładu. Chodzi mi o modyfikację tablicy parametry_menu przy jednoczesnej zmianie elementów PID_channel_1 i PID_channel_2
PID PID_channel_1,PID_channel_2;
int *paremetry_menu[Liczba_parametrow];
const char *elementy_menu[Liczba_parametrow] =
{
"Tz",
"Kp",
"Ki",
"Kd",
"Tp",
"I",
"U"
};
ISR(INT0_vect)
{
_delay_ms(30);
LCD_Clear();
// PD7 S7 - menu
// PD6 S6 - Przesun pozycje w menu
// PD5 S5 -
// PD4 S4 -
// PD3 S3 - +
// PD1 S2 - -
// 76543210 -- 2 to przerwanie
switch(PIND)
{
case 0b01111011:
menu_aktywne=~menu_aktywne;
LCD_Clear();
break;
case 0b10111011:
pozycja_w_menu++;
if(pozycja_w_menu>Liczba_parametrow-1) pozycja_w_menu=0;
break;
case 0b11111001
paremetry_regulatora[pozycja_w_menu]=paremetry_regulatora[pozycja_w_menu]-0.1;
break;
case 0b11111000
paremetry_regulatora[pozycja_w_menu]=paremetry_regulatora[pozycja_w_menu]+0.1;
break;
}
}
int main(void)
{
PID_channel_1.wartosc_maksymalna_calki=100.0;
PID_channel_1.y_min=-50.0;
PID_channel_1.y_max=50.0; //wartosc minimalna i maksymalna wyjscia regulatora
PID_channel_1.OCR=3.0; //Tymczasowe zmienne zmiennoprzecinkowe są potrzebne do przeprowadzania dokładnych obliczeń związanych z regulacją PID
PID_channel_1.OCR_min=0;
PID_channel_1.OCR_max=65535;
PID_channel_1.Tz=30.1, //0 - temperatura zadana
PID_channel_1.Kp=0.1, //1 - Kp
PID_channel_1.Ki=0.1, //2 - Ki
PID_channel_1.Kd=0.1, //3 - Kd
PID_channel_1.Tp=0.001024; //4 - Tp co tyle jest taktowany zegar
paremetry_menu[0]=&PID_channel_1.Tz;
paremetry_menu[1]=&PID_channel_2.Tz;
while(1)
{
if (wcisnieto_guzik==1)
{
wcisnieto_guzik=0;
LCD_Clear();
}
if (menu_aktywne==0)
{
PCF_GetDateTime(&czas_systemowy);
sprintf(linia_LCD_1,"%2.1f|%2.1f|%02d:%02d", temperatura, temperatura_sec_channel, czas_systemowy.hour,czas_systemowy.minute);
sprintf(linia_LCD_2,"%2.1f|%2.1f|", PID_channel_1.Tz, PID_channel_2.Tz);
LCD_WriteTextInLine1(linia_LCD_1);
LCD_WriteTextInLine2(linia_LCD_2);
}
else
{
if (linia_LCD_1[0]!='M' && linia_LCD_1[1]!='E') LCD_Clear(); //skasuj LCD po pierwszym wejściu
if (pozycja_w_menu>Liczba_parametrow-1) pozycja_w_menu=0;
sprintf(linia_LCD_1,"MENU:");
sprintf(linia_LCD_2,"%d - %s:",pozycja_w_menu,elementy_menu[pozycja_w_menu]);
LCD_WriteTextInLine1(linia_LCD_1);
LCD_WriteTextInLine2(linia_LCD_2);
}
}
}