Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   626 / 1319
(#) Ktulu válasza Attila86 hozzászólására (») Dec 21, 2009 /
 
Az ilyen hibakra is jobban figyelj oda:
  1. movlw   B'00000000'             ;0-át írunk a W-be
  2.         movlw   TRISA                   ;PORTA minden lába kimenet lesz
  3.         movlw   TRISB                   ;PORTB minden lába kimenet lesz
(#) watt válasza Ktulu hozzászólására (») Dec 21, 2009 /
 
Hű ez mekkora találat! Én nem is láttam! A TRISC a TRISB kódértéke lesz, így most nem is tudom fejből mennyi a bináris értéke...
(#) Attila86 válasza kisszee hozzászólására (») Dec 21, 2009 /
 
A PIC konfiguráció-beállításait még nem néztem át (mármint hogy mit hogyan kell). A program elején a konfigurációs beállításokat átmásoltam a másik projektben használt asm-emből, amit pedig anno Icserny írt nekem: Bővebben: Link

Ja és persze erre a PIC-re ez a config nem tetszett a fordítónak, ezért azokat a sorokat amelyekre error-t írt, azokat megjegyzésbe tettem. Túl optimista voltam hogy menni fog?
(#) Attila86 válasza Ktulu hozzászólására (») Dec 21, 2009 /
 
Hát igen...
(#) watt válasza Attila86 hozzászólására (») Dec 21, 2009 /
 
Na okés, de az oszcillátor részt kikommentezted a programodban.
Akkor nézd át ezt a részt az adatlapban(Config bájtokat!), és a fenti hibákat is javítsd és tedd fel a kódot újra, ha nem működik!

Még annyit, hogy nézz fel az oldalamra, és próbáld meg úgy beállítani a konvig biteket, mert az jobban követhető az adatlap segítségével. Később ráérsz a támogatott módszert használni. Ne törődj a warningokkal se!
(#) MPi-c válasza watt hozzászólására (») Dec 21, 2009 /
 
Idézet:
„mennyi a bináris értéke...”

... abból is csak 8 bit kerül a w-be.
(#) MPi-c válasza Attila86 hozzászólására (») Dec 21, 2009 /
 
Ahogy watt irta adatlapban. Az MPLAB helpjében is benne van: PIC18Config Settings. Figyelj oda, mert nálad 'FOSC' van (még a kommentben), de ez nem lesz jó!
(#) Attila86 válasza MPi-c hozzászólására (») Dec 21, 2009 /
 
Betettem ezt a sort:
Idézet:
„config OSC = INTIO67”

Így már világítanak a LED-ek. A gond az, hogy RC6, RB6 és az RD4, RD5, RD6 kivételével az összes. (Az utolsó három nem is baj, mert azokat bemenetre állítottam.)
Igyekszem rájönni miért...

Szerk.:

Meg is van: törölni kellett az összes portot (clrf LATA, clrf LATB stb...)
(#) MPi-c válasza Attila86 hozzászólására (») Dec 21, 2009 /
 
Idézet:
„Meg is van: törölni kellett az összes portot”

de... az adatlapban minden egyes port beállításáról egy rövid példa kód is látható assemblerben... :nezze:
(#) icserny hozzászólása Dec 21, 2009 / 4
 
Egy újszülöttnek minden C18 értékadás új! Most olvastam a Microchip egyik fórumán, hogy kér 8 bites szám 16 bites szorzatát így lehet legegyszerűbben eltárolni:
  1. #include <p18cxxx.h>
  2. unsigned int c;
  3. unsigned char a,b;
  4. void main(void){
  5. c = (a*b,PROD);
  6. }


A sima c = a*b hatására csak az alsó 8 bit tárolódna el, így meg mind a 16 bit.
(#) Norberto válasza Ktulu hozzászólására (») Dec 21, 2009 / 1
 
No meg az sem szerencsés, hogy a movlw parancs van mindhárom sorban, így a TRISA és TRISB regiszterekbe az égvilágon nem töltődik semmi új.
(#) lidi válasza icserny hozzászólására (») Dec 21, 2009 /
 
Hát ez aztán érdekes.

HI-Tech nél elég ha így írom:

  1. unsigned char aa,bb;
  2. unsigned int cc;
  3.  
  4. aa=128;
  5. bb=128;
  6.  
  7. cc=aa*bb;
(#) valaki2 hozzászólása Dec 21, 2009 /
 
Hardveres SPI kommunikációval lenne gondom:S

Tegyük fel, hogy van egy PIC, ami master, és van még 2 slave.

Az 1. slave küld a masternek. De a a master honnan tudja, hogy melyik slavetől kap??

Ugye, ha a master küld, akkor ss-l kitudom választani, h melyik slavenek mennyen.

Masternél, vétel esetén is az ss-l kell kiválasztani a slavet? Ha igen, akkor honnan tudom, h melyek slave kell??
(#) icserny válasza valaki2 hozzászólására (») Dec 21, 2009 / 1
 
Az SS jelentése Slave Select (szolga kiválasztása). Master üzemmódban nem játszik szerepet. Mindkét slave-hez kell egy-egy kimenő bitet rendelni, amin keresztül megkapják a SEL jelet. Azt neked kell tudni, hogy éppen melyiket aktiválod. Ebből derül ki, hogy ki küldi az adatot...
(#) trudnai válasza Attila86 hozzászólására (») Dec 21, 2009 / 1
 
Idézet:
„movlw TRISA”


Nem hiszem, hogy ezt akarnad! Mar nem eloszor latok hasonlo hibat abban amit csinalsz, talan ez segit, hogy megjegyezd az utasitasokat:

1. Az utasitas 3 betu. MOV(lw) MOV(wf) MOV(f)

2. A kovetkezo betu(k) azt jelzik honnan hova...
mov(LW) => MOVe Literal to Wreg...
mov(WF) => MOVe Wreg to File...
mov(F),W => MOVe File to Wreg...
mov(F),F => MOVe File to File...

Ha igy gondolsz az utasitasokra akkor talan nehezebben rontod el.
(#) valaki2 válasza icserny hozzászólására (») Dec 21, 2009 /
 
Azthiszem értem. Köszönöm.
(#) watt válasza Attila86 hozzászólására (») Dec 21, 2009 /
 
Felteszed a jelenlegi verziót élve boncolásra?
(#) valaki2 hozzászólása Dec 21, 2009 /
 
Tudna valaki segiteni? Elakadtam:S

Még mindig SPI. Itt egy program részlet. Azt szeretném megvalósitani, hogy main-ből meghivom az SPI_kuld függvényt, ami az spi_vett_buffer -be letárolja az infot. Ez egy 4 elemű tömb. Azt szerettem volna megcsinálni, hogy globális változóként létrehozom a tömböt és a mútatóját. Így a függvény futásakor a tömböt feltudnám tölteni. A gondom az, hogy a forditom hibát jelez, nem ismeri fel a tömbös cuccokat. A deklarációját elhelyeztem már a main előtt is, meg a main első utasitásaként is, de így se volt jó.

Mi lehet a baj??Nekem fogalmam sincs:S

Program :

  1. void main (void )
  2. {
  3.  
  4. int spi_kuld_buffer[SPI_KULD_TOMB];
  5. int *spi_kuld_buffer_m;
  6.  
  7. int spi_vett_buffer[4];
  8. int *spi_vett_buffer_m;
  9.  
  10. SPI_kuld();
  11.  
  12. }
  13.  
  14.  ő pedig az SPI.h -ben van.
  15.  
  16. //=====================================
  17. //                                                                      SPI küldés
  18. //=====================================
  19. /*
  20. SLAVE: a hívó függvényben CS néven hivatkozok rá. Pl. CS = 1
  21.         1: CS=0=> RC0->VS XCS
  22.         2: CS=1=> RC1->SD CS
  23.  
  24. */
  25. void SPI_kuld (void )
  26. {
  27.         unsigned char i,elso;
  28.        
  29.         OpenSPI (       SPI_FOSC_16,
  30.                                 SPI_FOSC_TMR2,
  31.                                 SPI_SSOF,
  32.                                 MODE_00,
  33.                                 SMPEND);
  34.  
  35.         //while(!DataRdySPI());                                                
  36.        
  37.         elso=0x00;                             
  38.         spi_kuld_buffer_m = spi_kuld_buffer;
  39.  
  40.                                                
  41.         for (i=1; i<=SPI_KULD_TOMB; i++)
  42.         {
  43.                 elso++;                                                                                 //ha első kör van, nem növeli a mutatót, egyébb esetben igen
  44.                 if (elso!=1)
  45.                 {
  46.                         spi_kuld_buffer_m++;
  47.                 }
  48.                 WriteSPI(*spi_kuld_buffer_m);
  49.         }      
  50.                                                                                                         //buffer törlése, ha kell?
  51.         spi_kuld_buffer_m = spi_kuld_buffer;
  52.         for (i=1; i<=SPI_KULD_TOMB;i++)
  53.         {
  54.                 *spi_kuld_buffer_m = 0x00;
  55.                 spi_kuld_buffer_m++;
  56.         }
  57.  
  58.         CloseSPI();
  59.  
  60. }
(#) Attila86 válasza trudnai hozzászólására (») Dec 21, 2009 /
 
Trudnai, Watt!

Ha tapipadozok, akkor hajlamosabb vagyok a CTRL+C és CTRL+V használatára. Ezt valahonnan másoltam és elfelejtettem átírni. De mondom, azóta megoldottam és megy tök jól a kis negyven lábú 18f4520-am! Már írtam is egy programocskát ami lekezeli a 4*3-as tasztatúrát és a lenyomott gombok szerint kapcsolja be a LED-eket. Bár még van egy kis szépséghibája aminek oka szerintem a PIC magas frekvenciájában és a nyák huzalozásában keresendő...
Holnap már ha minden jól megy akkor LCD kijelzőt fogok működtetni.
(#) trudnai válasza valaki2 hozzászólására (») Dec 21, 2009 /
 
A tombot rakd ki globalisba, a pointer pedig nyugodtan lehet lokalis, de ne a main lokalisa legyen, hanem az SPI_kuld-e. Amugy jobban jarsz akkor is vagy static vagy meg inkabb ha overlay starolasi osztalyt adsz meg ezeknek a mutatoknak.

Amugy az SPI_kuld fuggveny deklaracioja vagy legyen main elott, vagy ha igy van mogotte, akkor egy definiciot adj meg a main elott...

Ja, es ha hiba uzenet van, akkor majd azt is idezd be, mert en most itt csak ugy hasamra utve valaszoltam
(#) potyo válasza Attila86 hozzászólására (») Dec 21, 2009 /
 
A nyák huzalozása szerintem nem játszik szerepet. A PIC frekvenciája igen, de annyit súgok, hogy nem a frekvencia csökkentése a megoldás
(#) watt válasza Attila86 hozzászólására (») Dec 21, 2009 /
 
Ezt örömmel hallom! Látod megy ez! Nagyon nehezen álltál neki, pedig én tudtam, hogy kirázod a kisújjadból az alapokat. Sok sikert a továbbiakra is és jó szórakozást!

Ja igen, most jön majd a megszakítások megismerése, és az abból való kezelése a különböző időzítést igénylő dolgoknak, mint pl. a gombkezelés, kijelzés, stb. stb.
(#) valaki2 válasza trudnai hozzászólására (») Dec 21, 2009 /
 
Még mindig nem jó. Nem látja az SPI_KULD_TOMB -t. Lehet, hogy annak nem jó a láthatósága?

Executing: "C:\mcc18\bin\mcc18.exe" -p=18F45J10 "main.c" -fo="main.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
D:\Szakdolgozat\Progi\szakdoga\InitSPI.h:54:Error [1105] symbol 'spi_kuld_buffer' has not been defined
D:\Szakdolgozat\Progi\szakdoga\InitSPI.h:54:Error [1131] type mismatch in assignment
D:\Szakdolgozat\Progi\szakdoga\InitSPI.h:57:Error [1105] symbol 'SPI_KULD_TOMB' has not been defined
D:\Szakdolgozat\Progi\szakdoga\InitSPI.h:67:Error [1105] symbol 'spi_kuld_buffer' has not been defined
D:\Szakdolgozat\Progi\szakdoga\InitSPI.h:67:Error [1131] type mismatch in assignment
D:\Szakdolgozat\Progi\szakdoga\InitSPI.h:68:Error [1105] symbol 'SPI_KULD_TOMB' has not been defined
Halting build on first failure as requested.

Progi:

  1. int spi_kuld_buffer[SPI_KULD_TOMB];
  2. int spi_vett_buffer[4];
  3.  
  4.  
  5. //=====================================
  6. //                                                                      MAIN
  7. //=====================================
  8.  
  9.  
  10.  
  11. //int *spi_vett_buffer_m;
  12.  
  13. void main (void )
  14. {
  15.  
  16. int spi_kuld_buffer[SPI_KULD_TOMB];
  17. int *spi_kuld_buffer_m;
  18.  
  19. int spi_vett_buffer[4];
  20. int *spi_vett_buffer_m;
  21.  
  22. SPI_kuld();
  23.  
  24. }
  25.  
  26.  
  27.  
  28.  
  29. //=====================================
  30. //                                                                      SPI küldés
  31. //=====================================
  32. /*
  33. SLAVE: a hívó függvényben CS néven hivatkozok rá. Pl. CS = 1
  34.         1: CS=0=> RC0->VS XCS
  35.         2: CS=1=> RC1->SD CS
  36.  
  37. */
  38. void SPI_kuld (void )
  39. {
  40.         unsigned char i,elso;
  41.         overlay int *spi_kuld_buffer_m;
  42.        
  43.         OpenSPI (       SPI_FOSC_16,
  44.                                 //SPI_FOSC_TMR2,
  45.                                 //SLV_SSOFF,
  46.                                 MODE_00,
  47.                                 SMPEND);
  48.  
  49.         //while(!DataRdySPI());                                                
  50.        
  51.         elso=0x00;                             
  52.         spi_kuld_buffer_m = spi_kuld_buffer;
  53.  
  54.                                                
  55.         for (i=1; i<=SPI_KULD_TOMB; i++)
  56.         {
  57.                 elso++;                                                                                 //ha elso kör van, nem növeli a mutatót, egyébb esetben igen
  58.                 if (elso!=1)
  59.                 {
  60.                         spi_kuld_buffer_m++;
  61.                 }
  62.                 WriteSPI(*spi_kuld_buffer_m);
  63.         }      
  64.                                                                                                         //buffer törlése, ha kell?
  65.         spi_kuld_buffer_m = spi_kuld_buffer;
  66.         for (i=1; i<=SPI_KULD_TOMB;i++)
  67.         {
  68.                 *spi_kuld_buffer_m = 0x00;
  69.                 spi_kuld_buffer_m++;
  70.         }
  71.  
  72.         CloseSPI();
  73.  
  74. }
(#) trudnai válasza valaki2 hozzászólására (») Dec 21, 2009 /
 
1. A legelejen kellene definialnod azt a szerencsetlen SPI_KULD_TOMB-ot, pl:

#define SPI_KULD_TOMB 4


2. A main-bol vedd ki azokat a tomboket es pointereket. Tudom, hogy csak kiserletezel es azert maradt benne, de nagyon zavaro igy


3. overlay int *spi_kuld_buffer_m; -- ez igy nem jo, ezert van az "InitSPI.h:54:Error [1131] type mismatch in assignmen" uzenet...

Helyette "int overlay *spi_kuld_buffer_m;" kellene, de ha nem megy egyenlore vedd ki, nem oszt nem szoroz, csak max hoszabb lesz a kod...
(#) kisszee válasza valaki2 hozzászólására (») Dec 21, 2009 /
 
Feltételezem azért, mert az SPI_KULD_TOMB nincs is deklarálva, nincs adva neki típus sem.

Nem vagyok benne biztos, hogy ez a tömb deklaráció helyes -e ezáltal. Gondolom így nem tudja értelmezni a tömb méretét.

ui.: A kódot szerintem inkább csatold, mert (lehet, hogy csak nálam) de írtó mód "széthúzza" az oldalt (ha ez csak nálam történt meg, akkor elnézést).
(#) Attila86 válasza potyo hozzászólására (») Dec 21, 2009 /
 
Hangyányi időzítéseket tettem be a sorok közti váltások közé, így már majdnem tökéletesen működik. A baj akkor van ha egy sor mindhárom gombját lenyomom, mert akkor csak a középsőt és a jobboldalit érzékeli.
De rájövök miért...
(#) valaki2 hozzászólása Dec 21, 2009 /
 
1) igen az definiálva is van, csak lemaradt
#define SPI_KULD_TOMB 4
2)kivettem
3)cseréltem - nem jó
kivettem overlay- t, csak int *spi_kuld_buffer_m;
így se jó


kisszee

Nálam is széthúzza, legközelebb csatolom.
(#) valaki2 hozzászólása Dec 21, 2009 /
 
Érdekes

Létrehoztam egy új projektet. Ha a függvényt a main.c -be helyezem el (ekkor #include van és #include "spi_adas_vetel.h" nincs) akkor lefordul hibátlanul.

Ha áthelyezem a függvényt az spi_adas_vetel.h -be, (ekkor #include van ebbe és az #include "spi_adas_vetel.h" pedig a main.c -be) akkor lefordul hibátlanul.
Ekkor hibát jelez a függvény végét jelentő }-jelnél.

D:\kommunkikacio\spi_adas_vetel.h:52:Error: syntax error

Szerintem mára már eléggé lefáradtam

Az előbb rosszul csatoltam afájlt
Már jó.
(#) m.joco hozzászólása Dec 21, 2009 /
 
Hello
Egy picben engedélyezem az INT lábon a megszakítást felfutó élre, majd magas szintre kapcsolom azt a lábat, akkor megszakítás jön létre. Az INT lábat továbbra is magas szinten hagyom, ezután lekezelem a megszakítást, de mikor a program visszatér a főprogramba, akkor újra megszakítás fog generálódni, vagy csak akkor, ha alacsonyra húzom, majd ismét magasra az INT lábat?
Üdv.
(#) potyo válasza m.joco hozzászólására (») Dec 22, 2009 /
 
Idézet:
„de mikor a program visszatér a főprogramba, akkor újra megszakítás fog generálódni, vagy csak akkor, ha alacsonyra húzom, majd ismét magasra az INT lábat?”


Idézet:
„Egy picben engedélyezem az INT lábon a megszakítást felfutó élre


Ha felfutó élre engedélyezted, akkor csak felfutó élnél keletkezik megszakítás, állandó magas jelnél nem.
Következő: »»   626 / 1319
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