Fórum témák

» Több friss téma
Fórum » PIC programozás mikroC fejlesztőkörnyezetben
Lapozás: OK   6 / 10
(#) 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!
(#) scooby_ hozzászólása Márc 11, 2018 /
 
Sziasztok!
Még csak most ismerkedem a PIC-es világgal, így igencsak kezdőnek vallom magam. Kezdőként a mikroC fejlesztőkörnyezetre esett a választásom, ebben írtam néhány egyszerű, de legalább működő programot.
Most, egy erősítőhöz írtam egy vezérlő programot. 4 nyomógomb: Ki/be kapcsolás, MUTE, MONO/STEREO, illetve bemenetválasztó 4 csatornára.
-Értelemszerűen a KI/BE kapcsoló egy relét kapcsol, viszont az összes többi funkció is csak akkor működik, ha ha a reléhez tartozó port aktív, tehát nem nulla(a programban így szerepel leírva).
-A MONO/STEREO gombnyomásra kapcsol egy relét, újabb gombnyomásra kikapcsolja azt.
-A bemenetválasztó ugyan ez, csak lépteti a portokat, a végén pedig visszaáll az elejére, és kezdődik ellőről.
-A MUTE szintén egy relét kapcsol ki és be, úgy mint a MONO. Viszont a program végére ehhez még beszúrtam egy IF-et, aminek a feltétele az, hogy a H változó kisebb legyen mint 1. Mikor ez a feltétel igaz, belép az IF-be, a H-t rögtön 2-re változtatja, hogy az már többször ne lehessen igaz a program futása során. Ezzel egyidejűleg bekapcsolja a MUTE relét, valamint a MUTE LED-jét fél másodpercenként villogtatja. Ez for ciklusba van rendezve, így 30x lejátszva, fél percig csinálja ezt, majd kiolvassa az EEPROM-ból a MUTE legutolsó állapotát(ha elmegy a villany, vagy kikapcsolom a készüléket). Kikapcsolás után a H változó nullázódik.
-Ez így működik is, az egyetlen bajom vele az, hogy amíg ez a némító ciklus tart, addig semelyik gomb nem reagál. (Értelemszerű, mert épp egy ciklussal van elfoglalva.) Azt kéne megoldani, hogy amíg a MUTE ciklus tart, addig lehessen ugyan úgy bemenetet választani, ki/be kapcsolni a készüléket, illetve MONO/STEREO-ba kapcsolni. A MUTE gombot ilyenkor értelemszerűen nem kell figyelni.
Olvastam itt TIMER0-ról meg INTERUPT-ról, próbáltam utána nézni, találtam is róla sok-sok leírást, de kimondottan erre a fejlesztőkörnyezetre alig van valami. Ha lenne legalább egy hasonló programkód, amivel lehet játszani (kísérletezni, átírkálni), látnám hogyan működik a gyakorlatban, megérteném a működését, és a későbbiekben is tudnám alkalmazni. Jelen esetben PIC16F628A-t használtam, belső, 4MHz-es oszcillátorral. A programot alul csatoltam.
(#) Lamprologus válasza scooby_ hozzászólására (») Márc 12, 2018 /
 
Mikro C példaprogramok között akadtam erre, hátha segít:
  1. /*
  2.  * Project name:
  3.      Timer1_Interrupt (Using Timer1 to obtain interrupts)
  4.  * Copyright:
  5.      (c) Mikroelektronika, 2008.
  6.  * Revision History:
  7.      20081218:
  8.        - initial release;
  9.  * Description:
  10.      This code demonstrates how to use Timer1 and it's interrupt.
  11.      Program toggles LEDs on PORTB.
  12.  * Test configuration:
  13.      MCU:             PIC18F87J60
  14.                       http://ww1.microchip.com/downloads/en/DeviceDoc/39762d.pdf
  15.      Dev.Board:       EasyPIC PRO v7
  16.                       http://www.mikroe.com/easypic-pro/
  17.      Oscillator:      HS, 25.0000 MHz
  18.      Ext. Modules:    -
  19.      SW:              mikroC PRO for PIC
  20.                       http://www.mikroe.com/mikroc/pic/
  21.  * NOTES:
  22.      - Turn on LEDs on PORTB SW10.2. (board specific)
  23. */
  24.  
  25. unsigned cnt;
  26.  
  27. void interrupt() {
  28.   if (TMR1IF_bit) {
  29.     cnt++;             // Increment value of cnt on every interrupt
  30.     TMR1IF_bit = 0;    // clear TMR1IF
  31.   }
  32. }
  33.  
  34. void main() {
  35.  
  36.   ADCON1 |= 0x0F;      // Configure AN pins as digital
  37.   CMCON  |= 7;         // Disable comparators
  38.  
  39.   cnt = 0;             // Initialize cnt
  40.   TRISB = 0;           // PORTB is output
  41.   PORTB = 0xFF;        // Initialize PORTB
  42.  
  43.   T1CON = 1;           // Timer1 settings
  44.   INTCON = 0xC0;       // Set GIE, PEIE
  45.   TMR1IE_bit = 1;      // Enable TMR1 interrupt
  46.  
  47.   do {
  48.     if (cnt >= 128) {
  49.       PORTB = ~PORTB;  // Toggle PORTB LEDs
  50.       cnt = 0;         // Reset cnt
  51.     }
  52.   } while(1);          // endless loop
  53. }


Lényege a dolognak, hogy a delay függvény felejtős, mert megakasztja a programot, helyette a timer 1 interruptban növel egy számlálót, ezt a számlálót vizsgálja a főciklusban, és ha elér egy értéket akkor végrehajt valamit ...
(#) scooby_ válasza Lamprologus hozzászólására (») Márc 13, 2018 /
 
Szia! Köszönöm!
Áhá! Szóval akkor nekem ezt elvileg a Delay helyett kellene használnom? És akkor ez egy olyan számláló, ami lényegében fut a háttérben, és nem akasztja meg a programot ha benne van?
Ez eddig jónak tűnik, viszont a FOR ciklus az megfogja szakítani a programot, ha belefut?
(#) scooby_ válasza scooby_ hozzászólására (») Márc 13, 2018 /
 
Íme, egy kódrészlet, amire alkalmazni kéne, de eddig nem sikerült.
  1. for(i=0;i<15;i=i+1){
  2.  LCD_OUT(1,1,"HEATING  TUBES !");
  3.  Delay_ms(1000);
  4.  LCD_CMD(_LCD_CLEAR);
  5.  Delay_ms(1000);


Ez egy újabb vezérlő, ebben már LCD is van. 1 másodpercenként villogtatja a "HEATiNG TUBES !" feliratot. Mindezt 15x teszi meg. (15x2sec = 30sec)
A hozzászólás módosítva: Márc 13, 2018
(#) Lamprologus válasza scooby_ hozzászólására (») Márc 13, 2018 /
 
Bocs, MikroC-t nem használok, csak az elvet tudom mondani.
A számlálót be lehet állítani, hogy milyen sűrűn okozzon megszakítást, amikor ez bekövetkezik akkor megszakítja a fő program futását, de csak annyi időre még növeli a számláló értékét ( az előző példánál maradva). Te a főprogramodban figyeled ennek a változónak az értékét, ha eléri a megadott értéket bekapcsolod a LED-et, számlálót törlöd, és mondjuk egy másik változóban letárolod, hogy már egyszer bekapcsoltad. Amikor megint eléri a számláló a megadott értéket akkor ha be van kapcsolva a LED kikapcsolod! ... Így nem kell for ciklus, csak az a számlálókat figyelni.
(#) scooby_ válasza Lamprologus hozzászólására (») Márc 14, 2018 /
 
Köszönöm a segítséget, sikerült -véres verejtékkel- megérteni nagyjából, beállítani a Timer0-t és alkalmazni. Eddig sikeres a projekt. Most annyi az észrevételem, hogy miután lefutott ez a program ami a LED-et villogtatja, a nyomógombjaim nehézkesen reagálnak. Gondolom ez meg azért van így, mert folyton generálja a megszakítást. Gondolom ezt is lehet orvosolni az osztó beállítással.
(#) Lamprologus válasza scooby_ hozzászólására (») Márc 14, 2018 /
 
Szerintem a timer megszakításának lefutását nem veszed észre ...
Látatlanba inkább arra gondolok hogy prellezik a nyomógomb, ezért tűnik úgy hogy nem reagál ... feltételezve hogy a programban valami olyasmi van, hogy megnyomom a gombot bekapcsol valamit, még egyszer megnyomom kikapcsolja. Ha ez a helyzet lehet softveres, vagy hardveres pergésmentesítést haszálni, utóbbi egy 100nF kondi párhuzamosan a nyomógombbal, előbbi hogy figyeled mennyi ideig van lenyomva a gomb, és csak pl a 0.1s nál hosszabb lenyomás a lenyomás! pl úgy hogy a timert beállítod hogy 10ms-ként okozzon megszakítást, ott növeled egy változó értékét, ha meg van nyomva a gomb, ha nincs akkor nullázod ... ha elér egy bizonyos értéket akkor hajtja végre amit kell....
(#) scooby_ válasza Lamprologus hozzászólására (») Márc 15, 2018 /
 
Pergésmentesítés az van, szoftveres, a következőképp:
  1. if(nyg1 !=1 && gomb1!=1) {
  2.  gomb1=1;
  3.  POWER++;
  4.  }
  5.  if(nyg1 !=0 && gomb1!=0) {
  6.  gomb1=0;
  7.  }


nyg1 maga a nyomógomb, gomb1 pedig egy BIT változó 0 kezdőértékkel felvéve.
Következő: »»   6 / 10
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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