Portál AbcLinuxu, 12. května 2025 04:19

Dotaz: C - chybné čtení id 1. sensoru

28.5.2010 17:14 mcuProg
C - chybné čtení id 1. sensoru
Přečteno: 352×
Odpovědět | Admin
Mám naprogramovaný termostat. Blbne mi ale část kódu, která má za úkol ukládat do eeprom IDčka teplotních sensorů.
uint8_t search_sensors(void) {
	uint8_t i;
	uint8_t id[OW_ROMCODE_SIZE];
	uint8_t diff;
	bool akva1, akva2, lednice, mistnost;
	

	while(1) {
		//writestr("+4 NACITAM SENZORY");
		//lfcr();

		m_delay_ms(250);

		nSensors = 0;
		akva1_id = -1;
		akva2_id = -1;
		lednice_id = -1;
		mistnost_id = -1;
		for(uint8_t iN = 0; iN<MAXSENSORS; iN++) { // nemá vliv na chování
			for(uint8_t iN2 = 0; iN2<OW_ROMCODE_SIZE; iN2++) {
				gSensorIDs[iN][iN2] = 0;
			}
		}


		for(diff = OW_SEARCH_FIRST; diff != OW_LAST_DEVICE && nSensors < MAXSENSORS; ) {
			DS18X20_find_sensor( &diff, &id[0] );
		
			if( diff == OW_PRESENCE_ERR ) break;
			if( diff == OW_DATA_ERR ) break;

			akva1 = true;
			akva2 = true;
			lednice = true;
			mistnost = true;

			for (i=0;i<OW_ROMCODE_SIZE;i++) {
				gSensorIDs[nSensors][i]=id[i];

				if(akva1) {
					eeprom_busy_wait();
					if( gSensorIDs[nSensors][i] != eeprom_read_byte((uint8_t*)(EEPROM_AKVA1_SENSOR+i)) ) akva1 = false;
				}

				if(akva2) {
					eeprom_busy_wait();
					if( gSensorIDs[nSensors][i] != eeprom_read_byte((uint8_t*)(EEPROM_AKVA2_SENSOR+i)) ) akva2 = false;
				}

				if(lednice) {
					eeprom_busy_wait();
					if( gSensorIDs[nSensors][i] != eeprom_read_byte((uint8_t*)(EEPROM_LEDNICE_SENSOR+i)) ) lednice = false;
				}

				if(mistnost) {
					eeprom_busy_wait();
					if( gSensorIDs[nSensors][i] != eeprom_read_byte((uint8_t*)(EEPROM_MISTNOST_SENSOR+i)) ) mistnost = false;
				}
			}

			if(akva1 && !akva2 && !lednice && !mistnost) {
				akva1_id = nSensors;
				leds_add(port_led_akva1);
			}
			if(!akva1 && akva2 && !lednice && !mistnost) {
				akva2_id = nSensors;
				leds_add(port_led_akva2);
			}
			if(!akva1 && !akva2 && lednice && !mistnost) {
				lednice_id = nSensors;
				leds_add(port_led_lednice);
			}
			if(!akva1 && !akva2 && !lednice && mistnost) {
				mistnost_id = nSensors;
			}		
			nSensors++;
		}
	
		if( nSensors ) return nSensors;

		leds_search();

		leds_blink(LED_BLINK_FAST_INTERVAL);

		m_delay_s(1);
	}
}

void vypsat_senzory() {
	nSensors = search_sensors();

	for ( int i=0; i<nSensors; i++ ) {
		writestr("#");
		writestr_integer((int) i);
		if(i == akva1_id)
			writestr(":AKVA1:");
		if(i == akva2_id)
			writestr(":AKVA2:");
		if(i == lednice_id)
			writestr(":LEDNICE:");
		if(i == mistnost_id)
			writestr(":MISTNOST:");
		writestr(" ");
		writetemp(getTemp(i));
		lfcr();
	}
}

void uloz_senzor( uint8_t *id, uint8_t kam ) {
	for (int i=0; i<OW_ROMCODE_SIZE; i++) {
		eeprom_busy_wait();
		eeprom_write_byte((uint8_t*)(kam+i),id[i]);
	}
}

void nastav_senzor(char cilselekt) {
	uint8_t sensT = (uint8_t)(rx_buffer[0]-48);
	writestr_integer((int) sensT); lfcr();
	if ( sensT < nSensors ) {
		if(cilselekt == '1')
			uloz_senzor(&gSensorIDs[sensT][0], EEPROM_AKVA1_SENSOR);
		else if(cilselekt == '2')
			uloz_senzor(&gSensorIDs[sensT][0], EEPROM_AKVA2_SENSOR);
		else if(cilselekt == 'l')
			uloz_senzor(&gSensorIDs[sensT][0], EEPROM_LEDNICE_SENSOR);
		else if(cilselekt == 'm')
			uloz_senzor(&gSensorIDs[sensT][0], EEPROM_MISTNOST_SENSOR);
		else errorWrite(1);
		writestr("+1 OK");
		lfcr();
		nSensors = search_sensors();
		vypsat_senzory();
	}
	else
		errorWrite(1);
}

void eeprog_vstup_podprogram() {
	if(citac_ee > 0) {
		for (uint8_t i=RX_BUFFER_SIZE; i>0; i--) rx_buffer[i]=0;
		rs232enter=0;
		rs232ready=true;
		while(1) {
			if(rs232enter) {
				rs232ready=false;
				if(cmdtest('L','S',0))
					vypsat_senzory();
				else if(cmdtest('S','A',1))
					nastav_senzor('1');
				else if(cmdtest('S','B',1))
					nastav_senzor('2');
				else if(cmdtest('S','L',1))
					nastav_senzor('l');
				else if(cmdtest('S','M',1))
					nastav_senzor('m');
				else if(cmdtest('E','Q',0)) {
					writestr("+1 OK"); lfcr();
					break;
				}
				else
					errorWrite(3);
				for (uint8_t i=RX_BUFFER_SIZE; i>0; i--) rx_buffer[i]=0;
				rs232enter=0;
				rs232ready=true;
			}
		}
	}
	else
		errorWrite(4);
}

Samotné search_sensors(void) funguje dobře, opravdu porovnává všechny bajty identifikace senzoru vs. uložená identifikace v eeprom. Problém nastává, pokud chci uložit nový senzor. Všechny se ukládají dobře, kromě 1.(senzor #0). Pokud se jednoduše snažím uložit senzor 0 jako cokoliv, tak je první bajt vždy 0x00. Takhle vypadá část eepromky: 00FBFA97020000A728D6F797020000B72820BA9702000072. Správně ale má být 28FBFA97020000A728D6F797020000B72820BA9702000072. Co mám špatně?

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

28.5.2010 21:29 mcuProg
Rozbalit Rozbalit vše Re: C - chybné čtení id 1. sensoru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Uz jsem to nasel, asi bych nemel jen tak bezhlave kopirovat :[ for (uint8_t i=RX_BUFFER_SIZE; i>0; i--) se dostane mimo pole
30.5.2010 12:19 tom
Rozbalit Rozbalit vše Re: C - chybné čtení id 1. sensoru
Doporucuju cykly pres pole psat se sizeof jako napr. for (uint8_t i = sizeof id - 1; i>=0; i--)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.