You are on page 1of 14

// Ficheiro main.

c /* O presente programa controlo 4 LEDs do I/O Expander MCP23017 atravs de comunicao I2C e * efetua a leitura continuamente de um valor analgico (potencimetro) atravs do A/D Converter * MCP3202. Consoante a tenso lida, alterada a configurao dos LEDs e de 1 em 1 segundo enviado * o valor da tenso lido pela porta USART. Quando a tenso ultrapassa os 2.5 V, os LEDs so * desativados e enviada uma mensagem de erro ao utilizador. O sistema volta a funcionar normalmente * quando a tenso for inferior a 2.5 V e o utilizador enviar um "ok" pela porta srie. * Adicionalmente, so enviados pela porta srie o n. de leituras por segundo e os segundos passados * desde o arranque do sistema para testar impacto nas leituras de diferentes velocidades do I2C, USART E SPI. */ #include <stm32f4xx.h> #include <stdlib.h> #include <string.h> // Declarao de variveis globais float ultima_leitura = 0, nova_leitura = 0; // Guarda a ltima leitura efetuada int sistema_on = 1; // Indica se o sistema est ativo - 1 ON, 0 - OFF char txt_in[255]; // Buffer de entrada para guardar os caracteres recebidos pela porta srie char txt_out[255]; // Buffer de sada para envio de caracetres pela porta srie int pos_in = 0; // Guarda ultima posio ocupada no buffer de entrada int pos_out = 0; // Guarda ultima posiao ocupada no buffer de saida long leituras = 0; // Conta quantas leituras so realizadas num segundo long t_ativo = 0; // Conta segundos ativos //---------------------------------------------------------------------------------------------------------------------//Configurao do perifrico USART3 void USART3_config (void){ GPIO_InitTypeDef GPIO_InitStruct; //Declarao de uma estrutura do tipo GPIO para configurao dos pinos associados USART USART_InitTypeDef USART_InitStruct; //Declarao de uma estrutura do tipo USART para configurao do perifrico USART NVIC_InitTypeDef NVIC_InitStruct; //Declarao de uma estrutura do tipo NVIC para configurao das interrupes associadas ao mdulo USART

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //Ativa relgio do perifrico GPIOC - USART3 (PC10 TX / PC11 RX) RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //Ativa relgio do perifrico USART3 //Configurao dos pinos do GPIO associados ao perifrico USART3 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; // Pin 10 TX e Pin 11 RX GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // Configurao como Alternate Function uma vez que funcionaro associados USART3 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // Frequncia do relgio GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // Definir os pinos como push / pull GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // Ativar resistncia Pull-Up GPIO_Init(GPIOC, &GPIO_InitStruct); // Passar os parmetros anteriores para o perifrico GPIOC

//Associao dos pinos GPIO ao perifrico USART3 GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3); //Configurao do perifrico USART3 USART_InitStruct.USART_BaudRate = 9600; // Para comunicaes mais rpidas colocar 921600 - baudrate maximo permitido pela interface SRIE/USB USART_InitStruct.USART_WordLength = USART_WordLength_8b; // Envio de 8 bits por trama (standard) USART_InitStruct.USART_StopBits = USART_StopBits_1; // 1 bit de paragem (standard) USART_InitStruct.USART_Parity = USART_Parity_No; // Sem bit de paridade (standard) USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // Sem controlo do fluxo de dados (standard) USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // Ativar transmisso e receo USART_Init(USART3, &USART_InitStruct); // Passar os parmetros anteriores para o perifrico USART3

///Configurao da estrutura NVIC - interrupes NVIC_InitStruct.NVIC_IRQChannel = USART3_IRQn; // Interrupo associado ao mdulo USART3 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00; // Associao ao NVIC_PriorityGroup_0 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00; // Ser a interrupo com maior prioridade NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // Ativar NVIC_Init(&NVIC_InitStruct); // Regista as informaes pretendidas

USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

// Sempre que o buffer de receo do mdulo USART3 no estiver vazio, ocorrer uma interrupo

USART_Cmd(USART3, ENABLE); // Ativa o mdulo USART3 } //---------------------------------------------------------------------------------------------------------------------// Funo para envio de texto pela porta srie void enviar_texto( char *txt){ strcpy(txt_out, txt); sada pos_out = 0; posio a enviar USART_ITConfig(USART3, USART_IT_TXE, ENABLE); // Ativa interrupo quando se poder enviar novo caracter (Buffer de sada da USART livre) } //---------------------------------------------------------------------------------------------------------------------//Configurao do perifrico I2C2 void I2C2_config (void){ GPIO_InitTypeDef GPIO_InitStruct; // Declarao de uma estrutura do tipo GPIO para configurao dos pinos associados ao I2C2 I2C_InitTypeDef I2C_InitStruct; // Declarao de uma estrutura do tipo I2C para configurao do perifrico I2C2 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // Ativa relgio do perifrico GPIOB (I2C2: PB10 SCL, PB11 SDA) RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE); // Ativa relgio do perifrico I2C2 //Configurao dos pinos do GPIO associados ao perifrico I2C2: PB10 SCL, PB11 SDA GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; // PB10 SCL, PB11 SDA GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // Define os pinos como Alternate function porque sero utilizados com I2C2 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // Frequncia do relgio GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; // Open drain porque o pull-up vai ser realizado por hardware GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // Sem resistncias ativas (explicado em cima) // Reinicia a // Copia o texto a enviar para o 'buffer' de

GPIO_Init(GPIOB, &GPIO_InitStruct);

// Passar os parmetros anteriores para o perifrico GPIOB

//Associao dos pinos GPIO ao perifrico I2C2 GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_I2C2); // SCL GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_I2C2); // SDA //Configurao do perifrico I2C2 I2C_InitStruct.I2C_ClockSpeed = 100000; STM I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; // Modo I2C I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; // 50% duty cycle --> standard I2C_InitStruct.I2C_OwnAddress1 = 0x00; // Endereo prprio, irrelevante no modo master I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; // Ativar acknowledge I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; // Endereos de 7 bits I2C_Init(I2C2, &I2C_InitStruct); // Passar os parmetros anteriores para o perifrico I2C2 I2C_Cmd(I2C2, ENABLE); // Ativao do perifrico I2C2 while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Aguardar estabilizao da BUS /* Configurao inicial do I/O Expander * Neste caso pretende-se que as portas sejam configuradas como sadas e que iniciem desativadas. * Pela TABLE 1-4 do datasheet, o CI inicia com as portas do GPIOA configuradas como entrada, * pelo que no incio tem de se configur-las como sadas. Pela mesma tabela, v-se que iniciam desativadas, * pelo que no ser necessrio enviar um byte para desativ-las inicialmente. * O registo IOCON.BANK est configurado por defeito a 0 (TABLE 1-5) */ I2C_GenerateSTART(I2C2, ENABLE); condio de START while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); // Aguardar transmisso condio START // Enviar Byte de controlo, Pgina 8 do datasheet I2C_Send7bitAddress(I2C2, 0x42 , I2C_Direction_Transmitter); // Byte de controlo: 0100 + A2 A1 A0 R/W - W 0 R 1 while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // Aguardar por transmisso do byte // Enviar

// Para comunicaes mais rpidas colocar frequncia 400kHz - Table 54 datasheet da placa

I2C_SendData(I2C2, 0x0); // Envia byte com o registo a aceder do CI - IODIRA - Pgina 12 do datasheet while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // Aguardar por transmisso do byte I2C_SendData(I2C2, 0x0); // Envia byte com o valor a colocar no registo while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // Aguardar por transmisso do byte I2C_GenerateSTOP(I2C2, ENABLE); // Termina a transmisso while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // Aguardar por transmisso do byte } //---------------------------------------------------------------------------------------------------------------------// Alterar estado dos LEDs do I/O Expander void alterar_LEDs ( int novo_valor ){ while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); Aguardar estabilizao da BUS I2C_GenerateSTART(I2C2, ENABLE); condio de START while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); // Aguardar transmisso condio START // Enviar Byte de controlo, Pgina 8 do datasheet I2C_Send7bitAddress(I2C2, 0x42 , I2C_Direction_Transmitter); // Byte de controlo: 0100 + A2 A1 A0 R/W while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // Aguardar por transmisso do byte I2C_SendData(I2C2, 0x12); // Envia byte com o registo a aceder do CI - GPIOA - Pgina 5 do datasheet while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // Aguardar por transmisso do byte I2C_SendData(I2C2, novo_valor & 0xFF); // Envia byte com o valor a colocar no registo (considera apenas primeiros 8 bits) while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // Aguardar por transmisso do byte I2C_GenerateSTOP(I2C2, ENABLE); // Termina a transmisso while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // Aguardar por transmisso do byte } //---------------------------------------------------------------------------------------------------------------------// // Enviar

//Configurao do perifrico SPI1 void SPI1_config (void){ GPIO_InitTypeDef GPIO_InitStruct; // Declarao de uma estrutura do tipo GPIO para configurao dos pinos associados ao SPI1 SPI_InitTypeDef SPI_InitStruct; // Declarao de uma estrutura do tipo SPI para configurao do perifrico SPI1 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // Ativa relgio do perifrico GPIOA (SPI1: PA5(SCK) and PA6(MISO) E PA7(MOSI)) RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // Ativa relgio do perifrico SPI1 //Configurao dos pinos do GPIO associados ao perifrico SPI1 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 |GPIO_Pin_7; // PA5(SCK), PA6(MISO), PA7(MOSI) GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; Alternate Function porque sero utilizados com SPI1 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStruct); // Passar os parmetros anteriores para o perifrico GPIOA

// Define os pinos como // Frequncia do relgio // Definir os pinos como push / pull // Sem resistncias ativas

//Associao dos pinos GPIO ao perifrico SPI1 GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); //SCK GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1); //MISO GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); //MOSI //Configurao do pino do GPIO associado ao perifrico SPI1 para o pino Chip_Select (LOW ativa a comunicao) GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; // Pino 4 do GPIOA GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // Configurado como sada GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // Frequncia do relgio GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // Definir os pinos como push / pull GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // Resistncia Pull Up ativa GPIO_Init(GPIOA, &GPIO_InitStruct); // Passar os parmetros anteriores para o perifrico GPIOA GPIO_SetBits(GPIOA, GPIO_Pin_4); // Desativa comunicao colocando CS non nvel alto

//Configurao do perifrico SPI1 SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // Modo full duplex, linhas MOSI e MISO funcionam separadamente SPI_InitStruct.SPI_Mode = SPI_Mode_Master; // Transmisso como master, pino NSS tem de estar no nvel HIGH SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // Configurao de tramas com 8 bits (aplicao do exemplo da figura 6-1, pgina 15 do datasheet do componente) SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; // Relgio LOW quando idle - Modo SPI 0 (CPOL 0 CPHA 0) - ver pgina 15 datasheet SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; // Dados capaturados no rising edge SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; // Gesto do NSS por software SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; // Para comunicaes mais rpidas - frequncia SPI = (APB2_frequency/64) -> Pag. 3 datasheet CI, 1.8 MHz max -> 64 o mais prximo SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; // MSB transmitido primeiro SPI_Init(SPI1, &SPI_InitStruct); // Passar os parmetros anteriores para o perifrico SPI1 SPI_Cmd(SPI1, ENABLE); // Ativa o perifrico SPI1 while(SPI_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); } //---------------------------------------------------------------------------------------------------------------------//Leitura do valor da tenso void ler_tensao( void ){ int aux1 = 0, aux2 = 0; // Variveis para clculo do valor lido while(SPI_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); GPIO_ResetBits(GPIOA, GPIO_Pin_4); SPI_I2S_SendData(SPI1, 0x1); pgina 15 do datasheet while(!SPI_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); while(SPI_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); // Aguardar estabilizao da BUS // Ativar slave // Envia 1. byte para o slave, ver figura 6-1, // Aguarda que o byte tenha sido enviado // Aguardar estabilizao da BUS // Aguardar estabilizao da BUS

SPI_I2S_ReceiveData(SPI1); ignora-o, visto que no tem significado (ver figura 6-1, pgina 15 do datasheet) SPI_I2S_SendData(SPI1, 0xA0); 15 do datasheet (consultar tambm tabela 5-1, pgina 13, de forma a definir as opes de leitura) while(!SPI_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); // Aguarda que o byte tenha sido enviado while(SPI_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); // Aguardar estabilizao da BUS aux1 = SPI_I2S_ReceiveData(SPI1)&0xF; SPI_I2S_SendData(SPI1, 0x0); pgina 15 do datasheet while(!SPI_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); // Aguarda que o byte tenha sido enviado while(SPI_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); // Aguardar estabilizao da BUS aux2 = SPI_I2S_ReceiveData(SPI1); MBS GPIO_SetBits(GPIOA, GPIO_Pin_4); aux1 = (aux1 << 8) + aux2; nova_leitura = ( (float)aux1 * 4.77 / 4095 ); leituras++; // Incrementa o nmero de leituras

// L 1. byte recebido do I/O e

// Envia 2. byte para o slave, ver figura 6-1, pgina

// L 2. byte recebido que contm os 4 MBS e ignora os restantes // Envia 3. byte para o slave, ver figura 6-1,

// L 3. byte recebido que contm os retantes 8

// Desativa o slave // Calcula valor final // Calcula valor em tenso 4.77V medido com multimetro

if (nova_leitura != ultima_leitura){ // Se ocorrer uma variao da tenso, executa o seguinte cdigo // Isto serve para evitar que se a tenso for igual anterior se perca tempo ultima_leitura = nova_leitura; // Guarda novo valor lido if(ultima_leitura >= 2.5){ // Se tenso superior ao limite, desativa sadas alterar_LEDs(0); // Alterao das sadas if(sistema_on == 1) // Se a primeira vez que a tenso superior a 2,5V

enviar_texto( "\n\n DANGER! \n Tensao superior a 2.5V "); // Envia mensagem de alerta sistema_on = 0; // Desativa o sistema } else{ if(sistema_on == 1){ ativado pelo utilizador) if(ultima_leitura >= 0.0 && ultima_leitura < 0.5) // Se a tenso estiver compreendida neste intervalo alterar_LEDs(0); // Alterao das sadas else if(ultima_leitura >= 0.5 && ultima_leitura < 1.0) // Se a tenso estiver compreendida neste intervalo alterar_LEDs(1); // Alterao das sadas else if(ultima_leitura >= 1.0 && ultima_leitura < 1.5) // Se a tenso estiver compreendida neste intervalo alterar_LEDs(3); // Alterao das sadas else if(ultima_leitura >= 1.5 && ultima_leitura < 2.0) // Se a tenso estiver compreendida neste intervalo alterar_LEDs(7); // Alterao das sadas else if(ultima_leitura >= 2.0 && ultima_leitura < 2.5) // Se a tenso estiver compreendida neste intervalo alterar_LEDs(15); } } } } //---------------------------------------------------------------------------------------------------------------------// Configurao do TIMER 3 - 1 segundo void TIM3CONFIG(){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // Varivel para declarar propriedades do perifrico TIMER NVIC_InitTypeDef NVIC_InitStruct; // Declarao de uma estrutura do tipo NVIC para configurao das interrupes associada ao TIM3 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // Ativao do relgio do perifrico Timer 3 // Alterao das sadas // Se a tenso est normal // E o sistema est ativo (para prevenir que se a tenso estiver normal mas o sistema ainda no tiver sido

// Especificaes das propriedades do TIM3 // (F_clock_tim = F_clock_mcu/Prescaler = 84MHz/42kHz = 2kHz) TIM_TimeBaseStructure.TIM_Prescaler = 42000 - 1; // Timer_trigger = Period / F_clock_tim = 2000 cycles / 2 kHz = 1 segundo TIM_TimeBaseStructure.TIM_Period = 2000 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // Dividir o clock por 1 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // Regista as informaes pretendidas // Configurao da interrupo associada ao TIMER 3 NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01; // Menos prioritria que a da USART3 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); // Regista as informaes pretendidas TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // Ativao da interrupo associada ao TIM3 TIM_Cmd(TIM3, ENABLE); // Ativao do TIM3 } //---------------------------------------------------------------------------------------------------------------------// Funo principal int main(void){ USART3_config(); // Funo para configurao da USART I2C2_config(); // Funo para configurao dO I2C SPI1_config(); // Funo para configurao dO SPI //ler_tensao(); // Ativar para evitar que primeira leitura enviada seja '0V' TIM3CONFIG(); // // Funo para configurao do Temporizador while(1){ ler_tensao(); // To infinity, and beyond! // Monitoriza a tenso

// 2000 para ser 1 segundo

} return 0; } // Ficheiro stm32f4xx_it.c extern float ultima_leitura, nova_leitura; extern int sistema_on; extern char txt_in[255]; extern char txt_out[255]; extern int pos_in; extern int pos_out; extern long leituras; extern long t_ativo; //---------------------------------------------------------------------------------------------------------------------// Tratamento da interrupo TIM 3 void TIM3_IRQHandler(void){ char aux[100]; if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET){ //Formalismo porque na verdade se o programa // chegou aqui, porque houve interrupo TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // Desativar a FLAG t_ativo++; if(sistema_on == 1){ // Se o sistema estiver ativo sprintf(aux, "\n\n Tensao %.1f V \n Leituras %lu \n Segundos %lu ", ultima_leitura, leituras, t_ativo); //Converso da tenso, do nmero de leituras e do tempo ativo para string //sprintf(aux, "\n Tensao %.1f V ", ultima_leitura); // Converso s da tenso para texto enviar_texto(aux); // Solicitar o envio do texto leituras = 0; // Reset ao nmero de leituras } } } //----------------------------------------------------------------------------------------------------------------------

// Tratamento das interrupes associadas porta USART void USART3_IRQHandler(void){ if (USART_GetITStatus(USART3, USART_IT_RXNE)){ // Se h dados para ler txt_in[pos_in] = USART_ReceiveData(USART3); // L o dado // Se o caracter no CR nem o nova linha nem se atingiu o espao mximo do 'buffer' if(txt_in[pos_in] != 13 && txt_in[pos_in] != '\n' && pos_in < 253){ pos_in++; // Passa-se para a seguitne posio do buffer } else{ // Caso se verifique qualquer das condies anteriores txt_in[pos_in] = '\0'; // Assinala-se o fim do texto recebido pos_in = 0; // Reinicializa-se a posio para futura leitura // Se se recebeu um OK if( (txt_in[0] == 'o' && txt_in[1]=='k') || (txt_in[0] == 'O' && txt_in[1]=='K')){ // Se a tenso no estiver norma if(ultima_leitura >= 2.5){ enviar_texto( "\n\n DANGER! \n Tensao superior a 2.5V "); // Envio de aviso pela porta srie } // Se a tenso estiver normal else{ enviar_texto("\n\n Sistema ativo "); // Envio de aviso pela porta srie sistema_on = 1; } } } } if(USART_GetITStatus(USART3, USART_IT_TXE) ){ // Se h dados para enviar ocorrer esta interrupo if(txt_out[pos_out] != '\0'){ // Se h dados para enviar USART_SendData(USART3, txt_out[pos_out]); // Envia caracter pos_out++; a posio seguinte } else{ // Se j enviou os dados todos

// Ativa o sistema

// Passa para

pos_out = 0; Reinicializa a posio do 'buffer' de sada USART_ITConfig(USART3, USART_IT_TXE, DISABLE); // Desativa interrupo de quando buffer de envio da USART est livre } } }

//

You might also like