Ir ao conteúdo
  • Cadastre-se

Leo_Silva

Membro Júnior
  • Posts

    3
  • Cadastrado em

  • Última visita

Reputação

0
  1. Não tem nada em interrupção Pode variar +/- 0,5 segundos esse é o código que comecei a escrever: está travando , até tirei a config do clock pra deixar a Default #include "stm8s.h" #include "iostm8s001.h" #include "stm8s_adc1.h" void delay_ms(unsigned char time); void AIN6(void); void AIN2(void); void main() { unsigned char verif; unsigned int result, result2, x, y; PA_DDR = 0x08; PA_CR1 = 0x08; PA_CR2 = 0x00; while (1) { PA_ODR = 0x00; verif = 0; result = 0; //Inicia a leitura da saída do rastreador AIN2(); result = ADC1_GetConversionValue(); ADC1_ClearFlag(ADC1_FLAG_EOC); ADC1_DeInit(); //Termina de ler a saía do rastreador if (result < 18) // Testa leitura da saída do rastreador { TIM4_PSCR = 0x03; TIM4_ARR = 0xFF; TIM4_CR1 = 0; TIM4_CR1 |= (1<<2); TIM4_EGR = 1; TIM4_CNTR = 0x00; TIM4_IER &= ~(1<<0); //Disable interrupt x = 0; while (x<6000 && result < 18) //espera 6 segundos para bloquear { result = 0; //Inicia a leitura da saída do rastreador AIN2(); result = ADC1_GetConversionValue(); ADC1_ClearFlag(ADC1_FLAG_EOC); ADC1_DeInit(); //Termina de ler a saía do rastreador delay_ms(192); x++; } while (result < 18) { PA_ODR = 0x08; result = 0; //Inicia a leitura da saída do rastreador AIN2(); result = ADC1_GetConversionValue(); ADC1_ClearFlag(ADC1_FLAG_EOC); ADC1_DeInit(); //Termina de ler a saía do rastreador } } result2 = 0; //Inicia a leitura da alimentação do rastreador AIN6(); result2 = ADC1_GetConversionValue(); ADC1_ClearFlag(ADC1_FLAG_EOC); ADC1_DeInit(); //Termina de ler a saía do rastreador if (result2 < 8) { TIM4_PSCR = 0x03; TIM4_ARR = 0xFF; TIM4_CR1 = 0; TIM4_CR1 |= (1<<2); TIM4_EGR = 1; TIM4_CNTR = 0x00; TIM4_IER &= ~(1<<0); //Disable interrupt x = 0; while (x<6000 && result2 < 8) //espera 6 segundos para bloquear { result2 = 0; AIN6(); result2 = ADC1_GetConversionValue(); ADC1_ClearFlag(ADC1_FLAG_EOC); ADC1_DeInit(); //Termina de ler a saía do rastreador delay_ms(192); x++; } while (result2 < 8) { verif = 1; PA_ODR = 0x08; result2 = 0; //Inicia a leitura da saída do rastreador AIN6(); result2 = ADC1_GetConversionValue(); ADC1_ClearFlag(ADC1_FLAG_EOC); ADC1_DeInit(); //Termina de ler a saía do rastreador } if (verif = 1) { y = 0; while(y < 3600000) { delay_ms(192); y++; } verif = 0; } } } } void delay_ms(unsigned char time) { TIM4_EGR |= (1<<0); TIM4_CNTR = 0; TIM4_CR1 |= (1<<0); while(TIM4_CNTR<time); TIM4_CR1 &= ~(1<<0); TIM4_SR &= ~(1<<0); //clear flag } void AIN6(void) { ADC1_DeInit(); ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,ADC1_CHANNEL_6, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_StartConversion(); while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == FALSE); } void AIN2(void) { ADC1_DeInit(); ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,ADC1_CHANNEL_2, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_StartConversion(); while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == FALSE); }
  2. Conversei com um membro por MP e consegui fazer uma explicação que é mais genérica e não tem problema expor: Estou utilizando o Microcontrolador STM8S001J3 preciso ler duas entradas analógicas e dar uma saída digital Acredito que o clock LSI já esteja de bom tamanho, mas o código para o clock não estava sendo respeitando mesmo eu acionando o option byte dele. Um timer criado para gerar um delay de 6seg, estava variando de 4se. a 6 seg, seria isso normal em um clock interno? Por algum outro motivo meu programa está ficando travado em alguma e não faz a leitura constante das entradas Tentei o máximo usar apenas os códigos do manual de referência do mic, mas me gerou algumas dúvidas e as bibliotecas que todos usam nos tutoriais me geraram mais dúvidas ainda kkkkkk a lógica do projeto é essa: leio duas entradas analógicas: AIN2 AIN6 quando em AIN2 leio um valor decimal em bits inferior a 8 e esse valor inferior a 8 se mantém por pelo menos 6sgeundos, coloco minha saída digital PA3 em 1. Caso o valor de AIN2 volte a subir para valores em bits maior do que 8, a saída digital vai para 0 imediatamente. quando em AIN6 leio um valor decimal em bits inferior a 18 e esse valor inferior a 18 se mantém por pelo menos 6sgeundos, coloco minha saída digital PA3 em 1. Após o valor decimal em bits de AIN6 subir para um nível superior a 18, a saída digital ainda permanece em nível 1 por 1 hora e somente após esse tempo ele retorna para 0. Além disso, preciso identificar um padrão específico de acionamento da PA3: acionado: nível lógico 1 por 2 segundos nível lógico 0 por 1 segundo nível lógico 1 por 3 segundos nível lógico0 por 2 segundos nível lógico 1 por 1 segundo nível lógico 0 por 3 segundos nível lógico 1 por 3 segundos Caso esse padrão ocorra, a saída digital PA3 ficará em nível lógico 1 por 30 minutos, voltará para 0 e a saída não é mais afetada por nenhuma leitura até que o mesmo padrão se repita Alguém sabe configurar o clock, timer e fazer gravação de dado na EEPROM sem utilizar as bibliotecas gerais, essas acabam me confundindo bastante? Caso alguém tenha interesse em desenvolver o código inteiro, me chama por MP e combinamos os valores e passo os detalhes do projeto
  3. Olá, pessoal! Estou tentando desenvolver um firmware para STM8S e tenho enfrentado algumas dificuldades. Evoluí bastante porém ainda tenho muitas dúvidas, estou tendo dificuldades em achar materiais para esse microcontrolador. Por se tratar de uma aplicação profissional, prefiro não descrever todos os detalhes aqui, mas se tiver alguém com bons conhecimentos nesse microcontrolador, passo os detalhes no pv Desde já agradeço

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!