Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   115 / 153
(#) Bell válasza cross51 hozzászólására (») Okt 18, 2015 /
 
XC8-al PIC18LF45K50 -ra használtam saját printf-et:
  1. #include <stdio.h>
  2. ...
  3. static int (*putc_fn)( int );
  4.  
  5. int main()
  6. {
  7.     double szam;
  8.     szam=1379/3.1415926;
  9.     procIni();
  10.     LCDIni();  
  11.     putc_fn = LCDstr;
  12.     printf("szam=%.3f",szam);
  13. }
  14.  
  15. void send_nibble(unsigned char nibble)
  16.         {
  17. // Set RD0-3 without affecting RD4-7
  18.     LATD = (LATD & 0xF0) + nibble;
  19.     delay_ms(4);  // Note: data is latched on falling edge of pin E
  20.     PIN_E = 0;
  21.     delay_ms(4);
  22.     PIN_E = 1;
  23.     delay_ms(5); // Enough time even for slowest command
  24.         }
  25.  
  26. // Send a command byte (i.e. with pin RS low)
  27. void send_command_byte(unsigned char byte)
  28.         {
  29.     PIN_RS = 0;
  30.     send_nibble(byte >> 4);
  31.     send_nibble(byte & 0xF);
  32.         }
  33.          
  34. void send_data_byte(unsigned char byte)
  35.         {              
  36.     PIN_RS = 1;
  37.     send_nibble(byte >> 4);
  38.     send_nibble(byte & 0xF);
  39.         }
  40.  
  41. void LCDstr(unsigned char ch )
  42.         {
  43.     send_data_byte( ch );
  44.         }
  45.  
  46. void putch( unsigned char ch )
  47.   {
  48.     (*putc_fn) (ch);
  49.  }
A hozzászólás módosítva: Okt 18, 2015
(#) cross51 válasza Bell hozzászólására (») Okt 18, 2015 /
 
Ez nem teljesen az amire én gondolok, én külön függvényt akarok használni azt ismerem hogy a ptuch a kimenete is mert a vprintf az stdout(putch)-ba ír ki formázott adatot csak nekem nem tetszik, hogy az lcd-re úgy írok ki mondjuk egy változót, hogy printf("szam: %u", valtozo).
(#) Wezuv válasza don_peter hozzászólására (») Okt 18, 2015 /
 
Szia! Kézzel? Van erre egy pár program. Én ezt használon:
LCD Image Converter
Bármilyen bittérképet elkészít, képet is, ékezetes karaktereket is, képes beolvasni a PC készleteit majd lehet azon módosítani stb. Egy kis gyakorlással minden megoldható. Nekem túl bonyolult az a tömbrendszer, amit létrehoz, ezért át szoktam gyúrni egyszerűbbé, de elvileg az is használható, amit felajánl, ha meg tudod etetni a fordítóval.
(#) Bell válasza cross51 hozzászólására (») Okt 18, 2015 /
 
Hasonlót szerettem volna, de nem jött össze nekem sem. Ezért maradtam az egyszerűbbnél.
Ha megoldódik, érdekelne és gondolom másokat is.
(#) don_peter válasza Wezuv hozzászólására (») Okt 19, 2015 /
 
Én ezt írtam rá: Bővebben: Link
A karakter generálás nem gond

Most a DS18B20-al kínlódom, az istenért nem akar működni
(#) Wezuv válasza don_peter hozzászólására (») Okt 19, 2015 /
 
Erről egy vicc jut eszembe a vadászról a medvéről és a "szívásról". Remélem te is viccesen fogod fel!
(#) killbill válasza cross51 hozzászólására (») Okt 19, 2015 /
 
Idézet:
„csak nekem nem tetszik, hogy az lcd-re úgy írok ki mondjuk egy változót, hogy printf("szam: %u", valtozo).”
Ennél mi lehet jobb?
(#) cross51 válasza killbill hozzászólására (») Okt 19, 2015 /
 
A legegyszerűbb megoldást sikerült kitalálni amire nem is gondoltam
  1. #define lcdprint printf


Igazság szerint ugyanúgy a printf-et akarom használni, csak nem azon a néven(mert nem tetszik ), hogy printf, de ezt a #define vel sikerült megoldani.
A hozzászólás módosítva: Okt 19, 2015
(#) Wezuv válasza cross51 hozzászólására (») Okt 19, 2015 /
 
Ezt az eléggé el nem ítélhető módszert használja előszeretettel a microchip programozói csapata a példa programjaiban is. Eléggé tudom őket útálni, mikor meg kell érteni, mit hogyan oldottak meg. Ők ezt ráadásul példának szánják...
Csak mellékes, hogy nem szoktam használni gyári függvényeket, kivéve a matekosakat. Még az Open és társait is mellőzöm (még C32-nél is). Eredmény, kevesebb meglepetés, végeredményben, gyorsabb haladás...
(#) cross51 hozzászólása Okt 20, 2015 /
 
Egy újabb kérdésem adódott, hogy megoldódott a printf probléma(végül nem a define lett a _doprnt.c fájlt bemásoltam, módosítottam és beka... a microchip). Az újabb dolog az lenne, hogy egy "class"-t indirekt struktúrát létrehozni az lcd-re író függvényeknek, ez sikerült is, csak az lenne a kérdés hogy a struktúrában lévő függvényeket lehet-e egy alapcímmel indítani, hogy ne kelljen a programba megadni a függvénycímeket
szóval, hogy ne ilyen legyen:
Az lcd-re vonatkozó kód
  1. void LCD_write(unsigned char data, unsigned char cmd)
  2. {
  3.     LATA = data;
  4. }
  5.  
  6. void LCD_putc(char c)
  7. {
  8.     LCD_write(c, 1);
  9. }
  10.  
  11. void lcdControl(struct lc *func_ptr)
  12. {    
  13.     func_ptr->print = printf;
  14.     func_ptr->putc = LCD_putc;
  15.     func_ptr->_write = LCD_write;
  16. }
  17.  
  18. void putch(char c)
  19. {
  20.     LCD_putc(c);
  21. }


és a main függvény
  1. struct lc lcd;
  2.  
  3. void lcdControl(struct lc *func_ptr);
  4.  
  5. int main(void)
  6. {
  7.     lcdControl(&lcd);
  8.     lcd.print("Hello World");
  9. }


szóval a lényeg az lenne, hogy a fő programban már semmilyen módon ne kelljen inicializálni a függvényeket.
Erre van lehetőség?


Wezuv és se szeretem a michrochipes alapkönyvtárakat mikor arról van szó én is megírom őket, de most távolodok a hardvertől és arra törekszem, hogy a C kód legyen szebb és nem érdekel mekkora a program.(kicsit hátrányos az ha az ember egyszerre gépre is és PIC-re is ír programot mert állandóan C#-ot akarok megvalósítani a 8 bites PIC-el)
A hozzászólás módosítva: Okt 20, 2015
(#) Wezuv válasza cross51 hozzászólására (») Okt 20, 2015 /
 
Nekem azzal van a bajom, hogy egy meglévő függvényt, vagy lejárást átdefiniálnak, aztán azt még belegyúrják még egy pár definícióba és a végén teljesen követhetetlen, hogy mit akarnak.
A másik, hogy nem biztos, hogy az elsődleges megközelítés egy PIC esetében, hogy a forrás legyen szép, mert az nagy valószínűséggel lassú lesz. Persze nem zárja ki a kettő egymást, de ha nagyon sok függvényhívást ágyazol egymásba, az a 8 biteseknél még verem túlcsordulást is okozhat, és-vagy lassúságot.
A kérdésedet nem pontosan értem, lehet, hogy a library készítés körül kéne keresgélned, de a környezetet mindenképpen be kell csatolni (#include) a forrásba, akkor is ha gyári, ha nem...
(#) Bell válasza cross51 hozzászólására (») Okt 21, 2015 / 1
 
A C nyelv támogatja a legmerészebb elképzeléseket is, de ez akkor praktikus, ha ismerjük a megoldás hatásait az erőforrásokra.
(#) cross51 válasza Bell hozzászólására (») Okt 21, 2015 /
 
Igen, elkezdtem nézegetni a az XC32++-t tetszik is meg nem is, nagyjából egy "pillanat lenne" PIC-et váltani, de kicsit félek a 32 bittől, hogy beletörhet a bicskám kicsit régebben 16 bitesekkel foglalkoztam egy kicsit, de bőven meghaladta a teljesítménye a nekem szükségeset.
A stack-re azóta figyelek mióta tudom, hogy van egyszer csináltam egy futófényt és a megszakításból nem tértem vissza és úgy váltottam üzemmódot, azóta nem volt bajom a stack-el.
Meg remélem a C fordító 8 biten egy 31 mély stack-et nem fog túlírni.
(#) Bell válasza cross51 hozzászólására (») Okt 21, 2015 / 1
 
Kényelmes csak pár típust programozgatni, amíg az ember ismerkedik a hardver lehetőségeivel és korlátaival.
Ahhoz viszont, hogy a megfelelő eszközt az adott feladathoz ki tudjuk választani, több családdal is meg kell ismerkedni. Asm-ben ez lényegesen több időt, erőfeszítést venne igénybe.
Előfordul, hogy sokat molyolunk valamivel, amiről aztán kiderül, hogy egy másik eszközzel már rég készen lennénk. Szóval a futási idő, memóriahasználat, szépség és egyebek fontosak, de gyakran inkább az a követelmény, hogy stabilan fusson és holnapra legyen meg.
(#) cross51 hozzászólása Okt 21, 2015 /
 
Köszönöm a sok információt, tanácsot a struktúrával egyebekkel kapcsolatban elkészült most egy egyszerű hőmérő majd még lesz tovább is csak ma ennyit csináltam, a végeredmény szerintem nagyon szép:
  1. #include "system.h"
  2.  
  3. /*
  4.  *
  5.  */
  6. struct lc lcd;
  7. //struct wire I2C;
  8. struct te temperature;
  9.  
  10. int main(void)
  11. {
  12.     systemInitalize();  
  13.        
  14.     while(1)
  15.     {
  16.         delay_ms(250);
  17.        
  18.         lcd.cmd(0x80);
  19.         lcd.print("Temp: %2.1fC°", temperature.get());
  20.     }
  21. }


Egy hátránya van 12000 sor lett és ezt már megírtam assembly-be nem volt 300 sor, itt jön elő, hogy hobbi vagy munka és, hogy mi számít a szépség méret vagy sebesség, jelenleg számomra a szépség volt a cél szempont és nem érdekelt mi kerül a PIC-be.
(#) don_peter hozzászólása Okt 27, 2015 /
 
Uraim, 128bit-es változóra lenne szükségem, de nem tudom mi lenne a legjobb megoldás egy ilyen változó létrehozására.
Struktúra?
De hogyan, milyen felépítésben?
(#) killbill válasza don_peter hozzászólására (») Okt 27, 2015 /
 
Struktura, esetleg uint16_t vagy uint32_t tömb. Meg persze milyen processzoron? 8/16/32 bit? De attól is függ, hogy mit akarsz vele csinálni, milyen műveleteket akarsz vele végezni. És mi a fontosabb, sebesség vagy kódméret?
(#) don_peter válasza killbill hozzászólására (») Okt 27, 2015 /
 
Uhh bocsánat.
8bit-es MCU, konkrétan egy 18F46K22 -vel szórakozom, C18-ban
A 128bit, egy szélességben kellene mert biteket akarok tologatni benne, balra.
Egy GLCD kijelző pixeleit szeretném ezzel a módszerrel manipulálni.
32bit sajna kevés, de persze ha nem lehet másként, akkor kénytelen leszek darabonként megoldani.
A hozzászólás módosítva: Okt 27, 2015
(#) killbill válasza don_peter hozzászólására (») Okt 27, 2015 /
 
Hat, azt nem tudom, hogy ez C18-cal hogyan lesz jobb. Egy 16 elemu uint8_t (unsigned char) tombot csinalnek.
(#) don_peter válasza killbill hozzászólására (») Okt 27, 2015 /
 
Most jelenleg ilyennel próbálkozom:
  1. /*********************************************
  2. +               Union deklarálása
  3. **********************************************/
  4. /*- 128bit-es UNION -*/
  5. typedef union _union128 {
  6.         struct {
  7.                 unsigned long bit32[4];
  8.         };
  9. } union128;
  10. volatile union128 LCDDATA;

Hátha jó lesz, nincs jobb ötletem.
4 részre bontom mert ennél jobbat most nem tudok.
(#) killbill válasza don_peter hozzászólására (») Okt 27, 2015 /
 
Miért kell ebbe struct meg union? Ha egy unionban csak egyetlen elem van, annak nincs semmi értelme. Meg annak se sok, ha egy struktúrában csak egy sima tömb van.

  1. typedf unsigned long wide128 [4];
  2.  
  3. wide128 lcddata;
  4.  
  5. lcddata[0] = ....;
(#) don_peter válasza killbill hozzászólására (») Okt 27, 2015 /
 
Így oldottam meg, és működik is, majd egyszerűsítem sima struktúrára vagy csak egyszerű változóra, mert ehhez persze nem kell, sem union, sem struktúra, csak a próbálkozások során ez marad meg.

A GLCD-re kikerült adatokat kellett tologatnom, de úgy fest ez a része már jó lesz, majd pici finomítások még lesznek, de már működik úgy ahogyan kigondoltam.
(#) Zsolt2 hozzászólása Okt 30, 2015 /
 
Sziasztok!
Egy rövid kérdésem lenne hozzátok. A változokat a .c file-ban kell deklarálni vagy a .h-ban?
Ha a .h-ban delarálom, akkor "multiple definition of" hibát ad, mivel a main-ben is includolva van az adott header file és a .c file-ban is.
(#) Wezuv válasza Zsolt2 hozzászólására (») Okt 30, 2015 /
 
c ben szokás. Külön erre a célra nyitott h-ban esetleg a globálisakat szokták extendizálni , hogy ne kelljen mindenhol, ahol használni akarod.
(#) foxi63 válasza Zsolt2 hozzászólására (») Okt 30, 2015 /
 
Szia!
a header fájl-t több helyen is csatolhatod, csak meg kell akadályozni a többszörös dekralációt.
legyen a fájl proba,h
az elején beírod : #ifndef __proba__ (itt egyébként itt mindegy milyen szöveg van)
#define __proba__
innentől a dekralációk
......
.........
a végén : #endif
Igy akárhova berakhatod a header fájlt. A változókat pedig használhatod más fájlokban, csak extern szót kell elétenni.
(#) don_peter hozzászólása Okt 30, 2015 /
 
Uraim, egy hasonló rutint kellene írnom mint a printf(), de sajnos nem jövök rá miért nem azt csinálja amit akarok.
Létre hoztam egy globális változót, ebben lesz majd a végleges adat ami ki kell íratnom LCD-re.
  1. volatile unsigned char TextBuffer[22] = {0};

Ez maga a rutin:
  1. void text_to_array(auto rom unsigned char *str){
  2.         unsigned char i=0;
  3.         while(str[i]=='/0'){
  4.                 TextBuffer[i] = str[i];
  5.         i++;
  6.         }
  7. }

A típusát ezer fele képen lepróbáltam, most az utolsó módosítást látható.
A meghívás:
  1. text_to_array("ABCDEFGHIJKLMNOP");

A lényege az lenne, hogy a text_to_array tartama átkerüljön a TextBuffer tömbbe.
Erre azért van szükségem mert az ST7920-as LCD-re csak nagyon körülményesen tudok írni és nem tudom keverni a típusokat.
Ezért az int típusú adatokat átkonvertálom char típusúra majd azokat beteszem a tömb megfelelő helyére és így küldöm majd ki a kijelzőre.
Elsőre, sőt másodikra is körülményesen hangzik, de ez van most.
Előre is köszi.
(#) don_peter válasza don_peter hozzászólására (») Okt 30, 2015 /
 
Közben megtaláltam a hibát:
  1. while(str[i]!='/0')

Ez van amikor az ember a bagatell dolgokra nem figyel és már zavar van a fejben
A hozzászólás módosítva: Okt 30, 2015
(#) killbill válasza don_peter hozzászólására (») Okt 31, 2015 /
 
Persze '\0', de ez biztos csak elgépelés.
A fenti függvény kicsit egyszerübben: (egy példa a for és a pointerek használatára)
  1. void test_to_array(auto rom unsigned char *str)
  2. {
  3. volatile unsigned char *p;
  4.  
  5.   for(p = TextBuffer; *str; *p++ = *str++);
  6. }


Hogy érted azt, hogy nem tudod keverni a tipusokat? A fenti függvény char-t másol char tömbbe.
(#) don_peter válasza killbill hozzászólására (») Okt 31, 2015 /
 
Nos közben a sprintf() volt a segítségemre mert nem jutottam egyről a kettőre, de ez meg zabálja a memóriát.

A lényeg még egyszer:
Azt szeretném elérni, hogy mint amit a printf("ABCD") rutin is csinál.
Nem az átalakításokra gondolok, hanem arra, hogy a macskakörmös részeket kiemeli egy tömbbe.
Az én esetembe a text_to_array("ABCD") rutin lenne erre a feladatra.
  1. void text_to_array(rom unsigned char *str){
  2.             unsigned char i=0;
  3.             while(str[i]!='\0'){
  4.                     TextBuffer[i] = str[i];
  5.             i++;
  6.             }
  7.     }

A baj pedig itt kezdődik.
A text_to_array() rutinnak nem mindegy milyen típusú a bemenete.
Ha sima unsigned char vagy bármi, akkor nem másol semmit a TextBuffer tömbbe.
De ha rom unsigned char, akkor bemásolja.
Igen ám, de ezzel meg az a baj, hogy a 3. meghívásnál már nem csinál semmit.
Megtelik a stack memória vagy nem tudom, de egyszerűen nem másolja át az adatokat..
Ezzel kínlódtam tegnap szinte egész nap, de nem jöttem rá miért van ez, majd az sprintf()-re rátaláltam, és az működik, de eszméletlen módon zabálja a memóriát nem beszélve arról, hogy baromi lassú.

A tömbök tartalmát cserélgetnem kell, mert vannak int típusú változók amiket átalakítás után be kell helyezzek a tömb megfelelő helyéra a kiíratás előtt.
ST7920-as GLCD-vel kínlódom és valami borzalom minden egyes keservesen történő előre lépés.
(#) foxi63 válasza don_peter hozzászólására (») Okt 31, 2015 /
 
Szia!
talán az stdio.h-ban van sztringmásoló függvény strcpy(... ....)
rég használtam már.
Sajnos az "abcdef" szöveg futásidőben movlw movwf utasításokkal először feltölt egy buffert, majd azt másolja a másikba. Ez lehet a lassúság oka. A ROM-ból olvasás is lassú relatíve...

Aztán ott van a típuskényszerítés más típusú pointerek elfogadására ez -> ( )
üdv.: Foxi
A hozzászólás módosítva: Okt 31, 2015
Következő: »»   115 / 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