Skocz do zawartości

Po resecie zasilania nie wyświetlaja sie zmienne


Krawi92

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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. 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.