Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   386 / 1210
(#) agressiv válasza agressiv hozzászólására (») Márc 24, 2013 /
 
Nem tudok vele mit kezdeni, alább látható a kijelző programja.

  1. #include <16F877A.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6. #FUSES PUT                      //Power Up Timer
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NODEBUG                  //No Debug mode for ICD
  9. #FUSES NOBROWNOUT               //No brownout reset
  10. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  11. #FUSES NOCPD                    //No EE protection
  12. #FUSES NOWRT                    //Program memory not write protected
  13. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  14.  
  15. #ZERO_RAM
  16.  
  17. #use delay(clock=20000000)
  18. #use i2c(SLAVE, FAST, SDA=PIN_A0, SCL=PIN_A1, ADDRESS=0x10001010, force_hw)
  19.  
  20. int matek;
  21.  
  22. void main()
  23. {
  24.  
  25.    setup_adc_ports(NO_ANALOGS);
  26.    setup_adc(ADC_CLOCK_DIV_2);
  27.    setup_psp(PSP_DISABLED);
  28.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  29.    setup_timer_1(T1_DISABLED);
  30.    setup_timer_2(T2_DISABLED,0,1);
  31.    setup_comparator(NC_NC_NC_NC);
  32.    setup_vref(FALSE);
  33.    output_c(0b00000010);
  34.    output_d(0b00000010);
  35.    I2C_SlaveAddr(0x10001010);
  36.    delay_ms(2000);
  37.    
  38.  
  39. for(;;)
  40.  
  41.   {
  42.    
  43.        
  44.      matek=i2c_read(0);
  45.      
  46.      if (matek==(0b11100000))
  47.      
  48.      {
  49.       output_d(0b11111100);
  50.      }
  51.      
  52.      if (matek==(0b11100001))
  53.      
  54.      {
  55.       output_d(0b01100000);
  56.      }
  57.      
  58.      if (matek==(0b11100010))
  59.      
  60.      {
  61.       output_d(0b11011010);
  62.      }
  63.      
  64.      if (matek==(0b11100011))
  65.      
  66.      {
  67.       output_d(0b11110010);
  68.      }
  69.      
  70.      if (matek==(0b11100100))
  71.      
  72.      {
  73.       output_d(0b01100110);
  74.      }
  75.      
  76.      if (matek==(0b11100101))
  77.      
  78.      {
  79.       output_d(0b10110110);
  80.      }
  81.      
  82.      if (matek==(0b11100110))
  83.      
  84.      {
  85.       output_d(0b10111110);
  86.      }
  87.      
  88.      if (matek==(0b11100111))
  89.      
  90.      {
  91.       output_d(0b11100000);
  92.      }
  93.      
  94.      if (matek==(0b11101000))
  95.      
  96.      {
  97.       output_d(0b11111110);
  98.      }
  99.      
  100.      if (matek==(0b11101001))
  101.      
  102.      {
  103.       output_d(0b11110110);
  104.      }
  105.  
  106.      if (matek==(0b11010000))
  107.      
  108.      {
  109.       output_c(0b11111100);
  110.      }
  111.      
  112.      if (matek==(0b11010001))
  113.      
  114.      {
  115.       output_c(0b01100000);
  116.      }
  117.      
  118.      if (matek==(0b11010010))
  119.      
  120.      {
  121.       output_c(0b11011010);
  122.      }
  123.      
  124.      if (matek==(0b11010011))
  125.      
  126.      {
  127.       output_c(0b11110010);
  128.      }
  129.      
  130.      if (matek==(0b11010100))
  131.      
  132.      {
  133.       output_c(0b01100110);
  134.      }
  135.      
  136.      if (matek==(0b11010101))
  137.      
  138.      {
  139.       output_c(0b10110110);
  140.      }
  141.      
  142.      if (matek==(0b11010110))
  143.      
  144.      {
  145.       output_c(0b10111110);
  146.      }
  147.      
  148.      if (matek==(0b11010111))
  149.      
  150.      {
  151.       output_c(0b11100000);
  152.      }
  153.    }
  154.   }


Megköszönném, ha valaki tudna szolgálni valami épkézláb evilág magyarázattal.
(#) kissi válasza potyo hozzászólására (») Márc 24, 2013 /
 
A 'de' az szerintem az EEPROM-ba tud tenni adatot !
A hozzászólás módosítva: Márc 24, 2013
(#) kissi válasza bbalazs_ hozzászólására (») Márc 24, 2013 /
 
Gondolom 18-asról van szó... Itt a programmemória 2 byte-os --> word egységekből van kialakítva, ide nem tudsz úgy adatot tenni, hogy "elfelezed" a fizikai egységeket !
Steve
(#) agressiv válasza agressiv hozzászólására (») Márc 24, 2013 /
 
Elméletileg a poll megoldaná a dolgot, de a fordító azt mondjra rá, hogy undefined dentifier.. Ez most mi, benne van a doksiban, hogy mir ejó, hogy kell használni séa fordítónak fogalma sincs róla, hogy mi az... Valaki mondjon már valamit... Megőrjít ez a gagyi program.
(#) kissi válasza agressiv hozzászólására (») Márc 24, 2013 /
 
A 'poll', azaz a 'polling' az azt jelenti, hogy folyamatosan lekérdezed, azaz nem megszakítással szolgálod ki, hanem "folyamatos figyeléssel"! Ez nagyon erőforrás pazarló, ritkán van ennyi felesleges idő egy komolyabb projektben !
Steve
(#) agressiv válasza kissi hozzászólására (») Márc 24, 2013 /
 
Akkor ez nem az amit én akarok. Ettől még továbbra sem értem, hogy a frászba lehet az, hogy a fordítónak fogalma sincs róla, hogy mi az...

Ha meg van adva, hogy a slave cuccnak mi a címe, akkor miért reagál mindenre? Egyszerűen olyan ez a fordító, mintha a fele nem működne, vagy nem érdekelné, hogy mit ír bele az ember. Nem tudom mit kezdjek már vele, teljesen nonszensz ahogy viselkedik az egész. Gondoltam kipróbálom a mikroC-t erre még a szöveg hátterét sem állítja át a sötétzöld betű elég nehezen olvasható feket hátteren. Őrület.
(#) kissi válasza agressiv hozzászólására (») Márc 24, 2013 /
 
A mikroC-t elég sokan használják ( én nem! ), így alapvető hibái nem hiszem, hogy lennének, legfeljebb még nem ismerted meg eléggé és nem jól közlöd vele, hogy " mit Te akarni" !
Steve
(#) kissi válasza kissi hozzászólására (») Márc 24, 2013 /
 
Bocs, a 'poll' nem 'pull' akart lenni, azaz felhúzó ellenállás ?!
Steve
szerk.: ezt 'agressiv' kollégának szántam !
A hozzászólás módosítva: Márc 24, 2013
(#) agressiv válasza kissi hozzászólására (») Márc 24, 2013 /
 
Nem. Az más.
A hozzászólás módosítva: Márc 24, 2013

nyomorek.jpg
    
(#) kissi válasza agressiv hozzászólására (») Márc 24, 2013 /
 
Ez egy függvény, amit ha meghívsz, akkor a visszatérési érték alapján el tudod dönteni, hogy van-e beérkezett adatod, kell-e kiolvasni ( ha ritkán hívod meg, akkor "ráfutás" következhet be, ha sűrűn, akkor erőforrás pocsékolás az előzőekben leírtak szerint ) !
Steve
(#) bbalazs_ válasza kissi hozzászólására (») Márc 24, 2013 /
 
Koszi mindenkinek, de sajnos nem valt be egyik sem.
A de es a db tok ugyanazt csinalja. A de ugyanugy mukodik a kodteruleten is. Vesszovel a vegen sem javul.
A dt pedig ugye a tablazat, tehat az RETLW-kkel pakolja tele minden masodik byteot.

A rohadt c persze meg tudja csinalni siman...

most azon filozom, hogy forditas kozben lehet-e procit valtani, mert hatha valami regi 16-os neveben jol csinalna...
(#) Hp41C válasza bbalazs_ hozzászólására (») Márc 24, 2013 /
 
Szia!
Sehogy... Használj páros számú byte megadást és írd át a kommentet...
(#) agressiv válasza kissi hozzászólására (») Márc 24, 2013 /
 
Úgy néz ki, most jó. Külön veszem az adatot és két változóba tárolom a két számjegyhez, valószínűleg túl sokáig foglalta le a buszt, ha van ilyen egyáltalán, viszont kétszer kell elküldeni. Ami úgy van megoldva, hogy egyszer a hangerőszabályzónak megy az érték, egyszer pedig direkt a slave piknek címezve, de mind a kettőt veszi, mert nem különösebben érdekli, hogy kinek van címezve az adat... És a küldések között egy ack-nyi késleltetést kellett berakni a meghajtó program részéről, különben megintcsak meghűlyül az egész. Ez mind teljesen véletlenül jött így össze és közben húsz évet öregedtem. Az ack-t szívesen fogadnám, mert küldi a hangerő IC, de ha beírom a programba szokásos undefined identitfier fogad, szóval több sebből vérzik ez az egész,de már nemérdekel, legalább azt csinálja, amit szerettem volna.

Isten áldja a cél IC-ket.
(#) bbalazs_ válasza Hp41C hozzászólására (») Márc 24, 2013 /
 
De ha lehetne, kozel 500 sort nem szivesen irnek at. Csak KELL lennie valami megoldasnak.
A c siman megcsinalja. Egyebkent a forditoban lehet a hiba, mert megcsinaltam 10f206-ra, 16f628a-ra is es teljesen ugyanaz. Valamiert a sor vege miatt wordon kezd mindig.
Nem lehet valami NOALIGN parametert megadni? (neten mar kerestem, de nem foglalkoznak a problemaval.
(#) kissi válasza bbalazs_ hozzászólására (») Márc 24, 2013 /
 
De mit értesz azon, hogy a 'C' simán megcsinálja ?! Valamit neki is tenni kell oda, mutasd már meg, hogy mit szeretnél ( és milyen PIC-en ?!) !
(#) bbalazs_ válasza kissi hozzászólására (») Márc 24, 2013 /
 
A 'c' alatt az mplab fejlesztorendszer C18-as reszet ertem.
Eredetileg egy c progit (USB HID joy kezeles) irok at assemblyre. Minimalisan ertem a c-t, valami strukturakat definial, de siman ott vannak egymas mogott a byteok a forditott hexben. Nagyon sok descriptortabla van igy odarakva es ezeket szeretnem az asm-be betenni. Fontos, hogy pl. egy cim vagy hossz ne egy masik felword utan jelenjen meg nekem a listaban.

Egyszeruen nem tudom elkepzelni, hogy egy ilyen egyszeru problemara nincs megoldas...
Regen, amikor meg nem hasznalt mindenki c-t, akkor is valahogyan ezt meg kellett oldani...

Esetleg valami regebbi mpasm?
(#) kissi válasza bbalazs_ hozzászólására (») Márc 24, 2013 /
 
18-as PIC-nél egy-egy programmemória rekesz MINDIG páros számon kezdődik ( 2 byte-os egységeket alkotva!) ! Nem tudok úgy adatokat belerakni, hogy nem töltöm fel mind a két byte-ot, mindig lesz ott valami a másik byte-on is ( legfeljebb 0 ! ) ! Ezért nem értem, hogy mire mondod, hogy bezzeg a C meg tudja oldani és ezért kértem, hogy mutasd meg ( pl. kép! )!
HP41C kolléga is írta, hogy használj páros számú megadást, pl. a nem használt részre tegyél '0'-t !
Steve
(#) agressiv hozzászólása Márc 24, 2013 /
 
Egy utolsó kérdés. Hogy tudnám azt megoldani, hogya számláló lemenjen nulláig, de ne is akadjon ki, mert akkor nagy dráma van. Most őgy áll a dolog, hogy csak -1dB-ig lehet szabályozni, nulláig nem. Hogy lehetne azt kimatekozni, hogy megálljon a nullánál?

Jelenlegi megoldás.

  1. if(matek>79)
  2.                 {
  3.                    matek=79;
  4.                 }
  5.                
  6.                             if(matek<1)
  7.                 {
  8.                    matek=1;
  9.                 }
A hozzászólás módosítva: Márc 24, 2013
(#) agressiv válasza (Felhasználó 15355) hozzászólására (») Márc 24, 2013 /
 
Igen, de ha továbbtekerem, akkor lemegy fogalmam sincs hova és meghűlyül a dolog. De most gondolkodok azon, hogy egyszerűen 1 és 80 között számoltatok és kijelzés, illetve adatküldés előtt kivonok a matekból egyet.
(#) bbalazs_ válasza kissi hozzászólására (») Márc 24, 2013 /
 
Ne bonyolodjunk bele ilyen melyen, nem errol van szo.
A lenyeg, hogy nem tudja folytatni egy UJ SOR eseten az adatmemoriat. Ez a bajom.
Tehat nem tudom bytekent kezelni.
Az ertheto, hogy egy program eseten mindig paros szamrol indul.
A PICet belul LEHET bytekent kezelni, gondolj csak a TABLAT utasitasra, ami felvehet paratlan erteket is.
A bajom a forditoval van, ami nem erti, hogy ha volt egy cim, ahol abbahagyta, akkor az uj pontot onnan folytassa a KOVETKEZO SORTOL.
Miert tudja megtenni akkor, ha azt irom, hogy db 1,2,3,4,5,6,7,8 Ilyenkor gyonyoruen PONT azt csinalja, amit akarok, tehat akarhany bajt eseten folytatja a hi/low ordernek megfeleloen. De ahogy vege a sornak, kiegesziti wordre. Ez paratlan szamu byte eseten gond.

A C forrast most nem tudom beidezni (cegnel van en meg otthon vagyok), de barmelyik USB-s forrast megnezed, a descriptor tablak igy vannak leirva.
(#) agressiv válasza agressiv hozzászólására (») Márc 24, 2013 /
 
És így jó is. Amikor számolja az értékeket a kijelzéshez kivonok belől egyet, majd utána hozzáadok egyet és meg is van.
(#) zoox hozzászólása Márc 24, 2013 /
 
Sziasztok.

PIC18F4550 CCSC hogyan lehet aktiválni a pullup funkciot az RB0-RB7-ig mert csak az RB2-RB7 -ig sikerült
#define NO_ANALOGS //minden benemet digitális I/O
set_tris_b(0b11111111);//minden bemenet
port_b_pullups(0xff); //minden bemeneten aktiv a PULLUP

és a RB0 és RB1 bemenet csak lebeg és nem akarja bekacsolni a felhuzó ellenállást.Sajnos az adatlapon már nincs a portokról részletes kapcsolási rajz mint a 16F-eknél és nem találom hogy melyik reget kellene még beállitani.Ezek még beleszolnak ha IN az I/O INT0 FLTO SDI SDA de nem látom hogy még mit kellene kikapcsolnom
Elöre is köszi.
(#) agressiv válasza (Felhasználó 15355) hozzászólására (») Márc 24, 2013 /
 
Akkor már a rotary érzékelésébe kellene belehekkerkedni a dolgot és nem merek belenyúlni. Nem lényeg, most jó így, felmegy 0-ig és 79-ig is, nincs vele gond.
(#) kissi válasza bbalazs_ hozzászólására (») Márc 24, 2013 /
 
Akkor így csináld !
  1. packed code_pack kezdőcím
  2. db 0x20,0x21,0x22
  3. db 0x23
(#) Hp41C válasza bbalazs_ hozzászólására (») Márc 24, 2013 /
 
Szia!
A C fordítóknak a minimális egysége egy C utasítás, deklaráció stb. Ezeket ez egységeket egyben kezeli. Ha egy rom területre szóló deklaráció páratlan számú byte -ot tartalmaz, a C által fordított kódban is kiegészítődik párosra egy 0 -val. Annál is inkább, mert a C is assembly -re fordít, csak nem látszik...
Az assembly meg ilyen... Egy sor egy egység. Ha páratlan számú byte -ot írsz elő a program területre, kiegészíti párosra. Hiába erőlködsz... A következő sor lehetne akár utasítás is, ott nem lehet páratlan címmel kezdeni...
A hozzászólás módosítva: Márc 24, 2013
(#) kissi válasza Hp41C hozzászólására (») Márc 24, 2013 /
 
Szerintem nézd meg az előző hozzászólásomat, létezik rá fordítói direktíva assemblerben ( én sem használtam még ,most kerestem rá a help-ben! ), úgy látom azt csinálja, amit akart a kolléga !
Steve
szerk.: hiszen itt csak a fordítónak kell figyelembe venni, hogy mit akarok, nem kell megerőszakolni a hardware-t !
A hozzászólás módosítva: Márc 24, 2013
(#) bbalazs_ válasza kissi hozzászólására (») Márc 24, 2013 /
 
koszi, hogy fogalalkozol a bajommal, de

Egyik esetben adja, hogy tul hosszu utasitas es levagta a felesleges reszt (2 byteon tuli reszt)

A masik esetben:
Error[149] : Directive only allowed when generating an object file

En egy lepesben szoktam letrehozni a HEX filet, nem hasznalok linkert.
Kellene?
(#) bbalazs_ válasza Hp41C hozzászólására (») Márc 24, 2013 /
 
Mondjuk ettol feltem, mert ezzel nem lehet vitatkozni, nincs kibuvo alola:
hogy 'ez ilyen'.

Eddig a pic programozot nekem kellett megirni, mert ugyanezzel szembesultem.
Assemblert nem nagyon akarok irni...de ha kell, hat kell.
(#) kissi válasza bbalazs_ hozzászólására (») Márc 24, 2013 /
 
Jellemzően én is abszolut kódban programozok, de ( szerencsédre ? ) ezt most pont egy relokálhatóba írtam be és én úgy látom, hogy ott jól működik!
Steve
A hozzászólás módosítva: Márc 24, 2013
(#) bbalazs_ válasza kissi hozzászólására (») Márc 24, 2013 /
 
OK, errol irnal nekem bovebben?
Ahogy lattam, az org helyett kell code-ot irni.

De ebbol hogyan lesz fizikai memoriacim?
Tehat nekem az kellene, hogy az adattablak 0x0100, a kod pedig 0x0400 cimen kezdodik


Illetoleg latom, ott a codepack vegen de akkor mitol relokalhato, ha megadod a cimet?
A hozzászólás módosítva: Márc 24, 2013
Következő: »»   386 / 1210
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