Ir ao conteúdo
  • Cadastre-se

Outro Clock, timer e interrupção STM8S


Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Leo_Silva disse:

Um timer criado para gerar um delay de 6seg, estava variando de 4se. a 6 seg, seria isso normal em um clock interno?

 

Não. Tem alguma coisa rodando dentro de interrupção, ou algo alterando os Timers.

 

Paulo

2 horas atrás, Leo_Silva disse:

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

 

Qual a precisão desses tempos, ou seja, quanto podem variar ?

 

Paulo

Link para o comentário
Compartilhar em outros sites

2 horas atrás, aphawk disse:

Não. Tem alguma coisa rodando dentro de interrupção, ou algo alterando os Timers.

 

Paulo

Não tem nada em interrupção

 

 

2 horas atrás, aphawk disse:

Qual a precisão desses tempos, ou seja, quanto podem variar ?

 

Paulo

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);
}



 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
20 horas atrás, Leo_Silva disse:

Conversei com um membro por MP

🤔😉😁 🤫🤪

 

16 horas atrás, Leo_Silva disse:

Não tem nada em interrupção

Pois passe a ter. Ela facilita sua vida. P.ex. se ela for de 100Hz (ou a cada 10mS):

20 horas atrás, Leo_Silva disse:

nível lógico 1 por 2 segundos if (PA3) _2s1++;

nível lógico 0 por 1 segundo if (!PA3) _1s0++;

nível lógico 1 por 3 segundos if (PA3) _3s1++;

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 if (PA3) _3s1++;

você vai ter em tempo real as variáveis _2s1,_1s0, ... com o valor do tempo em centésimos de segundo que PA3 permaneceu no nível. Claro devem ser zeradas no momento apropriado. E por fim crie uma função pra ler o canal analógico. algo como
 

unsigned int read_adc(channel)
{
//setup do hw
//captura do unsigned int resultado
return resultado;
}

Do jeito que você fez está confuso e complexo mas pelo menos deu pra ver que você sabe setar o hw... ou não: você usou os mastigados do compilador

😜

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!