Fórum témák

» Több friss téma
Fórum » PIC programozás mikroC fejlesztőkörnyezetben
Lapozás: OK   6 / 6
(#) glaci válasza glaci hozzászólására (») Dec 13, 2017 /
 
Sikerült pozitív float szám lcd-re kiírására programot írni. A negatív kiíratásán még gondolkodok. Ha valakit érdekel közzé teszem.
A hozzászólás módosítva: Dec 13, 2017
(#) DJozso válasza freddyke hozzászólására (») Dec 13, 2017 /
 
Nagyon köszönöm a részletes gondolat kifejtést. Így teljesen világos a dolog. Hétvégén, ha időm engedi(gyerek is úgy gondolja), neki ugrok ennek a kódnak, már csak azért is, hogy más irányba is fejlesszem magam. Köszönöm a segítséget.
(#) glaci hozzászólása Dec 16, 2017 /
 
Sziasztok!
Megint falba ütköztem.
DS18B20-al szeretnék hőmérsékletet mérni . Az MP, Pic 18f4520 a mikroc példaprogramját irtam a programba és nem ír ki semmit.
  1. void _homeres ()
  2. {
  3.    Ow_Reset(&PORTE, 2);
  4.    Ow_Write(&PORTE, 2, 0xCC);
  5.    Ow_Write(&PORTE, 2, 0x44);
  6.    Delay_us(120);
  7.    Ow_Write(&PORTE, 2, 0xCC);
  8.    Ow_Write(&PORTE, 2, 0xBE);
  9.    mertho=Ow_Read(&PORTE, 2);
  10.    mertho = (Ow_Read(&PORTE, 2) << 8) + mertho;
  11.  //   mertho=0b0000000010100010;
  12.    _hokiiras();
  13. }


ha a mérés után egy változóbol a mertho-bol adok be adatot azt szépen kiírja az lcd-re, de mérésből nem.
Ha a példában megadott 16f887-tel próbálom a hőmérést a példaprogram segítségével megoldni az sem megy.
(#) Bakman válasza glaci hozzászólására (») Dec 16, 2017 /
 
Felhúzó ellenállás van az adatlábon? Ha jól értelmezem a programrészletet, te csak az első két bájtot olvasod. A többi nem érdekel? Így nem lehet az adatot ellenőrizni (CRC).
(#) glaci válasza Bakman hozzászólására (») Dec 16, 2017 /
 
Szia!
Van felhúzó ellenállás 4.7K. Piilanatnyilag annyi érdekel, hogy egy ds18b20 hőmérsékletmérés adatát olvassa be a pic és jelenítse meg, de ez sajnos még nem megy.
(#) peze válasza glaci hozzászólására (») Dec 17, 2017 /
 
Szia! nálam ez így működik (16F887)


[sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit; // DS 1820
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

const unsigned short TEMP_RESOLUTION = 9;
char *text = "000.0000";
unsigned temp;
void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;

if (temp2write & 0x8000) {
text[0] = '-';
temp2write = ~temp2write + 1; }
temp_whole = temp2write >> RES_SHIFT ;
if (temp_whole/100)
text[0] = temp_whole/100 + 48;
else
text[0] = '0';

text[1] = (temp_whole/10)%10 + 48; // Extract tens digit
text[2] = temp_whole%10 + 48; // Extract ones digit

temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;

text[4] = temp_fraction/1000 + 48; // Extract thousands digit
text[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
text[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
text[7] = temp_fraction%10 + 48; // Extract ones digit
Lcd_Out(2, 5, text);
}

void main() {
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, " Temperature: ");
Lcd_Chr(2,13,223);
Lcd_Chr(2,14,'C');

do {
Ow_Reset(&PORTE, 2); // Onewire reset signal
Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTE, 2, 0x44); // Issue command CONVERT_T
Delay_us(120);
Ow_Reset(&PORTE, 2);
Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTE, 2, 0xBE); // Issue command READ_SCRATCHPAD
temp = Ow_Read(&PORTE, 2);
temp = (Ow_Read(&PORTE, 2) << 8) + temp;
Display_Temperature(temp);
Delay_ms(500);
} while (1);
}][/code]
(#) peze válasza peze hozzászólására (») Dec 17, 2017 /
 
Ja,és persze, a "One_Wire" könyvtár kell hozzá..
(#) glaci válasza peze hozzászólására (») Dec 17, 2017 /
 
Szia!
Nekem még mindíg nem.
  1. /* pr oba hőmérsékletméreés DS18b20 PIC18F887
  2. */
  3.  
  4.  
  5. // LCD module connections
  6. sbit LCD_RS at RD2_bit;
  7. sbit LCD_EN at RD3_bit;
  8. sbit LCD_D4 at RD4_bit;
  9. sbit LCD_D5 at RD5_bit;
  10. sbit LCD_D6 at RD6_bit;
  11. sbit LCD_D7 at RD7_bit;
  12.  
  13. sbit LCD_RS_Direction at TRISD2_bit;
  14. sbit LCD_EN_Direction at TRISD3_bit;
  15. sbit LCD_D4_Direction at TRISD4_bit;
  16. sbit LCD_D5_Direction at TRISD5_bit;
  17. sbit LCD_D6_Direction at TRISD6_bit;
  18. sbit LCD_D7_Direction at TRISD7_bit;
  19. // End LCD module connections
  20.  
  21. //  Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
  22. //  18S20: 9  (default setting; can be 9,10,11,or 12)
  23. //  18B20: 12
  24. const unsigned short TEMP_RESOLUTION = 12;
  25.  
  26. char *text = "000.0000";
  27. unsigned temp;
  28.  
  29. void Display_Temperature(unsigned int temp2write) {
  30.   const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  31.   char temp_whole;
  32.   unsigned int temp_fraction;
  33.  
  34.   // Check if temperature is negative
  35.   if (temp2write & 0x8000) {
  36.      text[0] = '-';
  37.      temp2write = ~temp2write + 1;
  38.      }
  39.  
  40.   // Extract temp_whole
  41.   temp_whole = temp2write >> RES_SHIFT ;
  42.  
  43.   // Convert temp_whole to characters
  44.   if (temp_whole/100)
  45.      text[0] = temp_whole/100  + 48;
  46.   else
  47.      text[0] = '0';
  48.  
  49.   text[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
  50.   text[2] =  temp_whole%10     + 48;             // Extract ones digit
  51.  
  52.   // Extract temp_fraction and convert it to unsigned int
  53.   temp_fraction  = temp2write << (4-RES_SHIFT);
  54.   temp_fraction &= 0x000F;
  55.   temp_fraction *= 625;
  56.  
  57.   // Convert temp_fraction to characters
  58.   text[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
  59.   text[5] = (temp_fraction/100)%10 + 48;         // Extract hundreds digit
  60.   text[6] = (temp_fraction/10)%10  + 48;         // Extract tens digit
  61.   text[7] =  temp_fraction%10      + 48;         // Extract ones digit
  62.  
  63.   // Print temperature on LCD
  64.   Lcd_Out(2, 5, text);
  65. }
  66.  
  67. void main() {
  68.   ANSEL  = 0;                                    // Configure AN pins as digital I/O
  69.   ANSELH = 0;
  70.   C1ON_bit = 0;                                  // Disable comparators
  71.   C2ON_bit = 0;
  72.   TRISB=0b00000100;
  73.   Lcd_Init();                                    // Initialize LCD
  74.   Lcd_Cmd(_LCD_CLEAR);                           // Clear LCD
  75.   Lcd_Cmd(_LCD_CURSOR_OFF);                      // Turn cursor off
  76.   Lcd_Out(1, 1, " Temperature:   ");
  77.   // Print degree character, 'C' for Centigrades
  78.   Lcd_Chr(2,13,223);                             // Different LCD displays have different char code for degree
  79.                                                  // If you see greek alpha letter try typing 178 instead of 223
  80.  
  81.   Lcd_Chr(2,14,'C');
  82.  
  83.   //--- Main loop
  84.   do {
  85.     //--- Perform temperature reading
  86.     Ow_Reset(&PORTB, 2);                         // Onewire reset signal
  87.     Ow_Write(&PORTB, 2, 0xCC);                   // Issue command SKIP_ROM
  88.     Ow_Write(&PORTB, 2, 0x44);                   // Issue command CONVERT_T
  89.     Delay_us(120);
  90.  
  91.     Ow_Reset(&PORTB, 2);
  92.     Ow_Write(&PORTB, 2, 0xCC);                   // Issue command SKIP_ROM
  93.     Ow_Write(&PORTB, 2, 0xBE);                   // Issue command READ_SCRATCHPAD
  94.  
  95.     temp =  Ow_Read(&PORTB, 2);
  96.     temp = (Ow_Read(&PORTB, 2) << 8) + temp;
  97.  
  98.     //--- Format and display result on Lcd
  99.   //  temp=0b0000000110010001;
  100.     Display_Temperature(temp);
  101.  
  102.     Delay_ms(500);
  103.   } while (1);
  104. }


Ha a Display_Temperature(temp); előtt temp-nek értéket adok azt kiírja, tehát az olvasással van a büge.
A hozzászólás módosítva: Dec 17, 2017
(#) Bakman válasza glaci hozzászólására (») Dec 17, 2017 /
 
A 89. sorban lévő Delay_us(120); nem kevés egy kicsit? Ha 12 bites felbontás van kiválasztva, akkor a konverzió az IC-ben eltarthat akár 750 ms ideig is.
(#) glaci válasza Bakman hozzászólására (») Dec 17, 2017 /
 
Szia!
Ez van a példaprogramban is. De javítottam 750ms-ra, de még mindíg semmi.
(#) Bakman válasza glaci hozzászólására (») Dec 17, 2017 /
 
Az LCD kijelző nem, de a OneWire protokoll nagyon is érzékeny az időzítésre. A kontroller konfigurációja jól van megadva mindenhol?
(#) peze válasza glaci hozzászólására (») Dec 17, 2017 /
 
Nálam ez a program tényleg működik, belső oszcillátor,8mhz
(#) glaci válasza Bakman hozzászólására (») Dec 17, 2017 /
 
Szia!
Ezek a beállítások. A szenzor jó mert máshol kipróbáltam.
(#) Elektro.on válasza glaci hozzászólására (») Dec 17, 2017 /
 
A DS18B20 ,hogy kap tápot?

Külön tápot adtál neki, vagy a "parazita" tápos megoldást használod?
(#) glaci válasza Elektro.on hozzászólására (») Dec 17, 2017 /
 
Szia!
A pic saját tápjáról kapja a tápot.
(#) glaci hozzászólása Dec 21, 2017 /
 
Sziasztok!
Még mindíg küzdök az onewire DS18B20 hőméréssel. A az onewirw help a mérés idejére letiltatja a megszakításokat. Ha tiltom a megszakításokat nem ír ki adatot. Ha nem tiltom le a megszakítást véletlenszerűen írja ki a mért hőt. Tehát nincs meghatározható logika a kiírások között.
(#) vaszily hozzászólása Dec 22, 2017 /
 
Sziasztok,

Most kezdtem el mikroc-vel illetve a c programozással foglalkozni. Eddig asm-ben programoztam de már váltani akarok Az asm jó volt arra, hogy megismerjem a PIC működését, viszont komolyabb programokhoz már jobb lenne a C.

Mi a különbség a kettő között:
  1. unsigned char temp;
  2. unsigned char *temp[8];

A végén a 8-as az a hosszúságát jelentené a változónak? Illetve előtte a * az mi?
(#) gyurma888 hozzászólása Feb 8, 2018 /
 
Sziasztok!
MikroC-ben szeretnék programozni PIC18F2455-t (korábban programoztam már 18F4550-t). Rögtön az elején problémám akadt, ugyanis a pic csak belső órajelről működik. Ha a HS oscillator van kiválasztva, a PICen lévő program nem indul el. A panelon egy 20Mhz-s kristály van, 15 pF-os kondenzátorokkal (egyik-egyik lábuk a kristályon, másik GND-n, ahogy az adatlapon is szerepel). Sima 20Mhz-es órajellel szeretném meghajtani a mikrokontrollert.
Mi lehet a probléma? Hardveresen vagy szoftveresen kéne megoldanom?
Mellékelve küldöm a config biteket, mert szerintem ott lehet a gond.
Segítségeteket előre is köszönöm!
(Elnézést, hogy alapkérdéssel jövök, de kipróbáltam már mindent, amit én tudok.)
(#) Hp41C válasza gyurma888 hozzászólására (») Feb 8, 2018 / 1
 
Ha az órajel a 96MHz-es PLL kimenetéről megy, használj HSPLL beállítást.
(#) gyurma888 válasza Hp41C hozzászólására (») Feb 9, 2018 /
 
Sajnos úgy sem indul el a program.
Rossz lehet a panelom?
A hozzászólás módosítva: Feb 9, 2018
(#) Hp41C válasza gyurma888 hozzászólására (») Feb 9, 2018 / 1
 
Tegyél fel kapcsolási rajzot és fényképet!
(#) gyurma888 válasza Hp41C hozzászólására (») Feb 11, 2018 /
 
Szia!
Nagyon köszönöm a gyors válaszaid, közben kiderült, hogy a panelon egy szakadás volt.
További szép napot!
Következő: »»   6 / 6
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu