Forum: Mikrocontroller und Digitale Elektronik Anlernprogramm ds1820


von grundschüler (Gast)


Lesenswert?

ich habe diverse uC mit diversen ds1820-Sensoren im Einsatz. Beim 
Wechseln von Teilen der Hardware stellt sich immer wieder das Problem, 
dass die Adresse des Sensors ausgelesen und in das Programm eingegeben 
werden muss.

Ich will das ganze automatisieren. Beim Programmstart sollen die 
vorhandenen Sensoren ausgelesen und mit gespeicherten Werten abgeglichen 
werden. Kommt ein neuer Sensor hinzu, soll die gespeicherte Liste 
aktualisiert werden. Sind mehrere gespeicherte Sensoren nicht vorhanden, 
soll die gespeicherte Liste neu eingelesen und die Reihenfolge der 
Sensoren vom user abgefragt werden.

Gibts dafür schon ein fertiges Programm ?

von W.A. (Gast)


Lesenswert?

grundschüler schrieb:
> Gibts dafür schon ein fertiges Programm ?

Programme zur Verwaltung von Listen gehören zu den Grundübungen des 
Programmierens. Das wird dir gut tun.

von Alex W. (Gast)


Lesenswert?

Falls du noch Pins frei hast, könntest du per i2c-EEPROM die Werte 
wegschreiben und bei der neuen Leiterplatte wieder einlesen lassen.

von grundschüler (Gast)


Lesenswert?

Hier mal ein erster Versuch. IDs von Sensoren werden auf Tastendruck im 
Eprom gelöscht oder hizugeügt. Was noch fehlt, ist ein Verschieben der 
IDs im Eprom.
1
u8 zl,zlx,x;
2
u16 y;
3
y=0x4567;
4
u8 zl_sensors_eep;
5
u32 neu_sensors_eep=0;
6
u8 zl_sensors_hw;
7
u8 zl_sensors_hw_found;
8
u32 neu_sensors_hw=0;
9
10
#define eep_ds1820_adr 20
11
12
//eeprom_update_word(26,0xffff);
13
14
//A. eeprom in array einlesen
15
zl_sensors_eep=0;
16
for(zl=0;zl<ds1820_max_sensors;zl++){
17
  feld_eep[zl] = eeprom_read_word(eep_ds1820_adr+zl*2);
18
    lg(zl%max_zl_y+1,12);lcd_hex16(feld_eep[zl]);
19
      if(feld_eep[zl]!=0 && feld_eep[zl]!=0xffff){
20
        zl_sensors_eep++;  
21
      }else{
22
        break;}
23
  }
24
lgi(2,18,zl_sensors_eep);
25
26
27
28
//B. sensor-ids in array einlesen
29
30
  zl_sensors_hw=0;
31
  ds1820_start_meas();
32
  wait;wait;wait;
33
  read_measkk();
34
35
36
  while(ds1820_idkk[zl_sensors_hw]){
37
//  for(zl=0;zl<4;zl++){
38
    lg(zl_sensors_hw%max_zl_y+1,1);lcd_hex16(ds1820_idkk[zl_sensors_hw]);lw(":");li(ds1820_valkk[zl_sensors_hw]);
39
//    eeprom_update_word((u16*)(eep_ds1820_adr+zl*2),ds1820_idkk[zl]);
40
x=eep_ds1820_adr;
41
x+=zl*2;
42
lgi(4,1,x);
43
//if(ds1820_idkk[zl]>0)eeprom_update_word(x,ds1820_idkk[zl]);
44
    wait;
45
    
46
    zl_sensors_hw++;
47
  }
48
  lgi(1,18,zl_sensors_hw);
49
  zlx++;
50
  
51
  
52
53
//C.feststellen, ob neue Sensoren vorhanden sind
54
u32 neu=0;
55
56
zl_sensors_hw_found=0;
57
for(i=0;i<zl_sensors_hw;i++){//zl=>anz gefundene Sensoren
58
sbi(neu,i);
59
/**/for(x=0;x<ds1820_max_sensors;x++){
60
//lgi(1,1,ds1820_idkk[i]);lw(" ");
61
//lgi(2,1,feld_eep[x]);lw(" ");
62
//wait;
63
    if(ds1820_idkk[i]==feld_eep[x]){
64
      cbi(neu,i);
65
      zl_sensors_hw_found++;
66
      sbi(neu_sensors_eep,x);
67
      continue;
68
    }
69
  }//for x
70
71
}//for i
72
73
lgw(4,1,"n.s.:");li(neu);lw("!");
74
li(zl_sensors_hw_found);lw("!");
75
li(zl_sensors_eep);lw("!");
76
li(neu_sensors_eep);lw("!");
77
78
79
//D. Auswerten eep
80
zl=0;
81
if(zl_sensors_eep-zl_sensors_hw_found){
82
    for(i=0;i<zl_sensors_eep;i++) {
83
      if(!gbi(neu_sensors_eep,i)){
84
//      lg(1+zl%max_zl_y,1);lcd_hex16(feld_eep[i]);lw(" delete in eep?");wait;
85
      lg(1,5);lcd_hex16(feld_eep[i]);lw("del eep?");
86
          x=eep_ds1820_adr+i*2;li(x);
87
        timeoutx=500;
88
        while(timeoutx){
89
          if(tast1){
90
            eeprom_update_word((u16*)(x),0xffff);
91
            lgw(1,1,"done delete");
92
          }
93
        }      
94
      zl++;
95
      }
96
    }
97
}
98
99
100
101
//E. Auswerten hw
102
zl=0;
103
if(zl_sensors_hw-zl_sensors_hw_found){
104
    for(i=0;i<zl_sensors_hw;i++) {
105
      if(gbi(neu,i)){
106
//      lg(1+zl%max_zl_y,1);lcd_hex16(feld_eep[i]);lw(" delete in eep?");wait;
107
          x=eep_ds1820_adr+(zl_sensors_eep+i)*2;
108
      lg(2,4);lcd_hex16(ds1820_idkk[i]);lw("stor hw?");li(x);
109
        timeoutx=500;
110
        while(timeoutx){
111
          if(tast1){
112
            eeprom_update_word(x,ds1820_idkk[i]);
113
            lgw(1,1,"done store");
114
115
          }
116
        }      
117
      zl++;
118
      }
119
    }
120
}
121
lgw(1,4,"end");

von Wolfgang (Gast)


Lesenswert?

grundschüler schrieb:
> Was noch fehlt, ist ein Verschieben der IDs im Eprom.

Warum willst du die verschieben. Ein passend sortierter Index wäre eine 
Alternative.

von grundschüler (Gast)


Lesenswert?

Wolfgang schrieb:
> Warum willst du die verschieben.
1
      if(feld_eep[zl]!=0 && feld_eep[zl]!=0xffff){
2
...
Wenn ein Feld gelöscht ist, hört das Einlesen an dieser Stelle auf. 
Deswegen müssen die Felder dahinter einen Index nach vorne.

Man könnte aber auch den eep-Bereich auf dem eprom auf 100Felder 
vergrößern und deiesen Bereich immer auslesen und nur die beschriebenen 
Felder ins Programm übernehmen. Vielleicht hast du recht. Danke für den 
Hinweis.

von grundschüler (Gast)


Lesenswert?

die Sensorwerte werden jetzt entsprechend der eprom-Reihenfolge 
ausgelesen:
1
  for(i=0;i<zl_sensors_eep;i++) {
2
  if(ds1820_idkk[kk_ct]==ds1820_eep[i]){ds1820_valkk[i]=CelsiusTemp;}
3
  }
4
5
kk_ct++;

Damit werden die IDs der Sensoren verzichtbar. Die Weiterverarbeitung 
erfolgt entsprechend der Position im eprom:
#define tr_ww ds1820_valkk[1]
Einzelne Sensoren können ausgetauscht werden, ohne dass man vorher die 
ID ermitteln muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.