Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   20 / 153
(#) vicsys válasza edison14 hozzászólására (») Jún 24, 2010 /
 
Az nem, hogy a PK2 saját progiját használod az auto import hex-el? Vagy debuggolni is szeretnél? Ha igen, marad az MPlab.
(#) trudnai válasza Bell hozzászólására (») Jún 24, 2010 /
 
Idézet:
„Tehát a main-ból az abc globális változót (objektumot, pointert?) adjuk át a morse_rom függvénynek.”


Igen. A tomb C nyelven (majdnem) kompatibilis a pointerrel. Tehat nem kell annak is a cimet venni ('&abc' volt a valtozatodban, eleg az 'abc', es az a karakter lanc elejet fogja megcimezni).

Idézet:
„Ott karakter tipusú rom pointerként értelmezzük, ami más modulból nem látszik (static).”


Nem, a 'static' kulcsszo mast jelent fuggvenyekre alkalmazva mint valtozokra (egyike a C 'szepsegenek'). Valtozoknal a static annyit csinal, hogy nem a lokalis, azaz 'auto' tarolasi osztalyba kerul, magyaran nem a stack-en lesz elhelyezve. Ez a C18 eseten azert jo, mert a stack eleg kacifantosan van megoldva -- azaz a kod sokkal nagyobb es lassabb ha lokalis valtozot hasznalsz... Cserebe azonban a fuggveny nem 'reentrans', azaz nem hivhatod meg egynel tobbszor. Pl. nem hivhatod meg interruptbol vagy nem hivhatja meg onmagat (nem lehet 'rekurziv').

Idézet:
„Az overlay char c pedig azt jeleni, hogy felülíródik a korábbi érték. Az overlay nélkül ez nem így lenne?”


Az overlay az nem ANSI C dolog, C18 specifikus. Majdnem ugyanaz, mint a 'static', kiveve, hogy van egy nagy elonye: A fordito kiszamolja, hogy a mely fuggvenyek hivodnak melyekbol, es igy ugyanazt a RAM teruletet ki tudja osztani mas fuggvenyeknek is. Ezzel rengeteg RAM helyet lehet sporoltatni megorizve a 'static' valtozokhoz tartozo kodreszletek gyorsasagat es kicsi kod meretet. De abban igazad van, hogy emiatt a valtozo erteke felul irodhat ha a fuggvenybol vissza tertel -- de amig benne vagy addig nem!

Idézet:
„Mivel a pointer char tipusú, akkor ez csak max 256 karakterig használható?”


A pointer pointer tipusu. Alapertelmezesben 'far' pointer, ha nagyon kell a hely takarekossag, akkor 'near' tipusura lehet cserelni. A pointer azonban char-t cimez meg... de ettol meg pointer marad...

Pointert ugy kell elkepzelni, mint egy mutato palcat. A palca mindig palca marad, megis mindig mas es mas dologra kepes mutatni. Ami miatt meg kell neki mondani, hogy char-ra fog mutatni, mert mikor azt mondod 'pointer++', tehat noveled az erteket, akkor ebbol fogja tudni, hogy sizeof(char)-nyival kell novelnie a pointer erteket. Magyaran a 'pointer aritmetikahoz' kell a pointernek tudnia, hogy mire mutat. De letezik 'void' pointer is, ami egy sima fapalca, es az mutathat egyszer almara maskor hordora, azonban az aritmetika nem tudja majd almanyit vagy hordonyit lepkedjen
(#) edison14 válasza vicsys hozzászólására (») Jún 24, 2010 /
 
Mindenképpen szeretném használni a DEBUG funkciót úgyhogy nekiállok és áttanulmányozok egy doksit az MPLAB-ról. Valamennyi ismeretem már van benne de az még édes kevés. remélem menni fog de akkor sem aggódom ha nem mert itt mindig van segítség.
(#) Bell válasza trudnai hozzászólására (») Jún 24, 2010 /
 
Nagyon köszönöm a részletes magyarázatot és a helyreigazítást!
A struktúrákról szeretnék többet tudni, mint ami a MC C18 leírásaiban található. Esetleg tudsz ajánlani valamilyen részletes irodalmat, vagy bármilyen forrást lehetőleg magyarul? (Angolban elég lassan haladok.)
(#) potyo válasza Bell hozzászólására (») Jún 24, 2010 /
 
(#) icserny válasza edison14 hozzászólására (») Jún 24, 2010 /
 
Idézet:
„nekiállok és áttanulmányozok egy doksit az MPLAB-ról”

Varga László: Az MPLAB leírása (ha első kattintásra nem jön le, próbáld újra!)
(#) icserny válasza Bell hozzászólására (») Jún 24, 2010 /
 
Idézet:
„Esetleg tudsz ajánlani valamilyen részletes irodalmat, vagy bármilyen forrást lehetőleg magyarul?”

BRIAN W. KERNIGHAN – DENNIS M. RITCHIE: A C programozási nyelv
(#) edison14 válasza icserny hozzászólására (») Jún 25, 2010 /
 
Köszönöm a dokumentációt. Ebből már valami lesz.
(#) Bell válasza icserny hozzászólására (») Jún 25, 2010 /
 
potyo, icsernyi köszönöm!
(#) Bell hozzászólása Jún 26, 2010 /
 
Szeretném az usart beállításait ROM-ban, RAM-ban és EEPROM-ban, struktúratömbökben létrehozni és onnan adott feltétel alapján kiválasztani a megfelelő értéket.
A következő programmal több gondom is van:
1. Nem lép ki a ciklusból mikor megtalálja a szükséges értéket.
2. Nem tudom, hogyan lehetne ugyanezt mutatókkal megcsinálni. A ROM struktúra ugyanis helyből pointernek mutatkozik az MPLAB watch ablakában és csődöt mondtak az eddigi próbálkozások.
3. Csak észrevétel, hogy ha a tipusdefiniciónál nem adok meg méretet a baud char-nak, teljesen hamis adatokat kapok. Példákban általában nem látok konkrét értéket.
  1. #include <p18F1320.h>
  2. #pragma config OSC = INTIO2, WDT = OFF, LVP = OFF, PWRT=ON, MCLRE =OFF
  3.  
  4.         typedef struct  {
  5.                 unsigned char baud[6];
  6.                 unsigned int baudcon;
  7.                 unsigned SYNC:1;
  8.                 unsigned BRGH:1;
  9.                 unsigned BRG16:1;
  10.                 unsigned semmi:5;
  11.                 } t_usart_cfg;
  12. //ROM
  13. #pragma romdata akarmi_rom=0x1200
  14. rom t_usart_cfg cfg_ROM[]={"9k6",51,0,0,1};
  15. rom t_usart_cfg usart_18f1320_8MHz[]={
  16.         { "0k3" ,1665,0,0,1},
  17.         { "1k2" ,415,0,0,1},
  18.         { "2k4" ,207,0,0,1},
  19.         { "9k6" ,51,0,0,1},
  20.         { "19k2" ,25,0,0,1}};
  21.  
  22. #pragma romdata
  23.  
  24. //EEPROM
  25. #pragma romdata akarmi_ee=0xF00010
  26. t_usart_cfg cfg_EE[]={"9k6",51,0,0,1};
  27.  
  28. #pragma romdata
  29.  
  30. //RAM
  31. t_usart_cfg cfg_RAM[]={"9k6",51,0,0,1};
  32.  
  33. void main(void){
  34.         unsigned unsigned int a,b,c,i;
  35.         unsigned char baud[6]="2k4";
  36.  
  37.          t_usart_cfg cfg_rom=usart_18f1320_8MHz[0];
  38.          t_usart_cfg cfg_ram=cfg_RAM[0];
  39.          t_usart_cfg cfg_ee=cfg_EE[0];
  40.          t_usart_cfg us_cfg;
  41.  
  42.          i=0;
  43.          while (i<5){
  44.          us_cfg=usart_18f1320_8MHz[i++];
  45.          if( baud == ( us_cfg->baud ) ) {break;}
  46.          }
  47.          if(i<5){
  48.          us_cfg=usart_18f1320_8MHz[i - 1];
  49.                 }
  50.                 else {us_cfg=usart_18f1320_8MHz[3];}
  51.                
  52.         while(1){ }
  53. }

Köszönettel fogadok bármilyen észrevételt, kritikát.
(#) Bell válasza Bell hozzászólására (») Jún 27, 2010 /
 
ad 1, persze hogy nem lép ki, mert tömböket így nem lehet (/ illik) összehasonlítani ...
(#) Bell válasza Bell hozzászólására (») Jún 27, 2010 /
 
ad 2, C18 fordítónál a romban lévő struktúrára pedig egyebek közt így hivatkozhatunk:
  1. t_usart_cfg rom *cfg=&usart_18f1320_8MHz[2];

Utalni kell a ROM-ra és meg kell adni indexet. Így már működik!
De örülnék a további kritikának IS.
(#) atideath hozzászólása Jún 27, 2010 /
 
Hali.

2 napja szenvedek a DS18B20-as szenzor és a PIC összehozásával. Most is csak 0.0-át mutat az LCD kijelzőn. Semmit nem reagáll. Valaki rá tudna nézni a forrásra? CCS-ben van írva.
(#) vilmosd válasza atideath hozzászólására (») Jún 27, 2010 /
 
Hali
Lehet esetleg valami gubanc az adatok konvertalasaval (float, long). Nezd meg ezt a forumot CCS forum. Pont ugyanez a problema merult fel.
Udv Vili
(#) atideath válasza vilmosd hozzászólására (») Jún 27, 2010 /
 
Már próbáltam mindenhogy. Az a probléma hogy még a keresésre se kapok egyértelmű választ. Olyan mintha nem is látná a PIC a szenzort. A középső lábra rá van kötve egy 4K7-es Ellenállás 5V-al. És úgy van kötve a A1-re. De se kép se hang. Ha keresni akarom az 1 wire eszközöket akkoris 0-át kapok pedig ott van. +5V és Test van a DS18B20-on. Lövésem sincs mi lehet a baja. :S
(#) vilmosd válasza atideath hozzászólására (») Jún 27, 2010 /
 
Hali
Meg kellene valahogy nezni, hogy a 1W vonalon van e kommunikacio. Nem tudom kiprobalni, mert nincsen 18B20-am. En analog erzekeloket hasznalok (TC1047A). Probald ki a CCS forumon levo DS18B20.c forrast. Hatha.
Udv Vili
(#) vilmosd válasza atideath hozzászólására (») Jún 27, 2010 /
 
Bocs de nem kellene a forrasban atallitani a megfelelo portot? Te A1-et irtal es a forrasodban A0 szerepel a 1W labkent.
Udv Vili
(#) atideath válasza vilmosd hozzászólására (») Jún 27, 2010 /
 
Megpróbáltam most keresni a DS szenzort de erre is csak nullát kapok valamiért.

void main()
{
lcd_init();
lcd_putc("\f");

while(1)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"%d",FindDevices());
}
}

1wire.c
    
(#) atideath válasza vilmosd hozzászólására (») Jún 27, 2010 /
 
Próbáltam más más lábakon is a 1 wire kommunikációt azért maradhatott a forrásban az de egyébként biztos hogy jól próbáltam. De semmin nem megy.. Se A0, B0-on se :S. A1-en se.
(#) vilmosd válasza atideath hozzászólására (») Jún 27, 2010 /
 
Hali
Probald meg esetleg a confignal a HS beallitast. Talan. Termeszetesen a
  1. #use delay(clock=12000000)
Meg kellene egy kicsit nezni a configot, mert engem is megtrefalt egy parszor (igaz 18F4431).
(#) Harry válasza atideath hozzászólására (») Jún 28, 2010 /
 
vilmosd-nak igaza lehet abban, hogy a konfig az sok bosszúságot okoz az emberenk.
nekem szerencsére csak az elején okozott anno, későbbiekben inkább a régi konfigokhoz nyúlok
ám szerintem ha működik a PIC, márpedig azt mondod hogy az LCD 0-t ír ki, az már fél siker.
De pl. itt az RA0-t használod, ami alapesetben nem AN0 (analog működés)? mintha azt nem állítottad volna át (nem látom át teljesen a konfigot mert a MikroC-ben egérkattogtatós ez a rész)

az eszközkeresének egy másik változata:
#include<1wire.c>
void main()
{

ADCON0=0x00; //A/D off -nálam mikroC-nél
ADCON1=0xff; //A/D portok digitálissá.. -nálam mikroC-nél


lcd_init();
lcd_putc("\f");

while(1)
{
lcd_gotoxy(1,1);

if(ow_reset())
printf(lcd_putc,"N"); //Nincs
else
printf(lcd_putc,"V"); //Van

}
}
(#) atideath hozzászólása Jún 28, 2010 /
 
Sajnos ezek se jöttek össze. Próbáltam a Configot is változtatni, mindent digitális portra alakítani, de egyikse reagáll semmire :S.
(#) Bell válasza atideath hozzászólására (») Jún 28, 2010 /
 
Remélhetőleg az eszköz nem adta meg magát. Assembly -vel kellene megszólítani.
(#) Harry válasza atideath hozzászólására (») Jún 28, 2010 /
 
én is hasonlókat javaslok mint Bell.
Debuggolni kell. Pl. próbáld ki hogy az RA0/AN0 lábat tudod-e normálisan használni. Kimenet bemenet tesztelés.

Még egy nagyon fontos dolog eszembe jutott!
Először nekem sem ment a TO-92 tokos DS1821-es. (akkor írtam a lent mellékelt kódot). Aztán észrevettem hogy oxidos a lába. Megsmirgliztem, és tényleg az volt a problémám.
Ebből következően, próbáld pl. minél közelebb tenni a mikrovezérlő lábához, hátha a jel összezavarodik.

Ha megvan és tökéletes, akkor egy másik 1W -t kéne beletenni hogy az kommunikál-é.
Ha nincs akkor... hát foggalmam nics hgoy lehetne tesztelni.
Én anno írtam Find_Device() függvény féleséget, nálam működött, mindjárt ide is vésem. (mikroC-ben, DS-re, PIC18F2550-esre, +LCD modulra)


  1. //
  2. // Inicializálja a HB-t meg a HT-t
  3. // az DS a C2-n
  4. sbit HB at RC2_bit;
  5. sbit HT at TRISC2_bit;
  6.  
  7.  
  8. void main(){
  9.   char txt[15];
  10.   unsigned temp;
  11.  
  12.   TRISA=0xFF;   //input-digitláis
  13.   TRISB=0x00;  //output
  14.   TRISC=0x00;
  15.  
  16.  
  17.   ADCON0=0x00;     //A/D off
  18.   ADCON1=0xff;       //A/D portok digitálissá..
  19.   CMCON=0x07;
  20.   OSCTUNE=0x0F;
  21.  
  22.   Lcd_Init();                        // Initialize LCD
  23.   Lcd_Cmd(_LCD_CURSOR_OFF);           // Cursor off
  24.  
  25.  
  26.   while(1)                            //innentől figyel
  27.   {
  28.   Lcd_Cmd(_LCD_CLEAR);
  29.   Lcd_Out(1,1,"OneWire search:");
  30.   HT=0;                               //RC_2 Output
  31.   HB=0;                          //RC_2=0 (tehát lehúzza a lábat és jelet küld)
  32.   delay_us(800);
  33.   HT=1;                       //RC_2 Input
  34.   if(HB==0){
  35.            Lcd_Out(2,1,"Found");       //ha bármikor (input módban) a láb 0-t kap,
  36.            delay_ms(1000);                           //kiírja hogy 0, végtelen ciklus, tehát vége a
  37.                                       //program futásának úgymond.
  38.            }
  39.   if(HB==1)
  40.            {
  41.              Lcd_Out(2,1,"Not found.");        //ha a slave nem húzza le a lábat,
  42.             delay_ms(1000);                          //akkor 1-et ad válaszul
  43.            }
  44.  
  45.    }
  46. }
(#) kissi válasza atideath hozzászólására (») Jún 28, 2010 /
 
Szia!

Nem néztem a forrást, de ha kiveszed és olvasod a portot, akkor FFH-et kell kapnod! Ez működik?

Steve
(#) atideath hozzászólása Jún 29, 2010 /
 
Azóta kaptam egy másik kódot és tökéletesen működik jelenleg. Már csak azt kell majd kisakkoznom hogy hogyan tudok több szenzort egy kábelen kezelni. Tudom hogy azonosítani kell a szenzorokat a számuk szerint de majd ez később lesz esedékes.

Most már a következő eszközre tértem át. Rotary encoder. Nem találtam eddig 1db használható függvényt se a használatára. Valaki kisérletezgetett már vele?
(#) Bell válasza atideath hozzászólására (») Jún 29, 2010 /
 
Rájöttél, hogy korábban mi volt a hiba?

Meglátásom szerint az encoder néhány nem pergésmentes kapcsoló, így azt legegyszerűbb / célszerűbb bit szinten kezelni. Praktikusan megszakítással.
(#) atideath hozzászólása Jún 29, 2010 /
 
A DS18B20 esetében nem értem még most sem hogy mivolt a hiba. Többek szerint a 48Mhz sok volt neki.

Az igazság az hogy az egész programot amit eddig elkezdtem próbálom a Hitech-ről átírni CCS-re. Valahogy megtetszett a CCS. A Rotary encoder sajnos nem megy a Hitech-es kódommal. Ott a pergés volt a hiba. Azért ugrált helytelenül fel,le. Énis a megszakításos dolgon gondolkodom de ugye az Encodernek 2 lába van. A és B. INT/RB0 meg csak egy van. A sima megszakításokat is használhatom rá? Az egy dolog hogy bekötöm de attól még nem bírom megálmodni a forrást . Ezért lenne jó egy példa rá. Azt majd pofozgatom úgy hogy jó legyen.
(#) atideath hozzászólása Jún 29, 2010 /
 
Találtam a CCS fórumán egy szimpatikus rutint.

Hogy lehetne úgy átalakítani hogy változtatni tudjam a rotary encoder helyzetét? Ezt arra értem hogy itt a példában a B portra van kötve.. Ha jól sejtem akkor két elsőre. De nekem át kellene pakolni valahova máshova. Mondjuk RC0, RC1.

Valami ilyesmire gondoltam hogy szembetűnő legyen:
#define ROT_A PIN_C0
#define ROT_B PIN_C1

De nem bírom kigobozni a kódot.. :S Nekem ezek a hexás megadások jócskán bekavarnak hogy most mi hogy van .

roti.c
    
(#) icserny válasza atideath hozzászólására (») Jún 29, 2010 /
 
Idézet:
„Mondjuk RC0, RC1.”
A legegyszerűbb input_b() helyett input_c()-t írni. Bonyolultabb esetben enc_position alsó két bitjébe a bitenként beolvasott adat is bepakolható...
Következő: »»   20 / 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