/* ** =================================================================== ** Method : PE_low_level_init (component MCF51QE128_64) ** ** Description : ** Initializes components and provides common register ** initialization. The method is called automatically as a part ** of the application initialization code. ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ void PE_low_level_init(void) { /* SCGC1: TPM3=1,TPM2=1,TPM1=1,ADC=1,IIC2=1,IIC1=1,SCI2=1,SCI1=1 */ setReg8(SCGC1, 0xFFU); /* SCGC2: ??=1,FLS=1,IRQ=1,KBI=1,ACMP=1,RTC=1,SPI2=1,SPI1=1 */ setReg8(SCGC2, 0xFFU); /* Common initialization of the CPU registers */ /* PTCD: PTCD3=0,PTCD2=1,PTCD1=0,PTCD0=1 */ clrSetReg8Bits(PTCD, 0x0AU, 0x05U); /* PTCDD: PTCDD3=1,PTCDD2=1,PTCDD1=1,PTCDD0=1 */ setReg8Bits(PTCDD, 0x0FU); /* PTCPE: PTCPE3=1,PTCPE1=1 */ setReg8Bits(PTCPE, 0x0AU); /* PTBDD: PTBDD1=1,PTBDD0=0 */ clrSetReg8Bits(PTBDD, 0x01U, 0x02U); /* PTBD: PTBD1=1 */ setReg8Bits(PTBD, 0x02U); /* PTAPE: PTAPE3=0,PTAPE2=0 */ clrReg8Bits(PTAPE, 0x0CU); /* PTADD: PTADD3=0,PTADD2=0 */ clrReg8Bits(PTADD, 0x0CU); /* PTASE: PTASE7=0,PTASE6=0,PTASE4=0,PTASE3=0,PTASE2=0,PTASE1=0,PTASE0=0 */ clrReg8Bits(PTASE, 0xDFU); /* PTBSE: PTBSE7=0,PTBSE6=0,PTBSE5=0,PTBSE4=0,PTBSE3=0,PTBSE2=0,PTBSE1=0,PTBSE0=0 */ setReg8(PTBSE, 0x00U); /* PTCSE: PTCSE7=0,PTCSE6=0,PTCSE5=0,PTCSE4=0,PTCSE3=0,PTCSE2=0,PTCSE1=0,PTCSE0=0 */ setReg8(PTCSE, 0x00U); /* PTDSE: PTDSE7=0,PTDSE6=0,PTDSE5=0,PTDSE4=0,PTDSE3=0,PTDSE2=0,PTDSE1=0,PTDSE0=0 */ setReg8(PTDSE, 0x00U); /* PTESE: PTESE7=0,PTESE6=0,PTESE5=0,PTESE4=0,PTESE3=0,PTESE2=0,PTESE1=0,PTESE0=0 */ setReg8(PTESE, 0x00U); /* PTFSE: PTFSE7=0,PTFSE6=0,PTFSE5=0,PTFSE4=0,PTFSE3=0,PTFSE2=0,PTFSE1=0,PTFSE0=0 */ setReg8(PTFSE, 0x00U); /* PTGSE: PTGSE3=0,PTGSE2=0,PTGSE1=0,PTGSE0=0 */ clrReg8Bits(PTGSE, 0x0FU); /* PTHSE: PTHSE7=0,PTHSE6=0,PTHSE1=0,PTHSE0=0 */ clrReg8Bits(PTHSE, 0xC3U); /* PTADS: PTADS7=1,PTADS6=1,PTADS5=0,PTADS4=1,PTADS3=1,PTADS2=1,PTADS1=1,PTADS0=1 */ setReg8(PTADS, 0xDFU); /* PTBDS: PTBDS7=1,PTBDS6=1,PTBDS5=1,PTBDS4=1,PTBDS3=1,PTBDS2=1,PTBDS1=1,PTBDS0=1 */ setReg8(PTBDS, 0xFFU); /* PTCDS: PTCDS7=1,PTCDS6=1,PTCDS5=1,PTCDS4=1,PTCDS3=1,PTCDS2=1,PTCDS1=1,PTCDS0=1 */ setReg8(PTCDS, 0xFFU); /* PTDDS: PTDDS7=1,PTDDS6=1,PTDDS5=1,PTDDS4=1,PTDDS3=1,PTDDS2=1,PTDDS1=1,PTDDS0=1 */ setReg8(PTDDS, 0xFFU); /* PTEDS: PTEDS7=1,PTEDS6=1,PTEDS5=1,PTEDS4=1,PTEDS3=1,PTEDS2=1,PTEDS1=1,PTEDS0=1 */ setReg8(PTEDS, 0xFFU); /* PTFDS: PTFDS7=1,PTFDS6=1,PTFDS5=1,PTFDS4=1,PTFDS3=1,PTFDS2=1,PTFDS1=1,PTFDS0=1 */ setReg8(PTFDS, 0xFFU); /* PTGDS: PTGDS7=0,PTGDS6=0,PTGDS5=0,PTGDS4=0,PTGDS3=1,PTGDS2=1,PTGDS1=1,PTGDS0=1 */ setReg8(PTGDS, 0x0FU); /* PTHDS: PTHDS7=1,PTHDS6=1,PTHDS5=0,PTHDS4=0,PTHDS3=0,PTHDS2=0,PTHDS1=1,PTHDS0=1 */ setReg8(PTHDS, 0xC3U); /* PTGDD: PTGDD7=1,PTGDD6=1,PTGDD5=1,PTGDD4=1 */ setReg8Bits(PTGDD, 0xF0U); /* PTHDD: PTHDD5=1,PTHDD4=1,PTHDD3=1,PTHDD2=1 */ setReg8Bits(PTHDD, 0x3CU); /* PTJDD: PTJDD7=1,PTJDD6=1,PTJDD5=1,PTJDD4=1,PTJDD3=1,PTJDD2=1,PTJDD1=1,PTJDD0=1 */ setReg8(PTJDD, 0xFFU); /* ### Shared modules init code ... */ /* ### Programable pulse generation "MotorD1" init code ... */ MotorD1_Init(); /* ### BitIO "MotorD2" init code ... */ /* ### Programable pulse generation "MotorI1" init code ... */ MotorI1_Init(); /* ### BitIO "MotorI2" init code ... */ /* ### Asynchro serial "Terminal" init code ... */ Terminal_Init(); /* ### BitsIO "Encoders" init code ... */ /* Common peripheral initialization - ENABLE */ /* TPM3SC: CLKSB=0,CLKSA=1 */ clrSetReg8Bits(TPM3SC, 0x10U, 0x08U); /* INTC_WCR: ENB=0,??=0,??=0,??=0,??=0,MASK=0 */ setReg8(INTC_WCR, 0x00U); SR_lock = 0x00; /* Set initial interrupt priority 0 */ asm { move.w SR,D0; andi.l #0xF8FF,D0; move.w D0,SR; } }
/*------------------------------------------------------------------------------------------------*/ int main(void) { Bool_e NouveauMode; Horodatage_s Time = { .Heure = 0, .Minute = 0, .Seconde = 0, }; // ------------------------------------------------------------------------ // --- INIT DU SYSTEME // --- Initialisations uC, Peripheriques, Fonctions et Interfaces BSP_Init(); // Init carte SysTick_Config(SystemCoreClock / 1000); // Init Tick 1ms HAL_Console_Init(115200); RTC_StartInit(TRUE); // Start Init RTC I2C1_Init(100 * 1000); // 100kHz ADC1_Init(); _CONSOLE(0, "\n"); _CONSOLE(LogId, "--- START - ALJ%s ---\n", VERSION_SW); //AM23xx_Test(); REGLAGE_RTC(); //---------------------------------- // FONCTIONNALITES MemoireFAT_Init((Diskio_drvTypeDef*) &SdCard_SPI_Driver); #if USE_TEMP_HYGRO TempHygro_Init(TEMPERATURE_PERIODE_ACQUISITION_ms); #endif Delay_ms(50); // Hygrometre_Init(); ConfIni_Init(); Arrosage_Init(USE_CONF_INI_FILE); Chauffage_Init(USE_CONF_INI_FILE); Ventilation_Init(USE_CONF_INI_FILE); Logs_Init(); PC_Init(); Terminal_Init(); Terminal_Cmd_Init(); //_CONSOLE(LogId, "MODE_FCT_SERVEUR\n"); ModeFct = MODE_FCT_SERVEUR; //MemoireFAT_PrintFileList("httpserver"); Ethernet_Init(USE_CONF_INI_FILE); if (RTC_BkpRegister_Read(0) != 0) { _CONSOLE(LogId, "MODE_FCT_USB\n"); ModeFct = MODE_FCT_USB; //USB_Init((Diskio_drvTypeDef*) &SdCard_SPI_Driver); RTC_BkpRegister_Write(0, 0); } // Lancement des timers TSW_Start(&TmrAffichTempHygro, 3000); //Mode_Test(); WDG_InitWWDG(10000); while (RTC_Main() != RTC_ETAPE_READY); TSW_Start(&Tmr_RTC, 10000); RTC_Lire(&StartTime); RTC_Lire(&Time); //-------------------------------------------------------------------------------- _CONSOLE(LogId, "--------------------------\n"); _CONSOLE(LogId, "StartupTime=%dms\n", TSW_GetTimestamp_ms()); _CONSOLE(LogId, "--------------------------\n\n"); while(1) { WDG_Refresh(); // if (PC_Read((uint8_t*) BufferIn, NULL) == TRUE) // { // Terminal_Parser(BufferIn, BufferOut, 1024); // if (strlen(BufferOut) > 0) // PC_Write(BufferOut, strlen(BufferOut)); // } // Choix du mode de fonctionnement // WKUP = ACTIF -> USB - WKUP = INACTIF -> WebServer //if (GPIO_Get(PORT_WKUP) == Etat_ACTIF) //{ // RTC_BkpRegister_Write(0, 1); // while (GPIO_Get(PORT_WKUP) == Etat_ACTIF) // TSW_Delay(100); // GOTO(0); //} //---------------------------------- // PROCESSUS LifeBit_Main(); MemoireFAT_Main(); #if USE_TEMP_HYGRO TempHygro_Thread(); #endif if (Mode != MODE_DEMARRAGE) { Arrosage_Management(); Chauffage_Management(); Ventilation_Management(); Hygrometrie_Management(); } if (ModeFct == MODE_FCT_SERVEUR) { Ethernet_Management(); } Logs_Management(); //---------------------------------- // LECTURE TEMPERATURE if ((TempHygro_IsValide() == FALSE) && (Mode != MODE_DEMARRAGE)) { Mode = MODE_DEFAUT; } else { Temperature = TempHygro_GetTemperature(); Hygrometrie = TempHygro_GetHygrometrie(); } //---------------------------------- // RTC if (TSW_IsFinished(&Tmr_RTC)) { RTC_Lire(&Time); TSW_ReStart(&Tmr_RTC); //_CONSOLE(LogId, "RTC = %d-%02d-%02d %02d:%02d:%02d;%08d;", // Time.Annee, Time.Mois, Time.Jour, // Time.Heure, Time.Minute, Time.Seconde, // TSW_GetTimestamp_ms()); } //---------------------------------- // AFFICHAGE TEMPERATURE /* if (TSW_IsRunning(&TmrAffichTempHygro) == FALSE) { _CONSOLE(LogId, "TempHygro = "); if (TempHygro_IsValide() == FALSE) _CONSOLE(LogId, "Non valide\n"); else { _CONSOLE(LogId, "%.01f %c\t%.01f %c\n", Temperature, '°', Hygrometrie, '%'); } TSW_Start(&TmrAffichTempHygro, 2500); } */ //---------------------------------- // GESTION DES MODES NouveauMode = FALSE; if (LastMode != Mode) { LastMode = Mode; NouveauMode = TRUE; } switch (Mode) { //-------------------------------------------------------------- case MODE_DEMARRAGE : if (NouveauMode) { _CONSOLE(LogId, "----- MODE_DEMARRAGE -----\n"); Logs_Data(); } if (Mode_Demarrage() == Status_Fini) { Mode = MODE_SURVEILLANCE; } break; //-------------------------------------------------------------- case MODE_SURVEILLANCE : if (NouveauMode) { _CONSOLE(LogId, "----- MODE_SURVEILLANCE -----\n"); Logs_Data(); GPIO_Set(PORT_IHM_LED1, Etat_ACTIF); GPIO_Set(PORT_IHM_LED2, Etat_INACTIF); GPIO_Set(PORT_IHM_LED3, Etat_INACTIF); EtatVentillation = Etat_INACTIF; EtatChauffage = Etat_INACTIF; TSW_Start(&Tmr_ATTENTE, 1000 * 30); // On reste au moins 30sec en mode attente } if (TSW_IsRunning(&Tmr_ATTENTE) == TRUE) { break; } // Pas de chauffage dessuite après l'extraction if ((TSW_IsRunning(&Tmr_EXT) == FALSE) && (Temperature < Chauffage_Get()->Cfg_SeuilStart_DegC)) { Mode = MODE_CHAUFFAGE; } // Pas d'extraction dessuite après le chauffage if ((TSW_IsRunning(&Tmr_CH) == FALSE) && (Temperature >= Ventilation_Get()->Cfg_SeuilStart_DegC)) { Mode = MODE_VENTILLATION; } break; //-------------------------------------------------------------- case MODE_CHAUFFAGE : if (NouveauMode) { _CONSOLE(LogId, "----- MODE_CHAUFFAGE -----\n"); Logs_Data(); GPIO_Set(PORT_IHM_LED1, Etat_INACTIF); GPIO_Set(PORT_IHM_LED2, Etat_ACTIF); GPIO_Set(PORT_IHM_LED3, Etat_INACTIF); if (Ventilation_Get()->Cfg_ActiverPendantChauffage) EtatVentillation = Etat_ACTIF; else EtatVentillation = Etat_INACTIF; EtatChauffage = Etat_ACTIF; } // Attente franchissement seuil if (Temperature >= Chauffage_Get()->Cfg_SeuilStop_DegC) { EtatChauffage = Etat_INACTIF; TSW_Start(&Tmr_CH, 1000 * Chauffage_Get()->Cfg_TempoApresCh_s); Mode = MODE_SURVEILLANCE; } break; //-------------------------------------------------------------- case MODE_VENTILLATION : if (NouveauMode) { _CONSOLE(LogId, "----- MODE_VENTILLATION -----\n"); Logs_Data(); GPIO_Set(PORT_IHM_LED1, Etat_ACTIF); GPIO_Set(PORT_IHM_LED2, Etat_ACTIF); GPIO_Set(PORT_IHM_LED3, Etat_INACTIF); EtatChauffage = Etat_INACTIF; EtatVentillation = Etat_ACTIF; } if (Temperature < Ventilation_Get()->Cfg_SeuilStop_DegC) { EtatVentillation = Etat_INACTIF; TSW_Start(&Tmr_EXT, 1000 * Ventilation_Get()->Cfg_TempoApresEXT_s); Mode = MODE_SURVEILLANCE; } break; //-------------------------------------------------------------- case MODE_DEFAUT : if (NouveauMode) { _CONSOLE(LogId, "----- MODE_DEFAUT -----\n"); Logs_Data(); GPIO_Set(PORT_IHM_LED1, Etat_INACTIF); GPIO_Set(PORT_IHM_LED2, Etat_INACTIF); GPIO_Set(PORT_IHM_LED3, Etat_ACTIF); EtatVentillation = Etat_INACTIF; EtatChauffage = Etat_INACTIF; //Arrosage_Stop(); TSW_Start(&Tmr_DEFAULT, 60 * 1000); TSW_Start(&Tmr_DEFAULT_Max, 600 * 1000); } if (TempHygro_IsValide() == TRUE) { Mode = MODE_VENTILLATION; break; } if ((TSW_IsRunning(&Tmr_DEFAULT) == FALSE) && (REBOOT_ON_DEFAULT_MODE == TRUE) && (Arrosage_IsActive() == FALSE)) { if ((Telnet_GetNbActiveConnection() == 0) || (TSW_IsRunning(&Tmr_DEFAULT_Max) == FALSE)) { _CONSOLE(LogId, "REBOOT...\n"); MemoireFAT_DeInit(); TSW_Delay(5000); GOTO(0); Mode = MODE_DEMARRAGE; } } break; } //---------------------------------- // MAJ DES SORTIES if (GPIO_Get(PORT_RELAIS_V_EXT) != EtatVentillation) { _CONSOLE(LogId, "Ventillation = %d\n", EtatVentillation); GPIO_Set(PORT_RELAIS_V_EXT, EtatVentillation); Logs_Data(); } if (GPIO_Get(PORT_RELAIS_CH) != EtatChauffage) { _CONSOLE(LogId, "Chauffage = %d\n", EtatChauffage); GPIO_Set(PORT_RELAIS_CH, EtatChauffage); Logs_Data(); } } return 0; } /*------------------------------------------------------------------------------------------------*/ extern void SdCard_SPI_timerproc (void); void ApplicationTickHook (void) { static uint8_t ucTick_10ms=0; static uint8_t ucTick_100ms=0; /* Gestion du Tick Timer Software */ TSW_Refresh(); /* Tick 10ms */ ucTick_10ms++; if (ucTick_10ms >= 10){ ucTick_10ms = 0; ADC1_Tick(); SdCard_SPI_timerproc(); } /* Tick 100ms */ ucTick_100ms++; if (ucTick_100ms >= 10){ ucTick_100ms = 0; } } /*------------------------------------------------------------------------------------------------*/ void Delay(uint32_t nCount) { /* Capture the current local time */ uint32_t timingdelay = TSW_GetTimestamp_ms() + nCount; /* wait until the desired delay finish */ while(timingdelay > TSW_GetTimestamp_ms()) { } }