Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1040 / 1320
(#) Kisvé hozzászólása Dec 12, 2011 /
 
Helló!
Nemrég volt egy kérdésem arról, hogy 16 bites PIC-eknél mi fele meg a #define direktívának. Azóta rengeteg fórumot megnéztem, de nem jutottam egyről a kettőre, csak bonyolult és kényelmetlen megoldásokat találtam eddig. Aki tudja választ kérem, hogy ossza meg velem.
(#) Peti.Janka hozzászólása Dec 12, 2011 /
 
Üdv!

Találtam a neten egy bluetoothos oscilloscopot androidos mobilhoz! Meg találtam a hozzá való Pic-et is a chipcad-nél, de sajna a bluetooth modult sehol nem találok! Az lenne a kérdésem, hogy ehhez vajon lehet használni más modult is, vagy ahhoz már a PIC programban is kell piszkálódni? És ha kell piszkálódni, bírna e segíteni nekem valaki benne? Előre is köszönöm a választ, segítséget! Bővebben: Link

Peti
(#) Androla hozzászólása Dec 18, 2011 /
 
Hi All,

A következő problémában szeretnék segítséget kérni.
Az alábbiakban ismertetésre kerülő program egy részlete 16F690-re íródott. Hi-Tec C segítségével. A Kijelző Displaytech 162b.
Kipróbáltam és működik is rendesen.

Most viszont szeretném áttenni 18F13K22-re,
a nyelv Microchip PIC18 (csak ezt tudtam letölteni ingyen).

A változások:

(16F) 4MHz órajel helyett (18F) 64MHz
Nem probléma, átírtam a pause.c-ben lévő részt és
az időzítés precízen működik.

Az LDC adat bitjei máshogy vannak kötve:
(16F) egyik port alsó 4 bitje (18F) egyik port felső 4 bitje
Itt annyit változtattam, hogy az lcd_write(unsigned char c)
rész nálam most így néz ki a 18F-nél :

  1. void lcd_write(unsigned char c)
  2. {
  3. pause (1);
  4. LCD_DATA =  (c);
  5. LCD_STROBE();
  6. LCD_DATA = (c << 4);
  7. LCD_STROBE();
  8. }
  9.  
  10. A lényeg, hogyha kiadok a mainomba egy függvényhívást
  11. például
  12. lcd_write(0b01000001);
  13. Akkor a kijelzőre szépen kiírja a nagy ,,A,, betűt.
  14. az lcd init is működni látszik és a pozícióra ugrás függvény is
  15. Vagyis ebből arra következtetek, hogy:
  16. Időzítés(ok!)
  17. Függvények(ok!)
  18.  
  19. Az egyetlen dolog nem működik és az pedig az
  20. void lcd_puts(const char * s); függvény !!!
  21. 16F-nél simán ment, persze közben
  22. Hi-Tec helyett Microchip C18 lite lett
  23.  
  24. Elképzelhető, hogy 18F-nél máshogy van a Pointer, Mutató
  25. kezelés vagy kell még egy include file ?
  26. Csak erre tudok gondolni mert a lcd_write(unsigned char c)
  27. függvény ami a legtöbbnek a lelke működni látszik!
  28. Ebben kérném a segítséget!
  29.  
  30. Az új lcd.c-be bele kellett tennem az
  31. #include "PIC18f13k22.h"-t
  32.  
  33.  
  34. A régi LCD.C Tartalma:
  35.  
  36. #include < htc.h >
  37. #include"lcd.h"
  38.  
  39. void pause( unsigned short usvalue );
  40. #define    LCD_RS RA2
  41. #define    LCD_RW RA4
  42. #define    LCD_EN RA1
  43. #define    LCD_DATAPORTC
  44. #define    LCD_STROBE()((LCD_EN = 1),(LCD_EN=0))
  45.  
  46.  
  47. //write a byte to the LCD in 4 bit mode
  48. void lcd_write(unsigned char c)
  49. {
  50. pause (1);
  51. LCD_DATA = ( ( c >> 4 ) & 0x0F );
  52. LCD_STROBE();
  53. LCD_DATA = ( c & 0x0F );
  54. LCD_STROBE();
  55. }
  56.  
  57.  
  58. //Clear and home the LCD
  59. void lcd_clear(void)
  60. {
  61. LCD_RS = 0;
  62. lcd_write(0x1);
  63. pause (2);
  64. }
  65.  
  66.  
  67. //write a string of chars to the LCD
  68. void lcd_puts(const char * s)
  69. {
  70. LCD_RS = 1;// write characters
  71. while(*s)
  72. lcd_write(*s++);
  73. }
  74.  
  75.  
  76. //write one character to the LCD
  77. void lcd_putch(char c)
  78. {
  79. LCD_RS = 1;// write characters
  80. lcd_write( c );
  81. }
  82.  
  83.  
  84. // Go to the specified position
  85. void lcd_goto(unsigned char pos)
  86. {
  87. LCD_RS = 0;
  88. lcd_write(0x80+pos);
  89. }
  90.  
  91.  
  92. //initialize the LCD - put into 4 bit mode
  93. void lcd_init()
  94. {
  95. char init_value;
  96. ANSEL = 0;
  97. init_value = 0x3;
  98. TRISA=0;
  99. TRISC=0;
  100. LCD_RS = 0;
  101. LCD_EN = 0;
  102. LCD_RW = 0;
  103. pause (15);
  104. LCD_DATA = init_value;
  105. LCD_STROBE();
  106. pause(10);
  107. LCD_STROBE();
  108. pause(10);
  109. LCD_STROBE();
  110. pause(10);
  111. LCD_DATA = 2;// Four bit mode
  112. LCD_STROBE();
  113. lcd_write(0x28); // Set interface length
  114. //lcd_write(0xC); // Display On, Cursor Off, Blink Off
  115. lcd_write(0xF); // Display On, Cursor On, Cursor Blink
  116. lcd_clear();// Clear screen
  117. lcd_write(0x6); // Set entry Mode
  118. }
(#) moderboy válasza Androla hozzászólására (») Dec 18, 2011 /
 
Van egy PIC haladóknak című téma, ez a kérdés szerintem oda tartozik ott hamarabb tudnak segíteni!
(#) kzteam válasza Androla hozzászólására (») Dec 18, 2011 /
 
Szia,

1. PIC18-nál ha adatot akarsz kirni nem PORTC, hanem LATC a jó regiszter
2. bár az enyém hosszabb rutin de tutti jó igy mutatom:
  1. void Putchar(char q)//1 karaktert visz át az LCD-nek
  2. {char w,i;
  3. w=q;
  4. w=w>>4;
  5. w&= 0x0f;
  6. w|=0x40;
  7. LATC=w;
  8. Enable();
  9. q&= 0x0f;
  10. q|=0x40;
  11. LATC=q;
  12. Enable();
(#) kzteam válasza kzteam hozzászólására (») Dec 18, 2011 /
 
Egy kis magyarázat:

Nekem a C porton megy ki minden E,RS ( RW fixen negativon). Ezért nálam ki kell maszkolni a felső részt mielőtt adatként kiteszem.
(#) kzteam válasza Androla hozzászólására (») Dec 18, 2011 / 1
 
A String kiirashoz pedig ezt hasznalom sikerrel:

  1. unsigned char dataString[]= "TMR0 erteke:";
  2.  
  3. void stringtoLCD(unsigned char *m)//Kiírja a "0x00" értékig a karaktertömböt az LCD-re
  4. {
  5. unsigned char i;
  6. i = 0;
  7. while(m[i] != 0)
  8. {
  9. Putchar(m[i]);
  10. i++;
  11. }
  12. }
  13.  
  14. void main (void)
  15. { .
  16. .
  17. stringtoLCD(dataString);
  18. ...
  19. }
(#) icserny válasza Androla hozzászólására (») Dec 18, 2011 / 1
 
Idézet:
„Elképzelhető, hogy 18F-nél máshogy van a Pointer, Mutató kezelés?”
Természetesen, s különbség van a data RAM és a ROM elérésében is.

  1. void lcd_puts(const char * s)

Ehelyett egy lcd_putrs() függvényt definiálj, ha ROM-ban elhelyezett szöveget írsz ki! A különbség a mutató deklarásában van:
  1. void lcd_putrs(const rom char * s)
(#) Androla hozzászólása Dec 18, 2011 /
 
Akkor még egyszer

Üdv Mindenkinek !

Köszönöm az eddigi hozzászólásokat!

Holnap kipróbálom
kzteam és icserny ötletét is, meglátjuk mit tudok kihozni a dologból.

Egyébként az általatok javasolt két eltérő változatot már
próbálgattam, szenvedtem vele, nagyon remélem, hogy rosszul, vagyis, hogy elírtam valamit és azért nem ment, majd meglátjuk, amint tudom kipróbálom !

köbzoli ,
Elnézést, hogy nyitottam egy új témát de ez egy 1044 oldalas jelenleg és mindenki kérdez mindenfélét, egyrészt nem akartam belerondítani egy adott folyamatban másrészt a kevés szabad időmet nem azzal akartam tölteni, hogy filterezem a fórumot, hogy vajon melyik válasz szól nekem.
De semmi gond, ha itt ez a módi és mást sem zavarok ezzel akkor a jövőben igyekszem így eljárni.

Androla.
(#) icserny válasza Androla hozzászólására (») Dec 18, 2011 / 1
 
Félreértés ne essék: nem ötletet írtam, hanem arra hívtam fel a figyelmedet, hogy ha a ROM-ban elhelyezett szöveget akarod kiírni (már pedig az lcd_putrs("kiirando szoveg") tipikusan az), akkor a mutatónál használni kell a const mellett a rom attribútumot is. Nem fakultatív...

Ha a RAM-ból íratsz ki, akkor más a helyzet, de az nem illeszkedett a problémádhoz.
(#) Androla hozzászólása Dec 18, 2011 /
 
Értelek!!!
(minden ötletből tanul valamit az ember),
nekem az alapvető problémám az, hogy minden megy
kivéve ezt a részt:

//write a string of chars to the LCD
void lcd_puts(const char * s)
{
LCD_RS = 1; // write characters
while(*s)
lcd_write(*s++);
}

És nem tudom, hogy miért.
Ha használom az lcd_write(0bXXXXXXXX);
függvényemet, ha megadom bemenő paraméterként az adott ASCII karakternek megfelelő bináris kódot akkor a megfelelő karakter szépen ki is írogatja az LCD-re. De amikor karakter láncot akarok kiíratni az lcd_puts("Működj Mááár!"); függvénnyel akkor ez nem csinál semmit.
(#) potyo válasza Androla hozzászólására (») Dec 18, 2011 / 1
 
Ha úgy írod, hogy
  1. lcd_putrs("Működj Mááár!");
akkor sem működik? Természetesen az lcd_putrs rom pointert kell, hogy fogadjon. Nem vagyok benne biztos, de én a fordító helyében nem foglalnék feleslegesen helyet a ram-ban, ha egyszer a rom-ban úgyis ott kell lennie a konstansnak.
(#) Androla hozzászólása Dec 18, 2011 /
 
Holnap tudom csak kipróbálni. De ezt most nem értem !!!

lcd_puts("Működj Mááár!");
lcd_putrs("Működj Mááár!");

Az, hogy lcd_puts és lcd_putrs nem csak egy szimbolikus
név amivel én neveztem el a függvényemet ?
(#) icserny válasza Androla hozzászólására (») Dec 18, 2011 / 1
 
Nem a függvénynév számít, hanem az, hogy kiteszed a rom módosítót. De ezt már éppen harmadjára írom le!

Az lcd_putrs() függvénynevet csak azért javasoltam, hogy a függvény neve is tükrözze, hogy ez a függvény a ROM-ból ír ki.
(#) Androla hozzászólása Dec 18, 2011 /
 
Így értem !
De ha ezt most nem mondod, az az r bevitt volna az erdőbe.

Akkor holnap teszt.
(#) trudnai válasza Androla hozzászólására (») Dec 18, 2011 /
 
Lehet mar tudtok rola, de nekem ujdonsag volt: Microchip a napokban bejelentette az MPLAB X vegleges valtozatat. Le lehet tolteni Windows, Mac es Linux platformokra, PicKit2 es 3 is tamogatott, no meg jo par mas programozo is. C18, C30 es C32, no meg a HiTech PICC 10-12-16 es 18 is benne van (pontosabban kulon installerrel rakhatok ezek fel). Java futtato kornyezet szukseges hozza.

Linkek: Bejelentes - Letoltes
(#) potyo válasza trudnai hozzászólására (») Dec 18, 2011 /
 
Én még eddig nem tudtam róla. Eddig azért kellett egy XP-t futtatnom Virtualboxban, hogy tudjam futtatni az MPLAB-ot. Jövő héten úgyis van pár dolog, aminek neki akarok állni, akkor majd megnézem, hogy mennyire használható az MPLAB X Ubuntu alatt.
(#) trudnai válasza potyo hozzászólására (») Dec 18, 2011 /
 
Majd irdd meg legyszi a tapasztalataidat, en Mac alatt fogom kivesezni a dolgokat (es remelem minel kevesebb) buktatokat.
(#) Hp41C válasza trudnai hozzászólására (») Dec 19, 2011 /
 
Jó lenne, ha a végleges változat kezelné a PICKit2 -t, de amit én októberben letöltöttem, az még nem tudta...
(#) Androla hozzászólása Dec 19, 2011 /
 
Kipróbáltam, Működik!
Köszönöm a segítséget mindenkinek !
Most szeretném megkérdezni a dolog miértjét ? Aminek eddig utána néztem, hogy a const előtag használatával a változó a program memóriában jön létre (C30) ? A rom használatával szintén ezt olvastam (C18) ?
Ez most nem annyira értem. Ha nincs ott a rom csak a cons előtag akkor miért nem működik ? Vagy rosszul értelmezem és a const előtag azt jelenti, hogy a fordító ne nyúlhasson az adott adathoz ?
(#) potyo válasza Androla hozzászólására (») Dec 19, 2011 / 1
 
Fordítófüggő a dolog. C18 fordítónál ahhoz, hogy a rom területen legyen a holmi, ahhoz rom kulcsszó kell. C18-nál a const csak arra van, hogyha const-nak megadott változóba írni akarnál, akkor azt fordító kiböki fordítás közben, hogy azt úgy nem lehet.

Hi-Tech C fordítójánál a const használata elég, hogy a rom területre kerüljön a változód.

C30-at nemtudom, lehet, hogy ott is a const használatával a rom területre kerül az adat.

Igazából az a baj, hogy a C szabvány Neumann architektúrájú gépekre készült annakidején, és ott nincs külön rom és ram terület. Így erre, hogy egyik fordítóban a const elég, míg másikban a rom kell, egyikre sem lehet azt mondani, hogy nem jó, mert valamilyen szinten mindkettő logikus. Így marad az, hogy a fordító készítője amit választott, azt kell használnunk.
(#) Moderátor hozzászólása speeedfire hozzászólására (») Dec 19, 2011
 
Kereső, kereső, kereső...
(A hozzászólás eltávolítva.)
(#) Androla hozzászólása Dec 20, 2011 /
 
Értem.

Az én esetemben végül is mi történt, hogy
kihagytam a ,,const rom" módosítót ezért a C18
fordítás közben ezt a részt kihagyta ?

Vagy olyan memória területre helyezte ahonnan nem
lehet visszaolvasni vagy nem értelmezett terület jött létre ?

Köszönöm az eddigi segítségeket!
(#) icserny válasza Androla hozzászólására (») Dec 20, 2011 / 1
 
A szöveg oda került, ahová kell. A mutató típusa nem volt helyesen megadva, ezért ennek a kezelése lett hibás, nem oda nyúlkált, ahová kellett volna.
(#) potyo válasza Androla hozzászólására (») Dec 20, 2011 / 1
 
Úgy képzeld el, hogy van két polcod egymás mellett, egyiken különféle almák, a másikon különféle diók. Amikor te beírsz egy szöveget, akkor az olyan, mintha hoznál egy láda diót és feltennéd a diós polc harmadik szintjére. Ha később csak azt mondod, hogy a harmadik polcról kell neked ami ott van, de azt nem mondod, hogy a diós polcról, akkor a fordító azt úgy veszi, hogy neked az almás polc harmadik szintjéről kell ami ott van, ott pedig nem diót fog találni, hanem almát.
(#) Androla hozzászólása Dec 20, 2011 /
 
Köszönöm!

Üdv.
Androla
(#) speeedfire hozzászólása Dec 21, 2011 /
 
Ezek között mi a különbség az árunkon kívül?

PIC16F627A-I / P
PIC16F627-04 / P
PIC16F627-20 / P
(#) netnet.hu válasza speeedfire hozzászólására (») Dec 21, 2011 /
 
PIC16F627A-I/P PDIP tokozás 18 láb, újabb modell


PIC16F627 régebbi (elavult modell) 18 láb

04 4 Mhz-es oscillátor
20 20 Mz-es oscillátor

Adatlap 169. oldal
(#) speeedfire válasza netnet.hu hozzászólására (») Dec 21, 2011 /
 
Köszi a gyors választ.
(#) mrgrassy hozzászólása Dec 22, 2011 /
 
Sziasztok azt szeretném kérdezni hogy van e olyan PIC programozó ami minden féle Pic-et tud programozni és ha van melyik az ?

Most van egy jdm-em de nem tudok vele PIC18f4550-est programozni én vagyok a béna vagy programozót kéne váltanom ?

És ha váltok akkor pickit2-jó ??
Következő: »»   1040 / 1320
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