Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:examples:sensor:1-wire [2012/01/23 11:03] heikopikneret:examples:sensor:1-wire [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
-====== 1-wire temperatuuriandur ======+<pagebreak> 
 +====== 1-juhtme tüüpi temperatuuriandur ======
  
 //Vajalikud teadmised: [HW] [[et:hardware:homelab:sensor]], [HW] [[et:hardware:homelab:digi]], //Vajalikud teadmised: [HW] [[et:hardware:homelab:sensor]], [HW] [[et:hardware:homelab:digi]],
Line 6: Line 7:
 ===== Teooria ===== ===== Teooria =====
  
-==== 1-wire protokoll ====+==== 1-juhtme protokoll ====
  
-Lihtsamate seadmete ja anduritega suhtlemiseks  töötas Dallas Semiconductor  välja protokolli, mida kutsutakse  1-wire liideseks, kuna kogu mõlemasuunaline andmevahetus ja toide liiguvad ühe juhtme kaudu. Lisaks võimaldab liides ühele siinile üle 75 seadme ühendamist, moodustades MicroLan võrke. MicroLan võrgus on üks juhtseade, mis juhib võrgus liiklust ja tagab, et siinil olevad seadmed ei üritaks korraga rääkida+[{{  :et:examples:sensor:1-wire_dallas.png?80|DS18S20 andur}}]
  
-1-wire ühendus on peamiselt kasutusel erinevate andurite ja mäludega suhtlemiseks. Saavutatav maksimaalne kiirus jääb 16.3 kbit/s piirimaile. Juhtseade alustab suhtlust „reset“ impulsigamis tõmbab siini maha vähemalt 480 µsPeale seda järgneb 8 bitine korraldusmida kuulavad kõik seadmedSeade, millele see adresseeritud on, vastab. Andmeid saadetakse ja võetakse vastu 8 bitistes gruppides. Seadmeid tuntakse ära unikaalse 64 bitise seerianumbri järgi.+Lihtsamate seadmete ja anduritega suhtlemiseks  töötas Dallas Semiconductor  välja protokolli, mida kutsutakse  1-juhtme (inglise keeles //1-wire//) liidesekskuna kogu mõlemasuunaline andmevahetus ja toide liiguvad ühe juhtme kauduLisaks võimaldab liides ühele siinile üle 75 seadme ühendamistmoodustades MicroLan võrkeMicroLan võrgus on üks juhtseademis juhib võrgus liiklust ja tagab, et siinil olevad seadmed ei üritaks korraga rääkida
  
-Andmete edastamine toimub juhtseadme ja „slave“ seadmete puhul erinevaltJuhtseade"1" saatmiseks tekitab pulsi pikkusega 1 - 15 µs ja "0" saatmiseks 60 µs.  Kui „slave“ tahab andmeid edastada, siis "1" saatmiseks ta ei tee midagi, kuna „pull up“ takisti tõmbab liini kõrgeks. "0" saatmiseks tuleb tal liin  60 µs madalaks tõmmata.+ 
 +[{{:et:examples:sensor:1-wire_yhendus.png?580|1-juhtme andurite võrk}}] 
 + 
 + 
 +1-juhtme ühendus on peamiselt kasutusel erinevate andurite ja mäludega suhtlemiseks. Saavutatav maksimaalne kiirus jääb 16,3 kbit/s piirimaile. Juhtseade alustab suhtlust reset“ impulsiga, mis tõmbab siini maha vähemalt 480 µs. Peale seda järgneb 8 bitine korraldus, mida kuulavad kõik seadmed. Seade, millele see adresseeritud on, vastab. Andmeid saadetakse ja võetakse vastu 8 bitistes gruppides. Seadmeid tuntakse ära unikaalse 64 bitise seerianumbri järgi. 
 + 
 +Bittide edastamine toimub pulsi pikkuse järgi. "1" saatmiseks tekitatakse pulss pikkusega 1 - 15 µs ja "0" saatmiseks 60 µs. 
  
 ===== Praktika ===== ===== Praktika =====
  
-Kodulabori  koosseisus on 1-wire liidesega digitaalne termomeeter tootekoodiga DS18S20. Selle tehnilised omadused on järgnevad:+Robootika Kodulaboriga on lihtne kasutada 1-juhtme liidesega digitaalset termomeetrit tootekoodiga DS18S20. Selle tehnilised omadused on järgnevad:
  
   * Toitapinge +3...+5 VDC   * Toitapinge +3...+5 VDC
Line 23: Line 30:
   * Andmeleht [[http://www.mmajunke.de/ds1820.pdf|Link]]   * Andmeleht [[http://www.mmajunke.de/ds1820.pdf|Link]]
  
-Toodud näiteprogramm teeb 1-wire temperatuurianduriga mõõtmisi ja kuvab tulemuse  +Toodud näiteprogramm teeb 1-juhtme temperatuurianduriga mõõtmisi ja kuvab tulemuse  
-kasutajaliidese ekraanile kraadides. Ühele 1-wire siinile saab programmi praeguste +Kasutajaliidese mooduli ekraanile kraadides. Ühele 1-juhtme siinile saab programmi praeguste 
 seadetega ühendada kuni viis andurit. Andurite otsimine toimub automaatselt. seadetega ühendada kuni viis andurit. Andurite otsimine toimub automaatselt.
  
-1-wire temperatuuriandur tuleb ühendada anduriplaadi pistikusse ADC3. Peale programmi pealelaadimist ja käivitamist ilmub ekraanile anduri järjekorra number ja selle anduri mõõdetav temperatuur Celsiuse kraadides. Kui ühele siinile on ühendatud mitu andurit, siis nende temperatuure kuvatakse järjest. Lisaks näidatakse ka anduri tüüpi ja toiteviisi. Kodulabori anduri tüüp on DS18S20 ja toiteviis eraldi toitega ehk "externally"Teatavasti  +1-juhtme temperatuuriandur tuleb ühendada pistikusse PE0. Peale programmi pealelaadimist ja käivitamist ilmub ekraanile anduri järjekorra number ja selle anduri mõõdetav temperatuur kraadides Celsiuse järgi. Kui ühele siinile on ühendatud mitu andurit, siis nende temperatuure kuvatakse järjest. Lisaks näidatakse ka anduri tüüpi ja toiteviisi. Kodulabori anduri tüüp on DS18S20 ja toiteviis eraldi toitega ehk "externally". 1-juhtme andureid saab ühendada ka parasiittoitele ehk toitele läbi andmesiini. Sellisel juhul on kasutuses ainult kaks juhet ja programmi poolt kuvatakse toiteviisiks "parasite". Vea korral ilmub ekraanile viip "ERROR!". Sellisel juhul kontrollida eelkõige ühendusi.
-saab ka 1-wire andureid ühendada parasiittoitele ehk toitele läbi andmesiini.  +
-Sellisel juhul on kasutuses ainult kaks juhet ja programmi poolt kuvatakse  +
-toiteviisiks "parasite". Vea korral ilmub ekraanile viip "ERROR!". Sellisel juhul +
-kontrollida eelkõige ühendusi.+
  
 Juhtmete värvid anduri ühendamiseks: Juhtmete värvid anduri ühendamiseks:
Line 38: Line 41:
   * Pruun - GND   * Pruun - GND
  
-{{:et:examples:sensor:dscn0629-1.jpg?200|Anduri ühendamine}} 
-{{:et:examples:sensor:dscn0631-1.jpg?200|Ekraanipilt}} 
  
-Temperatuuri lugemist võimaldava programmi näitekood on toodud allpool. Programmi tuleb kindlasti lisada  "onewire.h" "onewire.c", mis sisaldavad 1-wire siinidraiverit. Andurispetsiifiline kood on failides "ds18x20.h" ja "ds18x20.c" Failid ja kogu lähetekoodi leiab projektile lisatud arhiivist.+Temperatuuri lugemist võimaldava programmi näitekood on toodud allpool. Programmi tuleb kindlasti lisada  "onewire.h", mis sisaldab 1-juhtme siinidraiverit. Andurispetsiifiline kood on failis "ds18x20.h".
  
-{{:et:examples:sensor:ds18s20demo.rar|1-wire temperatuurianduri näitekood}} 
  
-~~PB~~+ 
 +<pagebreak>
  
 <code c> <code c>
-#include <avr/io.h> +// 
-#include <string.h>+// 1-juhtme temperatuurianduri lugemise näide 
 +// LCD-le kuvatakse temperatuuri näit 
 +//
 #include <stdio.h> #include <stdio.h>
- 
- 
-#include "onewire.h" 
-#include "ds18x20.h" 
- 
 #include <homelab/module/lcd_gfx.h> #include <homelab/module/lcd_gfx.h>
 #include <homelab/delay.h> #include <homelab/delay.h>
 #include <homelab/pin.h> #include <homelab/pin.h>
 +#include <homelab/module/onewire.h>
 +#include <homelab/module/ds18x20.h>
 +
  
-// 
-// Muutuja, mis on defineeritud mujal. Sellesse salvestatakse 
-// iga anduri järjekorra number ja anduri kood, mis on igal anduril unikaalne. 
-// 
 extern uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; extern uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE];
  
-int main( void )+// 
 +// Põhiprogramm 
 +// 
 +int main(void)
 { {
  uint8_t nSensors, i;  uint8_t nSensors, i;
  int16_t decicelsius;  int16_t decicelsius;
- uint8_t error; 
  char s[10];  char s[10];
  char sensor_nr[1];  char sensor_nr[1];
-  
- // Anduriplaadi multiplexeri viigu seadistamine. 
- pin multiplexer_pin = PIN(G, 0); 
  
  // LCD ekraani algseadistamine  // LCD ekraani algseadistamine
  lcd_gfx_init();  lcd_gfx_init();
-  + 
- // Ekraani puhastamine + // 1-juhtme siini seadistamine. Anduri andmeliin on ühendatud PORTE viiku 0 
- lcd_gfx_clear(); + ow_set_bus(&PORTE.IN,&PORTE.OUT,&PORTE.DIR,0); 
-  + //! Kodulabori II versiooni puhul kasutage näiteks järgmist rida, 
- // Taustavalgustuse tööle lülitamine + //! sel juhul andur ühendada ADC3 viiguga 
- lcd_gfx_backlight(true);  + //ow_set_bus(&DDRF,&PORTF,&PINF,3);
-  +
-  // Multiplexeri viigu seadmine väljundiks ja seejärel toimub selle ümber  +
- // lülitamine, et välised andurite pordid kontrolleriga ühendada+
- pin_setup_output(multiplexer_pin); +
- pin_set(multiplexer_pin);  +
-  +
- // 1-Wire siini seadistamine. Anduriplaadil vastab viigule F3 ADC3 tähistusega pistik. +
- ow_set_bus(&PINF,&PORTF,&DDRF,PF3);+
  
  // Andurite otsimine. Muutujale nSensor omistatakse kõikide leitud  // Andurite otsimine. Muutujale nSensor omistatakse kõikide leitud
Line 98: Line 86:
  nSensors = search_sensors();  nSensors = search_sensors();
  
- while(1)  + while(1) 
-   + {
-  +
- error = 0; +
  // Kui andureid ei leita, siis seatakse püsti vealipp.  // Kui andureid ei leita, siis seatakse püsti vealipp.
- if ( nSensors == 0 ) + if ( nSensors == 0 )
  {  {
- error++;+ lcd_gfx_goto_char_xy(1, 3); 
 + lcd_gfx_write_string("ERROR! No sensors");
  }  }
  
  // Kõikide andurite temperatuuride kuvamine vaheldumisi alates tagumisest andurist.  // Kõikide andurite temperatuuride kuvamine vaheldumisi alates tagumisest andurist.
- for ( i = nSensors; i > 0; i-- ) + for ( i = nSensors; i > 0; i-- )
  {  {
  // Mõõtmise tegemine. Vea korral seatakse vealipp.  // Mõõtmise tegemine. Vea korral seatakse vealipp.
- if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, &gSensorIDs[i-1][0] ) == DS18X20_OK ) + if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, &gSensorIDs[i-1][0] ) == DS18X20_OK )
  {  {
  sw_delay_ms( 750 );  sw_delay_ms( 750 );
- +
  // Anduri väärtuse lugemine muutujasse decicelsius. Vea korral seatakse vealippp.  // Anduri väärtuse lugemine muutujasse decicelsius. Vea korral seatakse vealippp.
- if ( DS18X20_read_decicelsius( &gSensorIDs[i-1][0], &decicelsius) == DS18X20_OK ) + if ( DS18X20_read_decicelsius( &gSensorIDs[i-1][0], &decicelsius) == DS18X20_OK )
  {  {
-  + 
- // Sõna "TEMP" kuvamine.+ // Sõna "Temp" kuvamine.
  lcd_gfx_goto_char_xy(2, 1);  lcd_gfx_goto_char_xy(2, 1);
- lcd_gfx_write_string("TEMP");+ lcd_gfx_write_string("Temp: ");
  
  // Kraadi tähise kuvamine  // Kraadi tähise kuvamine
  lcd_gfx_goto_char_xy(13, 1);  lcd_gfx_goto_char_xy(13, 1);
  lcd_gfx_write_string("C");  lcd_gfx_write_string("C");
- +
  // Lugemi stringiks teisendamine ühe komakohaga ja lisaks +/- lisamine.  // Lugemi stringiks teisendamine ühe komakohaga ja lisaks +/- lisamine.
  DS18X20_format_from_decicelsius( decicelsius, s, 10 );  DS18X20_format_from_decicelsius( decicelsius, s, 10 );
  
  // Kui on vaja maksimaalset täpsust, kasutada järgmist funktsiooni:  // Kui on vaja maksimaalset täpsust, kasutada järgmist funktsiooni:
-    // DS18X20_format_from_maxres( tval, s, 10 ); + // DS18X20_format_from_maxres( tval, s, 10 ); 
- +
  // Temperatuuri ekraanile kuvamine  // Temperatuuri ekraanile kuvamine
- lcd_gfx_goto_char_xy(7, 1); + lcd_gfx_goto_char_xy(8, 1);
  lcd_gfx_write_string(s);  lcd_gfx_write_string(s);
- +
  // Anduri numbri kuvamine. Eelnevalt teisendatakse see stringiks.  // Anduri numbri kuvamine. Eelnevalt teisendatakse see stringiks.
  lcd_gfx_goto_char_xy(0, 1);  lcd_gfx_goto_char_xy(0, 1);
  sprintf(sensor_nr, "%d", i);  sprintf(sensor_nr, "%d", i);
  lcd_gfx_write_string(sensor_nr);  lcd_gfx_write_string(sensor_nr);
- }  +
- else + else
  {  {
  // CRC viga (Ühendus on maas)  // CRC viga (Ühendus on maas)
- error++;+ lcd_gfx_goto_char_xy(1, 3); 
 + lcd_gfx_write_string("ERROR! CRC");
  }  }
- +
  }  }
- else + else
  {  {
  // Mõõtmine ebaõnnestus võibolla on siinil lühis  // Mõõtmine ebaõnnestus võibolla on siinil lühis
- error++;+ lcd_gfx_goto_char_xy(1, 3); 
 + lcd_gfx_write_string("ERROR!");
  }  }
  }  }
-  
-  
- // Veateate kuvamine. 
- if ( error )  
- { 
- lcd_gfx_goto_char_xy(1, 3); 
- lcd_gfx_write_string("ERROR!"); 
- error = 0; 
- } 
- else 
- { 
- lcd_gfx_goto_char_xy(1, 3); 
- lcd_gfx_write_string("        "); 
- } 
- 
  sw_delay_ms(500);  sw_delay_ms(500);
  }  }
 } }
- 
 </code> </code>
- 
  
  
et/examples/sensor/1-wire.1327316634.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0