Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   823 / 1320
(#) Xenen Mo hozzászólása Okt 26, 2010 /
 
Sziasztok!
18f67j60-as picet programozok C18-as fordítóval, és az lenne a problémám van egy függvényem,
  1. StringtoUsart(const unsigned char rom *String)
melynek ha átadok egy stringet ("Hello world!") akkor a függvényen belül a String pointer mutatott értékéra Restricted memory-t ír ki.
Az átadott stringet megtaláltom a program memóriában a 1xyz címen. Próbáltam a far operátort használni, ekkor a mutató ugyanazon a címen tárolt stringre 2xyz címet kata meg a függvényen belül. Természetesen még mindig Restricted memory. Ha azt átírom a "valós" címre akkor is hasonló eredményt kapok. A code modellem kicsire van állítva, és az adat modell nagyra a stack model pedig single-bank.
Miért nem tudok a pointerrel hozzáférni?
Segítségeteket előre is köszönöm!
(#) icserny válasza Xenen Mo hozzászólására (») Okt 26, 2010 /
 
  1. StringtoUsart(const unsigned char rom *String)


Ehhez hasonló függvényem nekem is van:
  1. void outString(const rom char* psz_s)
  2. {
  3.   char c;
  4.   while ((c=*psz_s))
  5.     {
  6.       if (c == '\n')
  7.         {
  8.           _usart_putc(0x0D);
  9.         }
  10.       _usart_putc(c);
  11.       psz_s++;
  12.     }
  13. }


Használata pedig így történik:
  1. outString("Hello world!\n");


A mutató (nálad String, nálam psz_s) a programmemória területére mutat, ezért a c=*psz_s értékadás táblázatolvasással (TBLRD*) utasítással veszi elő a soron következő karaktert (előtte a mutatót TBLPTRL/TBLPTRH-ba másolja a program).
(#) icserny válasza gdeak hozzászólására (») Okt 26, 2010 /
 
Az Explorer16 hajdanában PIC24FJ128GA010-hez készült. Fogalmam nincs, hogy az általad felsorolt mikrovezérlőknél hogy van a lábkiosztás és a PIM modulok lábainak összerendelése. Lehet, hogy egy olyan portbitet vagy periféria kivezetést használsz, ami az egyes mikrovezérélőknél máshol van kivezetve az IC tokból, vagy máshová van kötve a PIM kártyán. Szép feladat lesz ezeknek az aprólékos ellenőrzése!
(#) gdeak válasza icserny hozzászólására (») Okt 26, 2010 /
 
A PIM modulok kivezetései nem egyformák, de az általam használt portok megegyeznek. A PIC32MX790 és a PIC32MX460 PIM modulok kivezetései megegyeznek, mégsem működik a PIC32MX460-assal. Fogalmam sincs mi lehet a kettő között a különbség.
(#) watt válasza gdeak hozzászólására (») Okt 27, 2010 /
 
Pedig ezt neked kell végignyálazni az adatlapok segítségével. Egy biztos, ha egyformák lennének, működne!
(#) Hp41C válasza icserny hozzászólására (») Okt 27, 2010 /
 
Szia!

A C -ben a '\r' a 0x0D , a '\n' a 0x0A kódú karakter.
Ha a szövegeket a outString("Hello world!\r"); alakban adod meg, nem kell a futás idejű konverzió.
(#) trudnai válasza Hp41C hozzászólására (») Okt 27, 2010 /
 
Idézet:
„A C -ben a '\r' a 0x0D , a '\n' a 0x0A kódú karakter.”


Ez amugy platform fuggo. Unixban a '\n' 0x0A (LF) valoban, de pl regebbi MacOS-en ez 0x0D (CR), Windows-ban pedig 0x0A0D (CR+LF, tehat 16 bites).
(#) Xenen Mo válasza icserny hozzászólására (») Okt 27, 2010 /
 
Ugyan így van nekem is. Sajnos még mindig nem működik, most már a disassembly ablakban vizsgáltam hogy mi történik, és azt vettem észre, hogy a pointer címét helyesen tölti be a TBLPTRL/TBLPTRH, de amikor megpróbálja kiolvasni a TBLRD*-vel akkor mindig 0xFF-et olvas ki.
Annyi még hogy mivel nagyobb tömbjeim vannak, emiatt a linker fájlban a bankokat egyesítettem egy nagyobbá. Természetesen a szoftveres stacket békén hagytam.
(#) icserny válasza Hp41C hozzászólására (») Okt 27, 2010 /
 
Ez nem konverzió, hanem kiegészítés: LF elé automatikusan beszúr egy CR-et is.
(#) Hp41C válasza Xenen Mo hozzászólására (») Okt 27, 2010 /
 
Szia!

Az olvasás eredményét befolyásolja még a TBLPTRU regiszter taratlma is. A TBLPTR 22. bitje választ a program és a konfigurációs memória között.
(#) trudnai válasza Xenen Mo hozzászólására (») Okt 27, 2010 /
 
Nem, neked a 'rom' szerintem rossz helyen van. Az a 'char' ele kell keruljon, es neked nem kell 'unsigned', nem is ertem miert tetted azt bele? De amugy minden qualifier-t a 'char' ele kell tenni nem moge, tehat a 'const' ill. 'far' is oda kell keruljon ('const' pl jo helyen van).

Irtad, hogy nayobb tombben vannak a stringek, amiket egy kulon erre fenntartott szekcioba helyeztel? Ugy tunik neked kell az a 'far' qualifier akkor...
(#) icserny válasza trudnai hozzászólására (») Okt 27, 2010 /
 
Idézet:
„Ugy tunik neked kell az a 'far' qualifier akkor...”

A nagyobb tömböket az adatmemóriában helyezi el, tehát azoknak a deklarációjánál kell használnia a far módosítót (bár ha nem csalódom, az a default). A "const rom" deklaráció mellé pedig akkor kell a "far" módosító, ha 64 kbájtnál magasabb címeket is használ a programmemóriában.
(#) balogpepe hozzászólása Okt 27, 2010 /
 
Üdvözletem!

PIC18F2431-en szeretnék soros kommunikációhoz crc16-t számolni, de a hozzá szükséges táblázat nem fér el 2 databankban sem. Összesn 521 bájt a program ebből 512 a táblázat, a gpr0, gpr1, gpr2-be összesen 671 bájt fér. Próbáltam darabolni is a táblázatot de mindig hibára fut a C18 compiler. A legidegesítőbb az, hogy ha a táblázat 3/4-ét teszem be csak, akkor lefordul. Mit lehet ilyenkor tenni? Egyáltalán nem létezik crc16-hoz táblázat nélküli módszer?
(#) watt válasza balogpepe hozzászólására (») Okt 27, 2010 /
 
Hova akarod tenni a táblázatot? Nehogy ne férjen már el egy 16kbyte-os PIC-ben!
(#) balogpepe válasza watt hozzászólására (») Okt 27, 2010 /
 
Köszönöm a gyors választ!
Próbáltam úgy, hogy gpr0-ban van az első negyede, gpr1-ben a fele, gpr2-ben a maradék. De csak nem megy. Error - section 'gpr0' can not fit the section. Section 'gpr0' length=0x00000080. Ezt kapom, ez meg azért érdekes mert ha jól látom gpr0 0x9F tehát el kéne férnie. #pragma idata gpr0-val próbálom elhelyezni. Lehet, hogy ez nem jó?
(#) watt válasza balogpepe hozzászólására (») Okt 27, 2010 /
 
A RAM-ba akarod tenni? Tedd a program memóriába, azt oda szokás! Konstansokat RAM-ba?
(#) balogpepe válasza watt hozzászólására (») Okt 27, 2010 /
 
Sejtettem, hogy nem itt a helye, de ennek a mikéntjét nem ismerem, elég kezdő vagyok még
(#) watt válasza balogpepe hozzászólására (») Okt 27, 2010 /
 
Valami ilyesmi:
  1. #pragma udata
  2.  
  3. //Üzenetek. program terület
  4.         rom const unsigned char MsgBox1[]="Memória Olvasása:";
  5.         rom const unsigned char MsgBox2[]="Memória Írása:";
  6.         rom const unsigned char MsgBox3[]="Parancs várakozik:";

Neked persze a tábládat kellene betenned egy, vagy több tömbbe.
valahogy így:
  1. rom const unsigned char CRC_Tabla[]= {10, 20, 30, 40, 50, 60, 70, 80 ,90, 100};
Én ezt ismerem, de lehet, hogy ettől is van jobb megoldás!
(#) balogpepe válasza watt hozzászólására (») Okt 27, 2010 /
 
Igen! Sikerült, legalábbis lefordult, kipróbálni majd csak akkor tudom ha arra is rájövök hogyan kell kiszámolni a crc-t Köszönöm a segítséget!
(#) watt válasza balogpepe hozzászólására (») Okt 27, 2010 /
 
Nézz fel az oldalamra, van némi infó.
(#) Hp41C válasza balogpepe hozzászólására (») Okt 27, 2010 /
 
Szia!

Nem kell ahhoz tábla sem.... A MODBUS is CRC16 -ot használ...
(#) balogpepe válasza Hp41C hozzászólására (») Okt 27, 2010 /
 
Már sikerült megoldani, de azért köszönöm!
(#) moderboy hozzászólása Okt 27, 2010 /
 
Jó estét az uraknak!

Elég sok kezdő kérdésem lenne
Ma beszereztem egy Pickit debug exp2-t és a Kónya-Kopják féle könyv is megvan, ki is olvastam szorgalmasan.

Az első szoftveres kérdésem az lenne, hogy C-ben mit javasoltok, hogyan oldjak meg egy olyan kapuvezérlést, ami nyit-stop-zár üzemmódban működik, tehát ha menetközben újra kap impulzust akkor megáll, aztán a következőre fordítva indul el.
Ez kezdetre elég nagy fa a fejszémhez, el is akadtam a lehetőségeken, nem áll össze a kép a fejemben. Nem tudom eldönti, hogy külön függvényeket csináljak az egyes állapotoknak, vagy egy kupac HA döntéssel oldjam meg vagy switch-case szerkezettel, ebben szeretnék tanácsot kérni mi a célszerűbb.

A másik, hogy a "gombot" pollinggal vagy megszakítással kéne-e kezelni?

Ha valaki tudna egy egyszerű megoldást felvázolni, onnantól már megküzdök vele.

A hardveres részéről az lenne a kérdésem, hogy hogyan tudnék kimeneti lábbal 12 vagy 24 voltról működő reléket meghúzatni? (gondolom tranzisztort kéne rátenni) Illetve a 12/24V-os bemeneti jeleket hogyan tudnám illeszteni a PIChez?

Ez elég sok kérdés így elsőre, de sajnos abból amit a suliban tanultunk nem áll össze a dolog a fejemben :no:


A segítséget előre is köszönöm!
(#) trudnai válasza moderboy hozzászólására (») Okt 27, 2010 /
 
Szia,

Allapot gepet tipikusan switch-case-el szokas megvalositani. A case agakban nyilvanvaloan bele tehetsz kozvetlen program reszleteket is, de ha szepen akarod tagolni a forras filet akkor erdemes azokat kulon fuggvenyekbe rendezni es a case-bol hivatkozni ra.

A gomb nyomas vagy mas esemenyek fogjak a switch-case-edet vegrehajtani, az esemeny eltarolod valahol, es a switch-case-ban a pillanatnyi allapotban dontod el, hogy adott esemenyre hogyan kell reagalni. Tehat ha pl lampa vezerles: Ket allapot, BE ill KI, egyetlen esemeny kovetkezhet be, a gomb nyomas. Ilyenkor a BE agban az esemeny bekovetkeztekor a statuszt atvaltod KI-re es kikapcsolod a lampat. KI eseten a gombnyomas esemeny bekovetkeztekor forditva cselekszel...

Azt, hogy a gombot hogyan kezeled le teljesen mindegy, pollingozas is teljesen jo. Nyilvan a perges mentesitest is meg kell oldanod, de utana a lenyeg, hogy a fent leirt modszer alapjan jarj el.
(#) icserny válasza moderboy hozzászólására (») Okt 28, 2010 /
 
Ötletadónak nézd meg a honlapomon a Mintaprogram: LED vezérlése nyomógombbal II. c. programot és az utána következőt. A másodikban ha az SW2==1 ágat követed, az nagyjából olyan (a LED-nek három állapota van), mint amit keresel.

Ha nincs más tennivalója a programnak, akkor a polling is tökéletes.

Relé vezérlés (csak az elrendezést nézd, a tápfesz és a tranzisztor... lesz)

Bemenő jel illesztése: feszültségosztó, vagy ellenállás+zener, stb.
(#) Sipy válasza Hp41C hozzászólására (») Okt 28, 2010 /
 
Sziasztok!
Először is szeretném megköszönni a segítséget amit a DS89C4.. mikrokontroller programozóhoz kaptam. Megépítettem és működik is kifogástalanul. Viszont akadt még egy kis gondom. Bascom-8051-et használom program írásra, és az időzítés nem jól működik. Tehát pl beírom hogy Waitms 1000 és ő csak a harmadát várja ki. Gondolom hogy meg kellene adnom egy regfile-t, de sajnos sehol sem találtam őket.
Van rá megoldás, vagy más szoftvert kell beszereznem?
Köszi szépen a segítséget előre is.
(#) Hp41C válasza Sipy hozzászólására (») Okt 28, 2010 /
 
Szia!

Írj 4 sorban Wait 250 -et. Lehet, hogy csak 8 bites értéket kezel....
(#) moderboy válasza icserny hozzászólására (») Okt 28, 2010 /
 
Jól sejtem, hogy ha relé kapcsolja a bemenetet akkor is kell pergésmentesíteni? Mert a bemenetet egy külső rádióvevő adja, ami tulajdonképp egy relét húz meg rövid időre, ha jelet kap a távirányítóktól.
(#) potyo válasza moderboy hozzászólására (») Okt 28, 2010 /
 
Igen, minden mechanikus érintkezőknél szükséges a pergésmentesítés.
(#) moderboy hozzászólása Okt 28, 2010 /
 
Valószínűleg nagyon amatőr kérdés, de már egy órája kb. szívok vele... 44 lábas pickit2 demó panelem van, ezer módon probáltam beolvasni az RB0-on lévő gombot és nem akarja az igazat, mit szúrtam el?

Ez már nem az első változat, kb. 6 féle módon probáltam az if feltételt megadni, de úgy tűnik nem ott van a hiba. Vagy PORTB felső 7 bitje nem 0 ha az alsó bemenet?

  1. #include <htc.h>
  2.         __CONFIG(INTCLK & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS);
  3.     __CONFIG(BORV40); // 2nd config word
  4.  
  5. void config()
  6. {
  7.                 TRISD=0x00;
  8.                 TRISB=0x01;    
  9. };
  10.  
  11.  
  12.  
  13. int main()
  14. {      
  15.         config();
  16.         while(1)
  17.         {
  18.                 if (PORTB & 0x01) {PORTD=0xF0;} else {PORTD=0xFF;}
  19.                
  20.         }
  21.         return;
  22. }
Következő: »»   823 / 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