Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   77 / 153
(#) Bell hozzászólása Júl 21, 2013 /
 
Sziasztok!

SPI hardver inicializálással kapcsolatban van gondom. PIC18F2321-re XC8-al lefordul, de PIC24F16KA102-nél ezt a hibát kapom:
error: 'SPI_FOSC_64' undeclared (first use in this function)
  1. #include <xc.h>
  2. #include <spi.h>
  3. #include <stdio.h>
  4. ...
  5. int main(void}
  6.         {
  7.             OpenSPI(SPI_FOSC_64, MODE_00, SMPEND);
  8.         }

Mit rontok el?
(#) Hp41C válasza Bell hozzászólására (») Júl 21, 2013 /
 
Szia!
Más az SPI órajel előállítása a 24FVxxKA -n. Töltsd be a kontrollerhez tartozó header állományt és ott nézd meg a definiált konstansokat.
(#) Bell válasza Hp41C hozzászólására (») Júl 21, 2013 /
 
Köszönöm, megtaláltam. Azt hiszem lényegesen egyszerűbb bit szinten intézni a konfigot és a kommunikációt, mint ezt a periféria library-t használni.
(#) Hp41C válasza Bell hozzászólására (») Júl 21, 2013 / 1
 
"A periféria library használata megkönnyíti a hordozhatóságot." Ennyit erről..
A hozzászólás módosítva: Júl 21, 2013
(#) Bell válasza Hp41C hozzászólására (») Júl 21, 2013 /
 
Ez fontos infó volt, helyretette a dolgokat, köszönöm!
Naiv módon azt hittem, nem kell hozzá bitszinten foglalkozni minden részlettel.
(#) janimester hozzászólása Júl 28, 2013 /
 
Sziasztok. Sejtem hetekig várhatok válaszra de azért megkérdezem ki tudna segíteni abban hogy a mikroc ds18b20 hőmérő programomhoz ami működik miként tudnék beletenni egy olyant hogy ha elér egy bizonyos hőfokot az érzékelő akkor kapcsoljon be egy kimenetet a pic-en 0-ról 5v-ra mind addíg amíg a hőfok nem csökken tehát termosztátnak szeretném használni. Itt a kód : (18f2550)
Van bent sok felesleges más dolog de inkább nem ollózom ki. Kérem aki ért ehhez segítsen vagy egészítse ki a kódot hogy kellene beállítani akkor a szenzort.
  1. sbit LCD_RS at RC0_bit;
  2. sbit LCD_EN at RC1_bit;
  3. sbit LCD_D4 at RC2_bit;
  4. sbit LCD_D5 at RC6_bit;
  5. sbit LCD_D6 at RC7_bit;
  6. sbit LCD_D7 at RA2_bit;
  7. sbit LCD_RS_Direction at TRISC0_bit;
  8. sbit LCD_EN_Direction at TRISC1_bit;
  9. sbit LCD_D4_Direction at TRISC2_bit;
  10. sbit LCD_D5_Direction at TRISC6_bit;
  11. sbit LCD_D6_Direction at TRISC7_bit;
  12. sbit LCD_D7_Direction at TRISA2_bit;
  13.  
  14. unsigned long temp;
  15. unsigned int i;
  16. char digit[]="00.0V";
  17.  
  18. const unsigned short TEMP_RESOLUTION = 12;
  19. char *text = "000.0";
  20.  
  21. unsigned long RPM_Value;
  22. sbit IR_Tx at RA3_bit;
  23.  
  24.  void Display_Temperature(unsigned int temp2write) {
  25.   const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  26.   char temp_whole;
  27.   unsigned int temp_fraction;
  28.   if (temp2write & 0x8000) {
  29.      text[0] = ' ';
  30.      temp2write = ~temp2write + 1;
  31.      }
  32.   temp_whole = temp2write >> RES_SHIFT ;
  33.   if (temp_whole/100)
  34.   text[0] = temp_whole/100  + 48;
  35.   else
  36.   text[0] = ' ';
  37.   text[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
  38.   text[2] =  temp_whole%10     + 48;             // Extract ones digit
  39.   temp_fraction  = temp2write << (4-RES_SHIFT);
  40.   temp_fraction &= 0x000F;
  41.   temp_fraction *= 628;
  42.   text[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
  43.   Lcd_Out(1, 14, text);
  44. }
  45.  char message1[] = "FORDULAT";
  46.  char *RPM = "00000RPM";
  47.  
  48.  void Display_RPM(unsigned long num){
  49.   RPM[0] = num/10000 + 48;
  50.   RPM[1] = (num/1000)%10 + 48;
  51.   RPM[2] = (num/100)%10 + 48;
  52.   RPM[3] = (num/10)%10 + 48;
  53.   RPM[4] = num%10 + 48;
  54.   Lcd_Out(3,13,RPM);
  55.  }
  56.  
  57. void main() {
  58. Lcd_Init();
  59. Lcd_Cmd(_lcd_clear);
  60. Lcd_Cmd(_lcd_cursor_off);
  61. Lcd_out(1,1,"Simson Race Technic");
  62. Delay_ms(500);
  63. Lcd_out(2,7,"S80/5M");
  64. Delay_ms(500);
  65. Lcd_out(3,3,"by: Fekete Janos");
  66. Delay_ms(500);
  67. Lcd_out(4,1,"Computer inditasa...");
  68. Delay_ms(500);
  69.  
  70.   CMCON = 0x07;   // Disable comparators
  71.   ADCON1 = 0x0F;  // Disable Analog functions
  72.   ADCON0=0x01;    //voltmérőé
  73.   ADCON1=0x0E;    //voltmérőé
  74.   TRISC = 0x00;
  75.   //TRISB   = 0;                               // PORTB all output to LED
  76.   TRISB = 0x07F;
  77.   PORTA = 0x00;
  78.   TRISA = 0b00010000;
  79.   T0CON = 0b01101000; // TMR0 as 16-bit counter
  80.  
  81. Lcd_Init();
  82. Lcd_Cmd(_LCD_CLEAR);
  83. Lcd_Cmd(_LCD_CURSOR_OFF);
  84. LCD_Out(2,1,"AKKU");
  85. Lcd_Out(3,1,message1);
  86. Delay_ms(100);
  87. Lcd_Out(1,1,"HENGER");
  88. Lcd_Chr(1,19,223);
  89. Lcd_Chr(1,20,'C');
  90.  
  91.  
  92.   do {
  93.     temp = ADC_Read(0) *2;
  94.     digit[0] = temp/1000 + 48;
  95.     digit[1] = (temp/100)%10 + 48;
  96.     digit[3] = (temp/10)%10 + 48;
  97.     LCD_Out(2,16,digit);
  98.    
  99.     Ow_Reset(&PORTA, 1);                         // Onewire reset signal
  100.     Delay_ms(10);
  101.     Ow_Write(&PORTA, 1, 0xCC);                   // Issue command SKIP_ROM
  102.     Delay_ms(10);
  103.     Ow_Write(&PORTA, 1, 0x44);                   // Issue command CONVERT_T
  104.     Delay_us(10);
  105.     Ow_Reset(&PORTA, 1);
  106.     Delay_ms(10);
  107.     Ow_Write(&PORTA, 1, 0xCC);                   // Issue command SKIP_ROM
  108.     Delay_ms(10);
  109.     Ow_Write(&PORTA, 1, 0xBE);                   // Issue command READ_SCRATCHPAD
  110.     Delay_ms(10);
  111.     temp =  Ow_Read(&PORTA, 1);
  112.     temp = (Ow_Read(&PORTA, 1) << 8) + temp;
  113.     Display_Temperature(temp);
  114.     Delay_ms(20);
  115.    
  116.    T0CON.TMR0ON = 1;
  117.    TMR0L = 0;
  118.    TMR0H = 0;
  119.    IR_Tx = 1;
  120.    Delay_ms(62); // Wait for 1 sec
  121.    IR_Tx = 0;
  122.    T0CON.TMR0ON = 0;    // Stop the timer
  123.    RPM_Value = (256*TMR0H + TMR0L)*990;
  124.    Display_RPM(RPM_Value);
  125.    
  126.   } while(1);
  127. }
A hozzászólás módosítva: Júl 28, 2013
(#) röntgen válasza janimester hozzászólására (») Júl 28, 2013 / 1
 
Szia,
PortA.0 lesz a kapcsolt kimenet.
13. sorba ezt írd:
unsigned int term_kapcs=30; // Pl. 30°a termosztát érték

A 125. sortól ezt szúrnám be:
  1. if (RPM_Value<term_kapcs)
  2.      PORTA |= 1;
  3. else
  4.      PORTA &= 0xFE;


Így elméletileg 30°alatt bekapcsol (H-szint) lesz a PORTA.0 bitje, a fölött viszont kikapcsol (L-szint).

Remélem segítettem.....
(#) Bell válasza janimester hozzászólására (») Júl 28, 2013 /
 
A mikroc-t nem ismerem, így csak azt írom, amivel én próbálkoznék.
A 112-es sorban eredményül kapott temp értékét össze kell hasonlítani a beállított hőfokkal. Ha temp kisebb, mint ami kell, akkor be, ha nagyobb, akkor ki kell kapcsolni a fűtést.
A Hiszterezis_Fele néhány (tized) fok, a stabilabb működéshez kell.
Ilyesmire gondolok (szintaktikai hibák lehetnek benne):
  1. if((Bekapcsolt_Futes==1) && ((temp + Hiszterezis_Fele) > Beallitott_Hofok))
  2. {
  3.         Futes_Kikapcs; // a szükséges port adott bitjét töröljük
  4.         Bekapcsolt_Futes=0;
  5. }
  6.  
  7. if((Bekapcsolt_Futes==0) && ((temp - Hiszterezis_Fele) < Beallitott_Hofok))
  8. {
  9.         Futes_Bekapcs; // a szükséges port adott bitjét 1-be állítjuk
  10.         Bekapcsolt_Futes=1;
  11. }
(#) _vl_ válasza röntgen hozzászólására (») Júl 28, 2013 /
 
18F-eken van LATA, ahol pedig van, ott azt kell használni PORTA helyett kimeneteknél.
(#) röntgen válasza _vl_ hozzászólására (») Júl 28, 2013 /
 
Oké, rendben. Nem tudom hogy mikroC-ben van LATA szintaktikailag?
(#) Hp41C hozzászólása Aug 7, 2013 /
 
Érdekes dolgokat lehet találni más fórumokon is...
(#) MPi-c válasza Hp41C hozzászólására (») Aug 9, 2013 /
 
A forrás még nem volt meg. Akinek kell, itt egy kis segítség a fordításhoz. Rövid teszt alapján: működik.
(#) Wudoou hozzászólása Aug 17, 2013 /
 
Sziasztok!
Egy kis segítséget szeretnék kérni PIC + 4x20 karakteres LCD projektben.
Szóval az a gondom, hogy néha kihagy egy betűt, szóval nem írja ki.
Próbapanelben már olyat is csinált, hogy visszafelé írta ki a szöveget.
Azóta csináltam egy nyákot, abban nem jelentkezett.
4 bites üzemmódban használom. Tipikusan ennél a forráskód részletnél akad ki:
  1. for(unsigned char kijel=1;kijel<=8;kijel++){
  2.                                 lcd_goto(lcd_cim[kijel-1]);
  3.                                 lcd_puts("Hő");
  4.                                 lcd_senddecimal(kijel,1);
  5.                                 lcd_puts(": ");
  6.                                 if(atlag[kijel-1]!=-128 && atlag[kijel-1]!=-127){
  7.                                         lcd_senddecimal(atlag[kijel-1]/4,0);
  8.                                         lcd_puts("  ");
  9.                                 }
  10.                                 else if(atlag[kijel-1]==-128) lcd_puts("ERR ");
  11.                                 else lcd_puts("---");
  12.                         }
  13.                         vWait_sec(5);
  14.  
  15.                         for(unsigned char kijel=9;kijel<=16;kijel++){
  16.                                 lcd_goto(lcd_cim[kijel-9]);
  17.                                 lcd_puts("Hő");
  18.                                 lcd_senddecimal(kijel,1);
  19.                                 lcd_puts(": ");
  20.                                 if(atlag[kijel-1]!=-128 && atlag[kijel-1]!=-127){
  21.                                         lcd_senddecimal(atlag[kijel-1]/4,0);
  22.                                         lcd_puts("  ");
  23.                                 }
  24.                                 else if(atlag[kijel-1]==-128) lcd_puts("ERR ");
  25.                                 else lcd_puts("---");
  26.                         }
  27.                         vWait_sec(5);
  28.                         for(unsigned char kijel=17;kijel<=24;kijel++){
  29.                                 lcd_goto(lcd_cim[kijel-17]);
  30.                                 lcd_puts("Hő");
  31.                                 lcd_senddecimal(kijel,1);
  32.                                 lcd_puts(": ");
  33.                                 if(atlag[kijel-1]!=-128 && atlag[kijel-1]!=-127){
  34.                                         lcd_senddecimal(atlag[kijel-1]/4,0);
  35.                                         lcd_puts("  ");
  36.                                 }
  37.                                 else if(atlag[kijel-1]==-128) lcd_puts("ERR ");
  38.                                 else lcd_puts("---");
  39.                         }
  40.                         }

ahol az lcd_cim egy 8 elemű tömb:
  1. const char lcd_cim[8]={0,64,20,84,10,74,30,94};

Itt vannak eltárolva az LCD sor és oszlop címei.
Szóval az első for ciklusig minden havaii, második és harmadik for ciklushoz érve kihagyja a 'H' betűt(lásd melléklet).
Az LCD szalagkábellel van kivezetve. Táplábon ott a 100nF kondi.
Viszont a nem használt lábak nincsenek lekötve GND-re. Ez lehet gond?
A hozzászólás módosítva: Aug 17, 2013
(#) _vl_ válasza Wudoou hozzászólására (») Aug 17, 2013 /
 
Szerintem ez tipikus zajprobléma.
Idézet:
„Az LCD szalagkábellel van kivezetve. Táplábon ott a 100nF kondi.”

Táp/vezetékezés, ilyesmik. A szalagkábel milyen hosszú? Soros ellenállások vannak-e a vezetékeken?
(#) Wudoou válasza _vl_ hozzászólására (») Aug 17, 2013 /
 
Kb. 7 cm. Soros ellenállásokat nem tettem.
Egyébként érdekes a dolog, mert ha kiveszem azt a sort, hogy
  1. lcd_puts("  ");
akkor jó lesz. Csak hát ezt nem nagyon értem, mert a következő ciklusban meg ismét kiírom...
(#) _vl_ válasza Wudoou hozzászólására (») Aug 17, 2013 /
 
Akkor lehet, hogy csak nem úgy működik, mint ahogy várod.
Ilyenkor a helyes megoldás az, hogy átrakod egy PC-s C programba, telepakolod debug printf-ekkel, és rájössz, hogy hol nem az történik, mint amit gondoltál.
(#) Wudoou válasza _vl_ hozzászólására (») Aug 18, 2013 /
 
Ahogy anno az egyetemen a tanárom mondta: A programjaink nem a kívánságainkat, hanem a leírt sorainkat teljesítik.
No még lenne egy kérdésem. Kaptam egy warningot a fordítótól:
Idézet:
„Warning [1393] D:\Munka\Cseko\cseko_hom_logger_pic_130814\main_x.c; 542. possible hardware stack overflow detected, estimated stack depth: 9”

Megpróbáltam megnézni a memóriát és nem értem, de a bank2 full üres.
Így megpróbáltam belerakni egy nagyobb változót:
  1. bank2 int atlag[24];

De így is üres maradt.
Ez mitől van?

hitech.JPG
    
(#) pbalazs válasza Wudoou hozzászólására (») Aug 18, 2013 / 1
 
Az nem lehet, hogy a két "whitespace" felülírja a H betűt?
Próbáld meg egy "whitespace"-szel, vagy írj be helyette "xx"-et, hogy lásd, mit, hova ír.
(#) _vl_ válasza Wudoou hozzászólására (») Aug 18, 2013 / 1
 
Ez az üzenet arra utal, hogy hívogatod szépen sorban a függvényeket, egyikből a másikat, és a fordító úgy számolja, hogy bizony a függvényhívogatások fája nagyobb mélységű, mint amit a mikrokontroller kezelni tud. A .lst fájlban "stack", meg "call graph" szövegek környékén elemzi a problémát.
(#) Wudoou válasza pbalazs hozzászólására (») Aug 18, 2013 /
 
De igen, egynél már nem törli le a H-t. Csak érdekes, hogy nem mindenütt törölte le.
Meg a következő ciklus elején úgy is visszaírom, tehát nem értem miért tűnt el.
(#) Wudoou válasza _vl_ hozzászólására (») Aug 18, 2013 /
 
ÁHÁÁÁ, na akkor koppantam.
Szóval akkor azt kellene valahogy megnéznem, hogy hol van ilyen mély függvényhívás.
(#) Wudoou hozzászólása Aug 22, 2013 /
 
Sziasztok!
Megint én vagyok.
Abban kérnék egy kis tanácsot, hogy csinálok egy mérőpanelt, amely tartalmaz egy 4x20 karakteres LCD-t, 1 lábon ds18b20-as érzékelőket buszosan felfűzve, illetve egy max485 átalakítót.
A feladat az lenne, hogy megmérni a hőket, véleményem szerint leátlagolni, majd ha kész az átlag, akkor kiírni az lcd-re. Mivel az lcd-re 24 hő egyszerre nem fér ki, így nyolcasával vannak megjelenítve, majd 5 másodperc várakozás után a következő 8, majd az utolsó nyolc, majd ismét hőmérés, átlagszámítás, majd kiírás...
Na már most az RS485-ről kapott adatok megszakításban vannak lekezelve, amelyben ki van értékelve, hogy mi jött, a protokoll egyenlőre olyan, hogy *+pic címe+parancs.
* - figyelem felhívás, pic címe-egyértelmű (ugyanis több ilyen panel lesz) majd parancs, ami lehet:
1 - ez a hőadatok bekérése
2 - ez a ds-ek darabszáma
3 - ez a busz állapota
Mind a 3 parancs hatására 1-1 jelzőbit lesz 1-be állítva, ami majd jelez a főprogramnak, hogy mit kell csinálnia. Ez azért van, mert anno nekem úgy tanították, hogy a megszakításban a lehető legrövidebb ideig kell tartózkodni.
Így ő csak jelez.
Amikor a főprogram odaér (és itt lesz a problémám) akkor megnézni, hogy melyik bit lett 1-es és annak megfelelő feltételt teljesíti, majd a bitet visszaállítja 0-ba, mely jelzi, hogy a feladat elvégezve.
A gond az, hogy mondjuk épp ott jár a főprogram, hogy az első 8 hőt írja ki.
Jön egy pl. :*71, ami azt jelenti, hogy el kell küldeni a hőadatokat.
Igen ám, de ez majd csak a harmadik 8-as után lesz kiértékelve, addíg még van 15 másodperc késleltetés és hát működik szépen, csak ez elég lassú így. Persze ha a harmadik 8-ast írja ki, akkor csak 5 másodpercet kell várni.
Na szóval esetleg valaki tudna segíteni, hogy hogyan kellene átszervezni a programot?
PIC16f886-ról van szó, hi-tech C-ben írva a kód.
Talán az időzítést is valamelyik timerrel kellene megoldani?
Jelenleg szoftveres késleltetés van.
(#) kissi válasza Wudoou hozzászólására (») Aug 22, 2013 /
 
Ezt csak megszakítással tudod megoldani ! Kell egy timer, ami pl. 0,1 s-ként jelez, a kiírást addig csinálod, amíg ebből bejön 50 db, de közben tudsz foglalkozni a többi feladattal is a főprogramban... !
(#) Wudoou válasza kissi hozzászólására (») Aug 22, 2013 /
 
Az ugye csúnya dolog lenne, ha globális változókba menteném a hőadatokat, stb. És így a megszakítás is látná, és ott küldeném el őket?
(#) kissi válasza Wudoou hozzászólására (») Aug 22, 2013 /
 
Ezt meg kell tudnod oldani a főprogramból is ( a lényeg a főprogramban sehol ne időzzön / bár a DALLAS kiolvasását nem illik a megszakításnak félbeszakítania ! / ) !
(#) Wudoou válasza kissi hozzászólására (») Aug 22, 2013 /
 
Addíg, míg olvas, a megszakítás ki van kapcsolva. Sőt még egy jó pár helyen is, mert sajnos már tapasztaltam olyat, hogy kiírtam az lcd-re, jött egy megszakítás, és utána nem jól írta ki a maradék szöveget az lcd-re. Vagy pl. átlagszámításnál nem lett jó az átlag.
Szóval akkor inkább használjak egy timert, minden timer megszakításnál növeljek egy statikus változót, pl.
  1. timer_count++
, és így megmarad az értéke.
Addíg míg ez pl. kisebb, mint pl. 50, addíg az első 8 hő, ha nagyobb 50, kisebb mint 100, addíg második 50, és így tovább...
Közben meg tudna mást is csinálni.
(#) watt válasza Wudoou hozzászólására (») Aug 22, 2013 /
 
Szia!
Egyszerűen tárold el az előző hőfokértékeket és azokat add át. Nincs jelentősége, hogy az előző kiértékelés időpontjához tartozókat adod át, ha lassú mérés, ha nem. Amikor megvan a következő kör, frissíted a tárolót.
A másik észrevételem, hogy a ds-eket egyszerre lehet konvertálásra indítani, majd sorban kiolvasni mindegyiket, ha készen vannak. Így nagyon gyors lesz a hőmérés is.
Nem csúnya dolog globális változókat használni, ez nem PC. Persze a memória határt szabhat, de ha kell, akkor kell.
Ha a megszakítás ilyen bajt okozott, akkor ott valamit nem jól szerveztél. Persze vannak dolgok, amiket nem lehet megszakítani, de elég kevés, és az LCD vezérlése nem ezek közé tartozik.
A hozzászólás módosítva: Aug 22, 2013
(#) Wudoou válasza watt hozzászólására (») Aug 22, 2013 /
 
Idézet:
„a ds-eket egyszerre lehet konvertálásra indítani, majd sorban kiolvasni mindegyiket, ha készen vannak”

Ezeket hogyan?
Az én programom kicsit más, mivel (úgy látom te vagy watt, úgyhogy tudod miről van szó) itt egy siló hőmérést kell megvalósítani úgyhogy tudni kell, ki hol helyezkedik el a buszon és ezért nekem eepromban le van mentve mindenkinek a címe.
Amikor a ds1820_read megkapja az argumentumot akkor azt nézem meg, hogy hol van.
Na szóval csatolom a ds1820_read() függvényt:
  1. float ds1820_read(unsigned char device){
  2.         //GIE=0;
  3.         unsigned char lyuk=0;
  4.         for(unsigned char xcv=0;xcv<8;xcv++){
  5.                 if(eeprom_read(device*0x08+xcv)==0x00){
  6.                         lyuk++;
  7.                 }
  8.         }
  9.         if(lyuk>7){
  10.                 return(-127);
  11.         }
  12.         unsigned char reg[10];
  13.         unsigned char busy=0, temp1, temp2;
  14.     int temp3;
  15.     float result;
  16.  
  17.         OW_reset();                                                             //onewire reset
  18.         Send_MatchRom(device);                                  //Eszköz kijelölése
  19.         OW_write_byte(START_CONVERSION);                //Konverzió elindítása
  20.  
  21.        
  22.         if(OW_read_byte()==0xff)return (-128)//A hőmérséklet konverzió ideje alatt a DS buszt 0-ba húzza
  23.     while(busy == 0){                //Ha a busz nem 0, akkor az adott érzékelő nincs a buszon
  24.         busy = OW_read_byte();                         
  25.         }
  26.  
  27.     OW_reset();
  28.         Send_MatchRom(device);                                  //Eszköz kijelölése
  29.     OW_write_byte(READ_SCRATCHPAD);         //Read scratchpad
  30.     for(unsigned char i=0;i<9;i++){
  31.                 reg[i]=OW_read_byte();
  32.         }
  33.         if(crc_calc(&reg[0],8)==reg[8]){
  34.                 temp1=reg[0];
  35.                 temp2=reg[1];
  36.  
  37.             temp3 = temp2;
  38.             temp3 = temp3 << 8;
  39.             temp3 = temp3 | temp1;
  40.        
  41.                 result = (int) temp3 / 16;              //Calculation for DS18B20
  42.                 vWait_ms(200);
  43.             return(result);
  44.         }
  45.         else{
  46.             vWait_ms(200);
  47.                 return (-128);
  48.         }
  49. }

A lyuk azért kell, mert van egy ds_init függvényem, ami meghívása után kitörli az eepromot, majd egyesével kéri befelé az érzékelőket, és ezt szépen sorban elmenti az eepromba.
Na már most, ha nem akarok valamelyik helyre érzékelőt, pl. 13. helyre, akkor oda 0x00-t ír.
Ezt vizsgálja az első for ciklus.
(#) watt válasza Wudoou hozzászólására (») Aug 22, 2013 /
 
Vágom.
Úgy lehet, hogy a konvertálási parancsot nem címzed, hanem kiadod a vonalra SKI ROM [CCh] után, amit mindegyik ds venni fog és elkezd konvertálni. Kivárod míg elkészülnek (pl. vizsgálod az elkészültét egy ds-en(ezt már címezve)), vagy időzíted (750ms alatt kész.) Ezt mindhárom vonalra megteheted egymás után, majd sorban beolvasod az értékeket. Így kb. 1 sec alatt meglesz a 24 hőfokérték. Tehát a kiolvasási rutinodat úgy kell változtatni, hogy kiemeled a konverzió parancsot és külön adod ki, megelőzően a kiolvasásokat.
(#) Wudoou válasza watt hozzászólására (») Aug 22, 2013 /
 
Na ha jól értelmeztem, akkor nekem kellene 2 függvény, ha már az eredetiket is meg akarom tartani:
Az első valami ilyesmi:
  1. void start_allds1820(void){
  2.         OW_reset();                                                             //onewire reset
  3.         OW_write_byte(SKIP_ROM);
  4.         OW_write_byte(START_CONVERSION);
  5. vWait_ms(750);
  6. }

Ez elindítja a mérést az összes ds-sel.
A második mondjuk valami ilyesmi:
  1. float read_ds1820_after_getstartalldevices(unsigned char device){
  2.         //GIE=0;
  3.         unsigned char lyuk=0;
  4.         for(unsigned char xcv=0;xcv<8;xcv++){
  5.                 if(eeprom_read(device*0x08+xcv)==0x00){
  6.                         lyuk++;
  7.                 }
  8.         }
  9.         if(lyuk>7){
  10.                 return(-127);
  11.         }
  12.         unsigned char reg[10];
  13.         unsigned char busy=0, temp1, temp2;
  14.     int temp3;
  15.     float result;
  16.  
  17. //      OW_reset();                                                             //onewire reset/
  18. //      Send_MatchRom(device);                                  //Eszköz kijelölése
  19. //      OW_write_byte(START_CONVERSION);                //Konverzió elindítása
  20.  
  21.        
  22. //      if(OW_read_byte()==0xff)return (-128);  //A hőmérséklet konverzió ideje alatt a DS buszt 0-ba húzza
  23.  //   while(busy == 0){                         //Ha a busz nem 0, akkor az adott érzékelő nincs a buszon
  24.   //      busy = OW_read_byte();                               
  25. //      }
  26.  
  27.     OW_reset();
  28.         Send_MatchRom(device);                                  //Eszköz kijelölése
  29.     OW_write_byte(READ_SCRATCHPAD);         //Read scratchpad
  30.     for(unsigned char i=0;i<9;i++){
  31.                 reg[i]=OW_read_byte();
  32.         }
  33.         if(crc_calc(&reg[0],8)==reg[8]){
  34.                 temp1=reg[0];
  35.                 temp2=reg[1];
  36.  
  37.             temp3 = temp2;
  38.             temp3 = temp3 << 8;
  39.             temp3 = temp3 | temp1;
  40.        
  41.                 result = (int) temp3 / 16;              //Calculation for DS18B20
  42.                 vWait_ms(200);
  43.             return(result);
  44.         }
  45.         else{
  46.             vWait_ms(200);
  47.                 return (-128);
  48.         }
  49. }
Következő: »»   77 / 153
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem