Skocz do zawartości

Po resecie zasilania nie wyświetlaja sie zmienne


Pomocna odpowiedź

Napisano (edytowany)

Mam taki dziwaczny problem. Znalazłem bibliotekę do obsługi czujnika wilgotności DHT11,po wgraniu wsadu przez usbasp wszystko jest ok i działa. Dziwna rzecz się dzieje, gdy wyjmę zasilanie i włożę jeszcze raz, wtedy zmienne, które powinny się wyświetlać tj: temperatura i wilgotność nie wyświetlają się, jakby program nie wchodził wg w pętle while. Poniżej kod programu:

#include <avr/io.h>
#include <stdlib.h>
#include <stdio.h>
#include <util/delay.h>
#include "lcd.h"

#define DHT11_PIN 6
uint8_t c=0,I_RH,D_RH,I_Temp,D_Temp,CheckSum;
char data[5];

void Request()				/* Microcontroller send start pulse/request */
{
	DDRD |= (1<<DHT11_PIN);
	PORTD &= ~(1<<DHT11_PIN);	/* set to low pin */
	_delay_ms(20);			/* wait for 20ms */
	PORTD |= (1<<DHT11_PIN);
	_delay_us(40);
	/* set to high pin */
}

void Response()				/* receive response from DHT11 */
{
	DDRD &= ~(1<<DHT11_PIN);
	while(PIND & (1<<DHT11_PIN));
	while((PIND & (1<<DHT11_PIN))==0);
	while(PIND & (1<<DHT11_PIN));
}

uint8_t Receive_data()			/* receive data */
{
	for (int q=0; q<8; q++)
	{
		while((PIND & (1<<DHT11_PIN)) == 0);  /* check received bit 0 or 1 */
		_delay_us(30);
		if(PIND & (1<<DHT11_PIN))/* if high pulse is greater than 30ms */
		c = (c<<1)|(0x01);	/* then its logic HIGH */
		else			/* otherwise its logic LOW */
		c = (c<<1);
		while(PIND & (1<<DHT11_PIN));
	}
	return c;
}

int main(void)
{

	lcd_init();			/* Initialize LCD */
	lcd_cls();			/* Clear LCD */
	lcd_locate(0,0);		/* Enter column and row position */
	lcd_str("Humidity = ");
	lcd_locate(1,0);
	lcd_str("Temp = ");

    while(1)
	{
		Request();		/* send start pulse */
		Response();		/* receive response */
		I_RH=Receive_data();	/* store first eight bit in I_RH */
		D_RH=Receive_data();	/* store next eight bit in D_RH */
		I_Temp=Receive_data();	/* store next eight bit in I_Temp */
		D_Temp=Receive_data();	/* store next eight bit in D_Temp */
		CheckSum=Receive_data();/* store next eight bit in CheckSum */

		if ((I_RH + D_RH + I_Temp + D_Temp) != CheckSum)
		{
			lcd_cls();
			lcd_locate(0,0);
			lcd_str("Error");
		}

		else
		{
			itoa(I_RH,data,10);
			lcd_locate(0,11);
			lcd_str(data);
			lcd_str(".");

			itoa(D_RH,data,10);
			lcd_str(data);
			lcd_str("%");

			itoa(I_Temp,data,10);
			lcd_locate(1,7);
			lcd_str(data);
			lcd_str(".");

			itoa(D_Temp,data,10);
			lcd_str(data);
			lcd_char(0xDF);
			lcd_str("C ");
		}
		_delay_ms(1500);
	}
}

Kod jest w najprostszej wersji.

Po wyjęciu zasilania i włożeniu wyświetlaja się tylko napisy "Humidity = " i poniżej "Temp = ". Tak jakby wykonała się tylko część w main i nawet nie weszło w pętle. 

Gdy wgram wsad jeszcze raz, wszystko działa jak należy. 

Zacząłem debugować to diodą i program po wyjęciu zasilania utyka w funkcji Response(); i wygląda na to jakby z niej nie wychodził dalej. 

Edytowano przez Krawi92

Rozważając czy może czujnik po zasileniu wymaga czasu na dojście do stanu, w którym może z Tobą rozmawiać, spróbowałbym na pierwszy test wrzucić jakiś większy delay() na początek, by to sprawdzić. Niech i kilka sekund będzie.

  • Pomogłeś! 1

Delay 1,4s na końcu main pomógł 😉 Próbowałem tak, ale za małe czasy dawałem, podobną sytuacje miałem z HC-SR04, że podczas włączania zasilania potrafił się nie włączyć, dopiero wprowadzenie opóźnienia pomogło. 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...