Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   127 / 153
(#) usane válasza killbill hozzászólására (») Márc 30, 2016 /
 
CCS C 2015 október:
Idézet:

unsigned - Data is always positive.
This is the default data type if not
specified.”
(#) killbill válasza usane hozzászólására (») Márc 30, 2016 / 2
 
Nincs ezzel baj, csak ez nem C fordító, hanem valami más, ami hasonlít a C nyelvre... Elég sok ponton szegi meg a szabványt.
(#) cross51 hozzászólása Márc 31, 2016 /
 
Sziasztok!

Hivatkozni szeretnék PORT lábakra valahogy így PORTxbits.Rxy, de inkább mutatok kódot(ami persze nem jó csak ilyesmi lenne az elképzelésem):
  1. void initSoftSerLcd(int pin) {
  2.         /*
  3.          *
  4.          */
  5. }
  6.  
  7. int main() {
  8.         initSoftSerLcd(PORTAbits.RA0);
  9. }


Nem int kell a fv.-hez csak, hogy ne legyen üres.
A stackoverflow-on találtam egy hasonlót, de ez nem annyira tetszik:
  1. void WaitForHigh( volatile unsigned int * port, pin_mask ) {
  2.     while( !(*port & pin_mask) );           // Stays here until the pin goes hi.
  3. }
  4.  
  5. int main()
  6. {
  7.     ...
  8.     WaitForHigh( &PORTA, _PORTA_RA3_MASK );         // waits for pin RA3 to go hi.
  9.     ...
  10.     return 0;
  11. }


Létezik lehetőség C/C++-ban ilyen hivatkozást létrehozni és a gyári névvel szeretném használni nem enum-al vagy #define-vel.?
(#) foxi63 válasza cross51 hozzászólására (») Márc 31, 2016 /
 
Szia!
Az adott PIC header fájlában minden dekralálva van, légyszives csatoljad.
pl .: #include "p18f2520.h"
(#) cross51 válasza foxi63 hozzászólására (») Márc 31, 2016 /
 
Igazság szerint nem adott PIC-re készülne, régebben csináltam egy soros lcd vezérlőt és ahhoz szeretném használni, hogy a kezelő pic lcd libary-ben megadott inicializáló függvényben mikor meghívom csak beírom, hogy LATx/PORTxbitsXY és azon küldené az adatokat (soft uart).

Most épp PIC32-hez készülne, de úgy szeretném megcsinálni, hogy ha nem is minden családhoz, de PIC32-hez csak átmásolom a forrásfájlokat és kész.

  1. void setpin (valtype pin) {
  2.         pin = 1;
  3. }
  4.  
  5. int main() {
  6.         ...
  7.         setpin(PORTxbits.Rxy);
  8.         ...
  9. }


Ez más célt szolgál és semmi értelme nem lenne, de érthetőbb, hogy hogyan akarom megcsinálni, de az is lehet, hogy ezt már nem lehet.
A hozzászólás módosítva: Márc 31, 2016
(#) Wezuv válasza cross51 hozzászólására (») Ápr 1, 2016 /
 
Nem egyszerűbb egy headerben megadni a funkcióláb(pl. LCD_E) neve mellett, hogy melyik porthoz tartozik, majd csak a h fájlt kicserélni?
(#) cross51 válasza Wezuv hozzászólására (») Ápr 2, 2016 /
 
De egyszerübb . De itt a "szépségre", lenne a lényeg, de elviekben C/C++-ban nem lehet bit struktúra elemére hivatkozni, úgyhogy letettem róla.
Maga az alapötlet a számomra kicsit elitélt Arduino-tól származik, de ott csak 3-4 panelra kell működjön.
(#) elactrofan válasza Hp41C hozzászólására (») Ápr 28, 2016 /
 
Nekem is pont erre lenne szükségem. Esetleg szájbarágósabban is megtudnád mondani?
Pl példával?
(#) Hp41C válasza elactrofan hozzászólására (») Ápr 28, 2016 /
 
  1. float f;
  2.         int e,t,c;
  3.         char s;
  4.  
  5.         f = 0.00314159265;
  6.         c=0;
  7.         s='+';
  8.        
  9.         if (f > 10.0)
  10.         {
  11.                 while (f > 10.0)
  12.                 {
  13.                         f /=10.0;
  14.                         c++;
  15.                 }
  16.         }
  17.         else
  18.         {
  19.                 while (f < 1.0)
  20.                 {
  21.                         f *=10.0;
  22.                         c--;
  23.                 }
  24.         }
  25.         if (c < 0)
  26.         {
  27.                 s='-';
  28.                 c = -c;
  29.         }
  30.         e = (int)floor(f);
  31.  
  32.         f = f - (float)e;
  33.         f *= 10000.0;
  34.         t = (int)floor(f);
  35.  
  36.         printf("%d.%dE%c%d\n",e,t,s,c);
A hozzászólás módosítva: Ápr 28, 2016
(#) elactrofan válasza Hp41C hozzászólására (») Ápr 28, 2016 /
 
Köszi
(#) killbill válasza Hp41C hozzászólására (») Ápr 28, 2016 /
 
>= 10.0 Mindkét esetben. Vagy nem?
(#) Hp41C válasza killbill hozzászólására (») Ápr 28, 2016 /
 
Meglehet... Jobb lett volna, ha elactrofan jön rá...
(#) killbill válasza Hp41C hozzászólására (») Ápr 28, 2016 /
 
Idézet:
„Jobb lett volna, ha elactrofan jön rá...”
Ezt lehet, hogy nem értem.
(#) Topika hozzászólása Máj 8, 2016 /
 
Sziasztok!
Az MPLAB C18-as fordítóját használom,PIC18F4550 procival. Az adatmemória kezelésében akadt egy kis problémám.
Egyszerűen nem tudom a fordítót rávenni, hogy ne csak az access területet használja. Sok adatot kell kezelnem és nem férek bele. A segítséget előre is köszönöm!
(#) Hp41C válasza Topika hozzászólására (») Máj 8, 2016 /
 
  1. #pragma udata access <név>
  2. // Access ram -beli változók
  3. #pragma udata <név>
  4. //A többi, de érdemesebb több részre osztani

C18 user's guide:
Idézet:
„Locating Data
Data can be placed in either data or program memory with the MPLAB C18 compiler. Data that is placed in on-chip program memory can be read but not written without additional user-supplied code. Data placed in external program memory can generally be either read or written without additional user-supplied code.

For example, the following declares a section for statically allocated uninitialized data (udata) at absolute address 0x120:

#pragma udata my_new_data_section=0x120

The rom keyword tells the compiler that a variable should be placed in program memory. The compiler will allocate this variable into the current romdata type section. For example:

#pragma romdata const_table
const rom char my_const_array[10] = {0, 1, 2, 3, 4, 5,
6, 7, 8, 9};
/* Resume allocation of romdata into the default section */
#pragma romdata
The linker will enforce that romdata sections be placed in program memory regions and that udata and idata sections be placed in data memory regions however, a data section can also be located in a specified memory region. The SECTION directive of the linker script is used to assign a section to a specific memory region. The following assigns udata section my_data to memory region gpr1:

SECTION NAME=my_data RAM=gpr1”
A hozzászólás módosítva: Máj 8, 2016
(#) Topika válasza Hp41C hozzászólására (») Máj 9, 2016 /
 
Köszönöm a segítséget! Sikerült megoldani a problémát.
(#) HA3GX hozzászólása Máj 18, 2016 /
 
Sziasztok!

Egy készülő projekt miatt egy egyszerű kódot írok egy PIC-re. A kiválasztott mikrokontoller 16F887-es. Elég kezdő vagyok, de folyamatosan olvasgatok.

Készítés alatt van egy fa, és gáztüzelésű kazán, amire egy napkollektor rásegít. A fizikai kialakítása másodlagos, így csak a PIC-es részről írok.


A kiválasztott hőmérsékletszenzor: LM135

Úgy gondoltam a kalibrálást, hogy egy edénybe vizet teszek, alágyújtok, majd egy hitelesített hőmérővel figyelve a hőfokot felírom, hogy például 50C°-on mennyi a feszültség, majd 60-on, ill. 70-en.

Ezeket "IF"-be helyezem.

  1. int ADC_Result; //tároló az ADC-nek
  2.  
  3. void main() {
  4. TRISB = 0b11111000;     //0,1,2-es láb kimenet, a többi bemenet
  5. TRISA = 0b00000000;     //minden láb bemenet
  6.  
  7. Sound_Init(&PORTB,2);   //Hangszóró helyének megadása, melyik porton, hányas láb
  8.  
  9. PORTB = 0b00000011;      //önteszt, 3mp-ig LED bekapcsol, relé behúz
  10. delay_ms(3000);          //késleltetés
  11. PORTB = 0b00000001;     //alapállapot
  12.  
  13. //C1ON_Bit = 0; //tápfesztől
  14. //C2ON_Bit = 0; //tápfeszig
  15.  
  16. while(1)
  17. {
  18. ADC_Result = ADC_Read(0);             //átalakítja egy 10 bites értékké, 0-1023
  19.  
  20. if ( ADC_Result >= érték0-1023 )
  21.     {
  22.      PORTB.F2 = 1; }
  23.      else
  24.     {
  25.      PORTB.F2 = 0; }
  26.      }
  27. ...


Régebben írták, hogy az 5V-ot érdemes átváltani mV-ba a pontosabb értékek miatt. Ezt valahogy nem értem.

Innentől már matek. Vagyis ha előzőleg a lábosba az 50C° mondjuk 3.17V-ot jelent (példa), akkor a 10 bites számunk 649.216 lesz. Már csak az a kérdés, hogy az int képes -e lebegőpontos számokkal dolgozni...?

Jó a gondolatmenetem, vagy valamit nagyon elszámoltam?
A hozzászólás módosítva: Máj 18, 2016
(#) HA3GX válasza HA3GX hozzászólására (») Máj 18, 2016 /
 
Jól gondoltam, az int egész számoknak való. Ellenben a float, az már 6 tizedesjegyig.
(#) Lamprologus válasza HA3GX hozzászólására (») Máj 19, 2016 /
 
Miért nem használsz inkább DS18B20-at? pl ezt..
(#) dokidoki válasza HA3GX hozzászólására (») Máj 19, 2016 /
 
Azért javasolták a mV átváltást, mert az egy 1000 -el való szorzást testesít meg, és megment a lebegőpontos számításoktól egy egyszerű szorzás. Hozzáteszem erőst laikus vagyok a témában.
(#) don_peter válasza HA3GX hozzászólására (») Máj 19, 2016 /
 
Igen az ADC mérésénél az 5v referenciát mV-ba ad meg, a float-nál nagyon kell figyelni a típusokra.
Nincs véletlen annak a hőszenzornak egy táblázata, hogy milyen hőmérsékleteknél milyen adatot kell mérnie?
Ez a hőszenzor már megvan vagy még csak most keresed?
Hova fogod elhelyezni?
Figyelembe kell venni a hőtartományt is amibe mér.

Közben gyorsan megnéztem a tartományt: -55°C to +150°C
Amúgy a vizes teszt jó, ha nincs kész hőtábla.
A legpontosabb amit meg tudsz mérni az a 100fok, mert ahhoz csak forralnod kell
De ha van valami spec hitelesített hőmérőd, akkor azzal 10fokos lépésenként tudsz táblát készíteni közben figyelni, hogy a mért adat mennyire lineáris.
Mert ha nem nagyon ugrál a kapott adat, akkor a köztes mondjuk 5fokonkénti adat megkaphatod, ha mindegyik vett adatot felezed.
Ezt érdemes egy táblázatba rendezni és onnan kiszedni egy egyszerű >= vagy <= feltétellel.
(#) Hp41C válasza HA3GX hozzászólására (») Máj 19, 2016 /
 
-273C = 0K -- 0V
+125C = 398K -- 3.890V ---- Maximális működési hőmérséklet az adatlap szerint.
Számoljunk 4.000V -tal és az 5.000V referenciával:
Ekkor a +125C 4/5*1024 = 819.2 Az A/D -ből kiolvasott érték 819 lesz.
Lebegőpontos számokat használva 0,4884004884 -val kellene osztani, hogy 400K -t kapjunk.
Ha 32 (vagy 24) bites egész változóban helyezed el a kiolvasott érték 488 szorosát, a Kelvin -ben mért hőmérsékelt ezerszeresét kapod. 819*488 = 399672. Ha kiíratod, elég a tizedesvesssző helyét figyelembe venni. Ha Celsius fokban kellene, akkor 273 -at le kell vonni.
(#) don_peter válasza HA3GX hozzászólására (») Máj 19, 2016 /
 
Amúgy még az is eszembe jutott, hogy neked tökéletesen elég lenne egy termosztát is.
ds1621
Ez I2C-vel kommunikál és be tudod állítani hogy mikor kapcsoljon be illetve ki.
A hiszterézise pedig mindig a két beállított érték közt lesz, szóval még csak vacakolni sem kell programmal, mert hardveresen elitezi a kapcsolgatást.
Nemrég foglalkoztam vele és írtam meg rá a programot, elég jól működik.
(#) Kovidivi válasza don_peter hozzászólására (») Máj 19, 2016 /
 
2600Ft-ból 5-10db komplett áramkört össze lehet dobni erre a feladatra...
(#) Kovidivi válasza don_peter hozzászólására (») Máj 19, 2016 /
 
" Ezt érdemes egy táblázatba rendezni és onnan kiszedni egy egyszerű >= vagy <= feltétellel. " - ez elég sok feltételt jelentene, lehetne órákig gépelni.
Lineáris a kapott feszültség, és adatlapban megtalálható a pontos átszámítás is, Hp41C szépen leírta. Kalibrálni sem kell, mert egy megadott tűrésen belül pontos ez a szenzor is.
Egyébként meg a felforralt víz sem 100fokC-os, légnyomástól függően változik több fokot fel vagy le a forráspont! Ehhez hozzájön a hőmérőd hibája is.
(#) Hp41C válasza Kovidivi hozzászólására (») Máj 19, 2016 / 1
 
Idézet:
„Egyébként meg a felforralt víz sem 100fokC-os, légnyomástól függően változik több fokot fel vagy le a forráspont!”

Meg a benne oldott anyagoktól. Még az ioncserélt vízben is van oldott anyag.
(#) HA3GX hozzászólása Máj 19, 2016 /
 
Köszönöm mindenki hozzászólását, este nyugalomba kitalálom, hogy végül hogyan oldom meg. Kijelzés nem lesz, felesleges.
A hozzászólás módosítva: Máj 19, 2016
(#) Elektro.on hozzászólása Máj 30, 2016 /
 
Sziasztok!

Találtam egy hasznos linket kezdőknek MikroC -hez.
Ezt most megosztanám,hátha valakinek...
Led villogtatástól PWM -en át LCD kezelésig sok minden.

Bővebben: Link
(#) brigit86 hozzászólása Jún 2, 2016 /
 
Sziasztok!

Találkozott már valaki ilyen problával?
A forráskód:
  1. char buf[64];
  2. sprintf(buf, "\r\nez a szam:%d, %d\r\n", 54, 33);
  3. uart2_tx_str(buf);


A soros porton az alábbi szöveg olvasható:
ez a szam:114, 10496

Használt pic: 18f26k22, XC8 1.37
(#) benjami válasza brigit86 hozzászólására (») Jún 2, 2016 /
 
Csak tipp: lehet, hogy a konstans számokat ROM területre teszi, de a kód meg RAM-ból olvas. Változóba tett számokkal jól működik amúgy?
Következő: »»   127 / 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