Wpis z mikrobloga

#programowanie #avr #atmega #atmega8 Panowie co jest nie tak. temperature pokazuje prawidłowo ale jak wypne którykolwiek czujnik temperatury to error zawsze pokazuje w lokalizacji (1,9) wyswietlacz mam oczywiscie 2x16

#include
#include
#include
#include

#include "lcd44780.h"
#include "1Wire/ds18x20.h"

void display_temp(uint8_t x);

uint8_t czujniki_cnt; /* ilość czujników na magistrali */
volatile uint8_t s1_flag; /* flaga tyknięcia timera co 1 sekundę */
volatile uint8_t sekundy; /* licznik sekund 0-59 */

uint8_t subzero, cel, cel_fract_bits;

int main(void) {

//DDRA |= (1<99) { /* gdy licznik ms > 99 (minęła 1 sekunda) */
s1_flag=1; /* ustaw flagę tyknięcia sekundy */
sekundy++; /* zwiększ licznik sekund */
if(sekundy>59) sekundy=0; /* jeśli ilość sekund > 59 - wyzeruj */
cnt=0; /* wyzeru licznik setnych ms */
}
}
  • 20
  • Odpowiedz
/* dokonujemy odczytu temperatury z pierwszego czujnika o ile został wykryty */
if( DS18X20OK == DS18X20readmeas(gSensorIDs[1], &subzero, &cel, &celfractbits) ) displaytemp(9);
else {
lcdlocate(1,9);
lcd
str(" error ");
}

Trochę chaotycznie to opisałeś ale jeśli dobrze rozumiem to chodzi o ten fragment. Gdy masz wpięty jeden czujnik to pierwszy odczyt wykonuje się prawidłowo a przy drugim wywala błąd i komunikuje go w 1,9
  • Odpowiedz
jesli wypne obojetnie jaki to error tylko wyskakuje na pozycji (1,9) a powinno zaleznie od czujnika raz na (1,0) a raz na (1,9)

if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &subzero, &cel, &cel_fract_bits) ) display_temp(0);
else {
lcd_locate(1,0);
lcd_str(" error "); /* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */
}

/* dokonujemy odczytu temperatury z pierwszego czujnika o ile został wykryty */
if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[1], &subzero, &cel, &cel_fract_bits) )
  • Odpowiedz
@kry24: pokaż mi funkcję search_sensors bo zakładam, że niezależnie który czujnik gdzie jest wpięty to ten który działa jest przypisywany jako gSensorIDs[0]
  • Odpowiedz
a i zauwazyłem ze jak wypne czujnik nr.1 to na pół sekundy pojawia sie na 1,0 a pózniej wskakuje na 1,9
  • Odpowiedz
@ad5242: uint8_t search_sensors(void)
{
uint8_t i;
uint8_t id[OW_ROMCODE_SIZE];
uint8_t diff, nSensors;

nSensors = 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;
}

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

nSensors++;
}

return nSensors;
}
  • Odpowiedz
@ad5242: jestes wielki.mirek kardas ma błąd w swojej ksiazce. usunołem
/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 0 sprawdzaj ilość dostępnych czujników */
/*if( 0 == (sekundy%3) ) {

uint8_t *cl=(uint8_t*)gSensorIDs; // pobieramy wskaźnik do tablicy adresów czujników
for( uint8_t i=0; i<MAXSENSORS*OW_ROMCODE_SIZE; i++) *cl++ = 0; // kasujemy całą tablicę
czujniki_cnt = search_sensors(); // ponownie wykrywamy ile jest czujników i zapełniamy tablicę
lcd_locate(0,8);
//lcd_int( czujniki_cnt ); //
  • Odpowiedz
@kry24: To w zasadzie nie błąd, po prostu po uszkodzeniu/wypięciu czujnika przelicza tablicę i ustawia działające w pierwszej kolejności. Z takich moich porad, dobrze byłoby w ogóle nie wyświetlać temperatur z uszkodzonych czujników i wrzucić wyświetlanie i pobieranie w pętli, która będzie się wykonywać tyle razy ile czujników zostało znalezionych. Poza tym wrzuciłbym informację w prawym dolnym rogu wyświetlacza ile czujników zostało podpiętych ale to już takie moje, niekoniecznie poprawne podejście
  • Odpowiedz
@ad5242: mam jeszcze takie małę pytanko. duzo roboty by było aby z tym zrobic takie cos ze od np.20 stopni celcjusza do 80 stopni co 10 stopni zaswiecała sie po kolei dioda..
mam 20c swieci 1-wsza dioda
mam 30c swieci 2-ga dioda(pierwsza tez)
40c swieci 3-cia dioda +1-wsza i 2-ga
itp. do powiedzmy 80c?
  • Odpowiedz