Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   140 / 153
(#) Hp41C válasza Zsiroskenyer hozzászólására (») Júl 29, 2018 /
 
Az a trend Microchip -éknél, hogy vegyél új gépet, sok9 memóriával, legyen sok türelmed a legkisebb feladatokhoz is.
(#) usane hozzászólása Aug 14, 2018 /
 
Üdv!

Van egy csomó tömböm amik különböző méretűek. Szám szerint 60db, 6x4 byte és 11x4 byte között mozog.
Vagy mondhattam volna úgy is, hogy kétdimenziós tömbök amiknek az egyik dimenziója mindegyikben 4, de ez szerintem most nem fontos, a lényeg, hogy egy-egy ilyen tömböt egy blokként akarok majd kezelni.

pl:
  1. t1[24] = {1,2,3,...};  
  2. t2[44] = {............};  /ha egydimenziósként kezelem őket
  3. .
  4. .
  5. t60
  6.  
  7. t1[6,4] = {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},};
  8. t2[11,4] = {{1,2,3,4},....};  /ha kétdimenziósként kezelem őket
  9. .
  10. t60

Legyen mondjuk a második verzió. Na most ezeket szeretném újabb "tömbbe" rakni, hogy egy ciklusban egymás után elérhessem őket. Mivel az egyik dimenziójuk nem egyforma hosszú ezért ez problémás.
Mi erre a lejobb megoldás?
A hozzászólás módosítva: Aug 14, 2018
(#) pipi válasza usane hozzászólására (») Aug 14, 2018 /
 
Minden tömb első két eleme a dimeziója...
(#) usane válasza pipi hozzászólására (») Aug 14, 2018 /
 
Ne haragudj, de nem igazán értem ezzel mire akarsz kilyukadni. Kifejtenéd?
Szerk: Bár van egy sejtésem.
A hozzászólás módosítva: Aug 14, 2018
(#) pipi válasza usane hozzászólására (») Aug 14, 2018 /
 
Én úgy értelmeztem a ciklusodban tudnod kellene a tömb dimenzióját, mert kölönbozőek...
Szóval ha beteszed minden tömböd első két elemébe a méretét akkor a ciklusban kiolvasod, és már tudod is a tomb méretét
(#) usane válasza pipi hozzászólására (») Aug 14, 2018 /
 
Vagy én értelek félre vagy te engem.
Minden tömb mérete ismert. A baj az, hogy nem egyformák, így nem tudom még egy dimenzióba rakni, hogy pl 3 egymásba ágyazott ciklusban el tudjam őket érni. Az egészet ki akarom küldeni SPI-re majd. Viszont támadt egy ötletem, nem biztos, hogy a legjobb, lehet, hogy csak bonyolítom, de ha mindegyik tömbböt a maximális méretbe rakom, és az első elembe az eltérő dimenziókat írom be, és az a ciklus csak az első elemben tárolt értékig fog futni.
Vagy még valami tömbstruktúrán gondolkodom, de azt nem tudom hogy lenne a legjobb.

szerk: Ehh, fáradt vagyok. Ugyanezt írtad le kb.
A hozzászólás módosítva: Aug 14, 2018
(#) pipi válasza usane hozzászólására (») Aug 14, 2018 /
 
A tombjeid elejébe beleteszed az aktuális tömb hosszát.
Csinálsz egy egydimenziós tömbre mutató pointert.
Csinálsz egy fő tömböt, ami tartalmazza a különboző tömbjeid kezdőcímét.
A ciklusodban a pointerbe fő tömb következő eleméből kikapod a tömb kezdőcímét, első elem a méret, és mehet az SPIre a megadott számú sorozat...
(#) oregharcos hozzászólása Szept 16, 2018 /
 
Sziasztok!
Egyszerű villogót szerettem volna csinálni PIC12675-ös PIC-el.
A nyomógomb kezelésre próbáltam több megoldást keresni, de nem jön össze.
Kérlek benneteket, hogy segítsetek, hogy hogyan csináljam, hogy működjön?
Segítséget előre is nagyon köszönöm!
  1. //Egyszerű villogó PIC12F675-el, gombnyomásra indul.
  2. //a progaramot mikroC PRO for PIC v:6.00-val készítettem.
  3.  
  4. void main() {
  5.  
  6.         TRISIO = 0b00001000; //Csak a GP3 bemenet.
  7.  
  8.         while (1)
  9.        {
  10.        if(GPIO.F3 ! = 1)//Csak akkor indul ha a gomb alacsony szintre kerül.
  11.               {
  12.          GPIO = 0b00000001; // GP0-án magas szint van.
  13.          Delay_ms (500);
  14.          GPIO = 0b00000010; //GP1-en van magas szint.
  15.          Delay_ms (500);
  16.  
  17.    }
  18.   }
  19. }
(#) mate_x válasza oregharcos hozzászólására (») Szept 16, 2018 /
 
Szia!
ANSEL és CMCON regiszter beállítása hiányzik.
(#) oregharcos válasza mate_x hozzászólására (») Szept 18, 2018 /
 
Szia Mate_x!

Köszönöm a segítséget! Nem tudtam hamarabb géphez jönni, ezért elnézést, hogy most válaszolok! Az ANSEL-el már próbálkoztam, majd este még megpróbálom a CMCON-t is. Köszönöm mégegyszer!
(#) Balaa16 hozzászólása Szept 20, 2018 /
 
Üdv!
Egy int16 típusú változót hogyan tudok bitenként összeállítani? Konkrétan a feladat az, hogy a PORTB és PORTC bemenetekre érkező 10 bites számot kell tárolni egy változóban. PORTB-re A0-07-ig PORTC-re pedig a legfelső 2 bit.
Előre is köszönöm a segítséget!
(#) Zsolt2 válasza Balaa16 hozzászólására (») Szept 20, 2018 /
 
Ha csak a ket PORT-ot akarod osszerakni, akkor azt sime bit muvelettel meg lehet oldani.
  1. int16 valtozo;
  2. valtozo = (PORTC & 0b11 << 8) | PORTB //ha a ket felso bit a PORTC also ket bitje

Ha bitenken akarod osszerakni, akkor bitmezot (bitfield) lehet hasznalni, ez viszont kicsit bonyolultabb.
A hozzászólás módosítva: Szept 20, 2018
(#) Balaa16 válasza Zsolt2 hozzászólására (») Szept 20, 2018 /
 
Köszönöm a válaszod! Utánanéztem a bitműveleteknek, így már érthető a kód.
(#) Hp41C válasza Zsolt2 hozzászólására (») Szept 20, 2018 /
 
Használjatok u n i o n -t a sok felesleges kód helyett.
Sajnos a fórum motor nem engedi ezen C nevet egyben leírni.... Miért???

  1. typedef un_ion _INT_VAL
  2. {
  3.     int Val;
  4.     struct
  5.     {
  6.         unsigned char LB;
  7.         unsigned char HB;
  8.     } bytes;
  9. } INT_VAL;
  10.  
  11. INT_VAL valtozo;
  12. int feldolgoz;
  13. valtozo.bytes.LB=PORTB;
  14. valtozo.bytes.HB=PORTC & 3;
  15.  
  16. feldolgoz = valtozo.Val;


Az első sorból az "_" karakter törlendő!
A hozzászólás módosítva: Szept 20, 2018
(#) oregharcos válasza mate_x hozzászólására (») Szept 21, 2018 /
 
Sziasztok!
Ahogy időm engedi próbálkozok ezzel a kis programmal. Megcsináltam, hogy digitális jelet tudjon fogadni (ANSEL, CMCON). Próbáltam átírni PIC12F629-re is, de újabb hibára áll ki, visszaállítottam 675-re, hiába csinálom nem megy végig, most meg a záró teggel van baja. Vajon mit rontok el?
  1. //Egyszerű villogó PIC12F675-el gombnyomásra indul.
  2. //a progaramot mikroC PRO for PIC v:6.00-val készítettem.
  3. #define nyg GP3
  4.  
  5. void main()
  6. {
  7.  
  8.         TRISIO = 0b00001000; //Csak a GP3 bemenet.
  9.         CMCON = 0;
  10.         //ANSEL = 0b00000000;
  11.         ANSEL = 0x07;
  12.  
  13.         while (1)
  14.        {
  15.        if(nyg !=1 && gp3 ==0)//Csak akkor indul ha a gomb alacsony szintre kerül.
  16.        //if( PORTB.F0 ! = 1)
  17.               {
  18.          GPIO = 0b00000001; // GP0-án magas szint.
  19.          Delay_ms (500);
  20.          GPIO = 0b00000010; //GP1-es magas szinten van.
  21.          Delay_ms (500);
  22.  
  23.    }
  24.   }

Köszönöm a segítségeteket előre is!
A hozzászólás módosítva: Szept 21, 2018
(#) usane válasza Hp41C hozzászólására (») Szept 21, 2018 /
 
Elnézést, de ezt elmagyaráznád nekem?
Mármint, hogy ebből hogy lesz rövidebb kód egy bitshiftelés helyett?
Ezt mire fordítja a fordító?
(#) bbb válasza oregharcos hozzászólására (») Szept 21, 2018 /
 
Mi az az '1' a sor közepén? Ránézésre az okozza a galibádat.
(#) killbill válasza oregharcos hozzászólására (») Szept 21, 2018 /
 
Hianyzik egy }.
(#) icserny válasza oregharcos hozzászólására (») Szept 21, 2018 /
 
PIC12F629-ben nincsen ANSEL.
(#) benjami válasza oregharcos hozzászólására (») Szept 21, 2018 /
 
Sosem használtam mikroC-t, de mi benne a nagy és a kisbetűs GP3 ?
(#) mate_x válasza oregharcos hozzászólására (») Szept 21, 2018 / 1
 
Így próbáld:

  1. //Egyszerű villogó PIC12F675-el gombnyomásra indul.
  2. //a programot mikroC PRO for PIC v:6.00-val készítettem.
  3.  
  4. #define nyg GP3
  5.  
  6. void main()
  7. {
  8.     TRISIO = 0b00001000;
  9.     CMCON = 0b00000111;
  10.     ANSEL = 0;
  11.  
  12.     while (1)
  13.     {
  14.         if(nyg !=1)
  15.         {
  16.                 GPIO = 0b00000001;
  17.                 Delay_ms (500);
  18.                 GPIO = 0b00000010;
  19.                 Delay_ms (500);
  20.         }
  21.      }
  22. }

Megjegyzések:
1:Használj bekezdéseket a kódban, különben bele fogsz keveredni(különösen egy bonyolultabb kódban), hogy hol van zárójel és hol nincs(ahogyan most is lemaradt egy).
2:Ha nem használsz analóg bemenetet akkor az ANSEL-t nullázni kell, így minden láb digitális lesz.
3:CMCON regiszter utolsó 3 bitje 1 legyen, ahhoz, hogy digitálisak legyenek a lábak(adatlap 39. oldal)
4:Az if feltételénél nem igazán értem, hogy ott mit akartál.
(#) oregharcos válasza mate_x hozzászólására (») Szept 21, 2018 /
 
Sziasztok!
Nagyon köszönöm a gyors segítséget Mate-X-nek! Kipróbáltam és így jó lett!!
Igazad van, mert így valóban át lehet látni a program kódot!
Az if-parancsot valóban elszúrtam, az akart lenni amit Te is beírtál, hogy ha a GP3 nem egyenlő eggyel, akkor indul a program. Felcseréltem az ANSEL és a CMCON kódolását is, tehát csináltam pár baklövést. Még egyszer nagyon köszönöm, hogy időt szenteltél rám!
(#) oregharcos válasza icserny hozzászólására (») Szept 21, 2018 /
 
Szia Icserny! Átnéztem a PIC-ek adatlapjait, csupán azért próbáltam 629-es PIC-el, hogy mit szól a compiler az ANSEL-hez. Természetesen hibára lépett, letiltottam utána jött a következő hiba amiben a Mate_X-segített!
Köszönöm a segítséget!
(#) oregharcos válasza killbill hozzászólására (») Szept 21, 2018 /
 
Szia Killbill! Igazad van valóban hiányzott egy záró } elnéztem.
Köszönöm a segítséget!
(#) Hp41C válasza usane hozzászólására (») Szept 22, 2018 / 1
 
A fordító körmére kell nézni: view/disassambling
Az ajánlott, rövid, de nem működő megoldás:
  1. 510:               int valtozo;
  2. 511:               valtozo = (PORTC & 0b11 << 8) | PORTB;
  3.   2032    0E00     MOVLW 0
  4.   2034    1482     ANDWF 0xf82, W, ACCESS
  5.   2036    1081     IORWF 0xf81, W, ACCESS
  6.   2038    6EDE     MOVWF 0xfde, ACCESS
  7.   203A    6ADD     CLRF 0xfdd, ACCESS

A felső byte mindig 0 lesz. A C a legelső paraméter típusának megszelelő műveletekkel végzi el a sor többi műveleteit is.
Ez már jól működik, de hosszú:
  1. 510:               int valtozo;
  2. 511:               valtozo = ((int)(PORTC & 0b11) << 8) | PORTB;
  3.   2032    0E03     MOVLW 0x3
  4.   2034    1482     ANDWF 0xf82, W, ACCESS
  5.   2036    6E4B     MOVWF 0x4b, ACCESS
  6.   2038    6A4A     CLRF 0x4a, ACCESS
  7.   203A    5081     MOVF 0xf81, W, ACCESS
  8.   203C    0100     MOVLB 0
  9.   203E    104A     IORWF 0x4a, W, ACCESS
  10.   2040    6E48     MOVWF 0x48, ACCESS
  11.   2042    C04B     MOVFF 0x4b, 0x49
  12.   2044    F049     NOP
  13.   2046    6EDE     MOVWF 0xfde, ACCESS
  14.   2048    C04B     MOVFF 0x4b, 0xfdd
  15.   204A    FFDD     NOP

  1. 510:               INT_VAL valtozo;
  2. 511:               valtozo.bytes.LB = PORTB;
  3.   2032    5081     MOVF 0xf81, W, ACCESS
  4.   2034    6EDF     MOVWF 0xfdf, ACCESS
  5. 512:               valtozo.bytes.HB = PORTC & 0b11;
  6.   2036    0E03     MOVLW 0x3
  7.   2038    1482     ANDWF 0xf82, W, ACCESS
  8.   203A    6EE7     MOVWF 0xfe7, ACCESS

Ez így mégis rövidebb...
A hozzászólás módosítva: Szept 22, 2018
(#) killbill válasza Hp41C hozzászólására (») Szept 22, 2018 /
 
Az elso programmal az a baj, hogy elobb shiftel, aztan and-el, mivel a << magasabb precedenciaju muvelet, mint az &. Ezert a PORTC-t 0x300-zal and-olja, ami ertelemszeruen 0 lesz. A masodik program nem az (int)-tol jo, hanem a helyes zarojelezestol. Eleve minden char int-re konvertalodik, nem kell kulon kiirni.
(#) Hp41C válasza killbill hozzászólására (») Szept 22, 2018 /
 
  1. 510:               int valtozo;
  2. 511:               valtozo = ((PORTC & 0b11) << 8) | PORTB;
  3.   2032    0E03     MOVLW 0x3
  4.   2034    1482     ANDWF 0xf82, W, ACCESS;    // PORTC
  5.   2036    50F3     MOVF 0xff3, W, ACCESS;
  6.   2038    1081     IORWF 0xf81, W, ACCESS;    // PORTB
  7.   203A    6EDE     MOVWF 0xfde, ACCESS
  8.   203C    6ADD     CLRF 0xfdd, ACCESS

A felső byte ebben az esetben is garantáltan 0 lesz.
A hozzászólás módosítva: Szept 22, 2018
(#) killbill válasza Hp41C hozzászólására (») Szept 22, 2018 /
 
Akkor ez a fordito hibas... Bar, legalabb kiolvassa a PORTC-t, and-olja is 3-mal, csak az eredmenyt nem teszi le 0xfdd-re, pedig azt kellene tennie. Mellesleg az 5. sorban mit csinal?
(#) Hp41C válasza killbill hozzászólására (») Szept 23, 2018 /
 
A fordító nem rossz, csak nem minden kifejezést számol 16 bitesen. Üdvözöllek a Microchip C világában.
(#) killbill válasza Hp41C hozzászólására (») Szept 23, 2018 /
 
Azt hiszem, hogy ez már sokszor volt. Egy C fordító, ami nem tartja be a C nyelv legalapvetőbb szabályait, az vagy rossz, vagy nem C fordító.
Következő: »»   140 / 153
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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