Fórum témák

» Több friss téma
Fórum » PIC programozás
 
Témaindító: G-Lex, idő: Okt 24, 2005
Lapozás: OK   22 / 66
(#) trudnai válasza szkrep hozzászólására (») Jan 23, 2010 /
 
Hat igen, ez a ket jel kozt eltelt ido max lassu fordulatnal jon be. Lattam mar olyat, hogy nem ketto, hanem tobb jel kozotti idot mernek -- ugyan az a dolog, csak megnoveled az intervallumot igy pontosabb eredmenyt kapsz. De az altalanos az amit leirtam, hogy inkabb fix idokozonkent szamlaljak meg, hogy hanyszor kapcsol a szenzor.

Amugy ez egy mechanikus encoder? Most nezem a kepeket, es nagyon ugy tunik, hogy az a ker1.jpg a bouncingot (prell / perges) mutatja. Szoval lehet meg egy prellmentesito funkciot is be kell epitened?
(#) Stefan válasza szkrep hozzászólására (») Jan 23, 2010 /
 
A Capture modullal próbáltad mérni? Minden 16 odik élre mérni talán egész hihető eredményt ad, viszont a prellezés ebben az esetben nagyon bezavar... De mérhetsz minden élre és akkor a megszakításban egy pár ms-os delay talán.
(#) szkrep válasza trudnai hozzászólására (») Jan 23, 2010 /
 
Igen, mechanikus. Meg ha rákerül a véglegesnek szánt optikai szenzor (sima optokapu), az sem lesz pillanatnyi jel. Eddig úgy tudtam, hogy a felmenő élre reagál a program, és mindegy neki, hogy utána meddig van magasan a láb. Bár ez a nyomógomboknál sem így történt...
Pergésmentesítésnek az input pin_akármi után be szoktak tenni egy delayt nem? Csak itt nem tudom, hogy mennyi legyen az a delay, hogy ne vigyen el túl sok időt. Vagy hardveresen kéne megoldani?
(#) szkrep válasza Stefan hozzászólására (») Jan 23, 2010 /
 
A 2db capture/compare/PWM modul használatban van, azok vezérlik a motorokat, közben nemigen tudnám vele számláltatni a dolgokat. (az itt kirakott kóddal csak arra igyekszem rájönni, hogy használható-e a mért érték, ehhez elég volt így megforgatni a motort)
(#) szkrep válasza trudnai hozzászólására (») Jan 24, 2010 /
 
Én ezzel az interrupttal gondban vagyok...
Ez a CCSC honlapjáról bányászott mintakód kicsit átalakítva az én órajelemhez, de semmi nem történik.
Csak egy lednek kéne benne villognia, de az sem megy.
Ez javítható, esetleg van valakinek akármilyen működő mintaprogramja?

  1. #include <16f877a.h>
  2. #fuses HS,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
  3. #use delay(clock=4000000)
  4.  
  5. long high_count, HIGH_START=30;
  6.  
  7.  
  8. #INT_RTCC
  9. void clock_isr() {
  10.    if(high_count==0) {
  11.       output_high(PIN_B4);
  12.       delay_ms(500);
  13.       output_low(PIN_B4);
  14.       high_count=HIGH_START;
  15.                      }
  16.                   }
  17.  
  18. void main() {
  19.    set_tris_b (0);
  20.       while (1){
  21.          high_count=HIGH_START;
  22.          set_rtcc(0);
  23.          setup_counters(RTCC_INTERNAL , RTCC_DIV_256);
  24.          enable_interrupts(INT_RTCC);
  25.          enable_interrupts(GLOBAL);
  26.                }
  27.             }
(#) trudnai válasza szkrep hozzászólására (») Jan 24, 2010 /
 
Ket alapveto hiba van a programban. Az elso, hogy azt a valtozot ami alapjan eldontod a LED-et kellene-e villogtatni nem is noveled vagy csokkented az interrupt kezeloben.

A masik, hogy az interrupt es a valtozod felicializalasat egy vegtelen ciklusban csinalod. Tehat meg ha bele is tenned annak a valtozonak az inkrementaciojat vagy dekrementaciojat, akkor sem mukodhetne ez igy, mivel egyfolytaban feltoltod a kezdo ertekkel.

Teendok:
1. Valtozo ertekenek novelese vagy csokkentese az ISR-en belul

2. A vegtelen cikluson kivulre rakni az inicializalasat -- ebben az esetben a vegtelen ciklusnak teljesen uresnek kell maradnia!
(#) szkrep válasza trudnai hozzászólására (») Jan 24, 2010 /
 
Igen, így jó:
  1. #define HIGH_START 32
  2. byte high_count;
  3. #INT_RTCC
  4.  
  5.  
  6. void clock_isr() {
  7.    if(--high_count==0) {
  8.       output_high(PIN_B4);
  9.       delay_ms(100);
  10.       output_low(PIN_B4);
  11.       high_count=HIGH_START;
  12.    
  13. }
  14. }
  15.  
  16. void main() {
  17.     high_count=HIGH_START;
  18.    set_rtcc(0);
  19.    setup_counters(RTCC_INTERNAL, RTCC_DIV_128);
  20.    enable_interrupts(INT_RTCC);
  21.    enable_interrupts(GLOBAL);
  22.  
  23.    while(TRUE);
  24. }


Köszi!
(Az if (--high_count==0) stb résznél mit csinál a "--"?)
(#) trudnai válasza szkrep hozzászólására (») Jan 24, 2010 /
 
Dekrementalja a high_countot. Vedd meg szerintem a Kernighan & Ritchie fele C konyvet, szerintem megeri.
(#) szkrep hozzászólása Feb 18, 2010 /
 
Újra megakadtam.
Van itt egy cikk a rádiómodulok használatáról, ahhoz van egy példaprogram, amit módosítottam a saját dolgaimhoz. Egy PIC16f877A 4Mhz kavrccal, és egy 16F887 20Mhz kvarccal kéne hogy társalogjon. Lefordítottam mindkettőre, az LCD megy szépen, de a próba üzenet nem jön meg. Próbáltam simán összekötni az adó és a vevő lábakat (meg persze a GND-t) 20cm vezetékkel, ekkor zagyvalék érkezett csak. Valami adatátvitel tehát van, de köze nincs a valósághoz. Az "INVERT" opciót kivettem az RS232 beállításokból, mivel a modul vevőjének data lába alapból magasan van, jelre pedig földre ugrik (az adón lévő lefutó élre). Sima összedrótozáskor is invert nélkül kell ha jól tudom.
Az adó és a vevő programját is csatolom, ha abban van a hiba, derítsük ki mi lehet az. A m_manchester.c érintetlen, olyan ahogy Topi megírta.
(#) ludmanakos hozzászólása Feb 19, 2010 /
 
Sziasztok!
Nagyon kezdő vagyok pic-ekben de szeretnék egy órát csinálni megvan hozzá a PIC16F628 és a program is egy HEX fileben csak nekem nincs programozóm.
Debrecen környékén nem tudtok valakit aki ezzel foglakozik csak annyi kéne hogy feltölteni rá a programot.

Üdv.
(#) szkrep válasza szkrep hozzászólására (») Feb 19, 2010 /
 
Van egy konkrétabb kérdésem: A feljebb látható m_manchester.c-ben a keyhit_delay értéke megfelelő (hogyan számítható)?
Valami nincs rendben ezzel; küld adatot, a másik pic fogadja, és nem érez hibát, de nem értelmes ami átjön. Biztosan jó? Ha simán vezetéken küldöm, ugyanaz ér oda, mint rádión keresztül. Tehát nem a modul kergült meg, hanem maga a kódolás-dekódolás kell, hogy rossz legyen. Ha kiveszem a kódolást, és simán elküldöm sorosan, akkor odaér a megfelelő üzenet (vezetéken). Csak arra tudok következtetni, hogy a kódolás nem megfelelő. Én értem, hogy mi a manchester kódolás, de ez a program valahogy tömény nekem...
(#) MPi-c válasza szkrep hozzászólására (») Feb 19, 2010 / 1
 
Az egész adás-vételre van egy másik megoldás:
Bővebben: Link és Bővebben: Link és még ez is: Bővebben: Link
(#) szkrep válasza MPi-c hozzászólására (») Feb 20, 2010 /
 
Igen, ezzel én is találkoztam, csak gondoltam ha ki van rakva egy cikkbe ez a kód, akkor működni is fog... Tetszett, hogy elvileg csak beírom a szöveget, és küldi is
Ha esetleg van valami megosztható példád arra, hogy hogy fog ez hosszabb karakterláncot elküldeni, sokat segítenél (oké, hogy megszakítással, de ötletem sincs, hogy a "boci boci tarka" betűiből hogy csinálok külön-külön elküldendő csomagokat). Az 1db karakter elküldését nagyjából átlátom, holnap konkrétan kipróbálom.
Köszi az eddigi infót!
(#) szkrep válasza szkrep hozzászólására (») Feb 20, 2010 /
 
Kidobtam az eredeti kódolást, és azt raktam be az eredeti helyére. Így a kódolt adat egészen hihető, de a dekódolás most sem megy.
A dekódolás: (a változókat jól adom meg?)
  1. int man_decode(int16 ByteToDecode1, int16 ByteToDecode2)
  2. {
  3.    int i, j;
  4.    
  5.    receive_error=0;
  6.    
  7.    for(i=0;i<=15;i++){
  8.       if(manchester[i]==ByteToDecode1) {break;}
  9.     }
  10.    
  11.    if(i==16){receive_error=1;}  
  12.    
  13.    for(j=0;j<=15;j++){
  14.       if(manchester[j]==ByteToDecode2) {break;}
  15.     }
  16.    if(j==16) {receive_error=1;}
  17.    
  18.    return ((i<<4) + j);
  19. }

Amivel meghívom a kódolást:
  1. int m_get() {
  2.  
  3. long i,ln,hn;
  4.  
  5.   ln = getc(radio);
  6.   hn = timed_getc();
  7.  
  8.   i = man_decode(ln,hn);
  9.   return i;
  10. }

amelyben a timed_getch() a következő (jó benne a delay? nem ez okozza a gondokat?)
  1. #define  KEYHIT_DELAY   300     // in milliseconds
  2.  
  3. char timed_getc() {
  4.    long timeout;
  5.    char retval;
  6.  
  7.    timeout=0;
  8.    while(!kbhit(radio) && (++timeout< (KEYHIT_DELAY*100)))
  9.       delay_us(15);
  10.    if(kbhit(radio))
  11.       retval = getc(radio);
  12.    else
  13.       retval = 0;
  14.    return(retval);
  15. }
(#) szilva válasza chriskross hozzászólására (») Márc 6, 2010 /
 
A PICkit2 saját programjával próbáltad már?

Szerk.:
Itt van a PICkit2 által hivatalosan támogatott eszközök listája, ezen szerepel a 16F84A. Az más kérdés, hogy az MPLAB kezeli-e ezt a típust, de maga a programozó tudja.

Bővebben: Link
(#) chriskross válasza szilva hozzászólására (») Márc 6, 2010 /
 
Most találtam meg neten, az felismerte. Köszi a gyors választ Már két éve megvan a pickitem, azóta héba-hóba volt csak használva. Szóval a lényeg, hogy Pickit 2 Programmerrel megy. Bár még mindig nem értem, hogy MPLAB-bal miért nem, ezt Microchipnél biztos jobban tudják

Szerk: Igen én is azt néztem, de a lényeg, hogy megoldódott. Köszi
(#) Hp41C válasza chriskross hozzászólására (») Márc 6, 2010 /
 
Sziasztok!

Van néhány érthetetlen dolog a kezelt típusok körében:
- A MpLab PicKit2 programozási lehetősége miért nem kezel minden olyan típust, amit a PicKit2 saját programja kezel?
- Miért nem kezeli a PicKit2 a néhai legelterjedtebb típusokat: 16C83, 16C84, 16F83, 16F84 stb? Ezek programozása alig tér el a 16F84A -tól...

Sziasztok
(#) freex hozzászólása Márc 31, 2010 /
 
Sziasztok!

PIC égetési gondom van. Még nagyon régen kaptam egy Tait féle programozót, ezt szeretném 16F84A-hoz és 16F828-hoz használni. Kapcsirajza csatolva. A rajta lévő felirat szerint csak 16C84-et tud progizni, de ha jól olvastam, tudnia kéne az F sorozatot is.
ICProg-ot használok. Minden szépen be van állítva, ki is mértem minden vonalat a hw tesztnél, minden feszültség stimmel (illetve nem baj ha a Vpp ~12.5V?). Beleégetem a programot, de ellenőrzésnél a szokásos hibát írja ki. Visszaolvasásnál látszik, hogy nagy része stimmel a kódnak, de vannak benne hibák.
Van valakinek javaslata, miért nem megy?

Köszi,
FreeX

tait.gif
    
(#) watt válasza freex hozzászólására (») Márc 31, 2010 /
 
Próbáld másik programmal. Ha nem megy, akkor a PC és a programok együttműködése a hibás(feltéve, hogy az áramkör rendben van!)
(#) freex válasza watt hozzászólására (») Ápr 2, 2010 /
 
Hali,

Köszi a segítséget, sikerült az égetés.
Próbálkoztam kb. 4 féle jdm égetővel, meg 2 lpt portossal, többek közt egy tait félével és eggyel, amit az oldalad alapján építettem meg. A gond az volt, hogy először egy xp-s laptoppal próbálkoztam, amin soros port nem lévén usb-soros átalakítót használtam. Ezzel a gyatra jelszintek miatt nem működött. Következő lépésben egy hp vékonykliensen próbálkoztam, azon xp embedded van. Ezzel sem jártam sikerrel, sem a jdm-mel sem lpt portossal. Ezek után vettem a bátorságot, az Ubuntus asztali pc-mről wine alatt ic-prog-gal és jdm égetővel simán beégettem a programot. Tehát a megoldás a másik pc-ben volt, ami megfelelő szinteket ad ki a portjain az égetéshez.

Üdv és köszi.
(#) mgy válasza watt hozzászólására (») Ápr 2, 2010 /
 
Nálam már 2 db originál Pickit 2 hibásodott már meg.
Nem tudom mitől. A nyákon sérülésnyomok nem látszanak.
Járt-e már valaki így, és megtudta-e javítani ?
Mitől mehetett tönkre, mert tudomásom és tapasztalataim szerint, a véletlen fordított csatlakoztatást ki kellene bírni és az áramkörben történő programozás sem gond. (lehet,hogy tévedek)
A kapcsolási rajza meg van. Neki kellene gyürkőznöm, de egy-két indulási tippet elfogadnék.

Kösz.
(#) icserny válasza freex hozzászólására (») Ápr 2, 2010 /
 
Idézet:
„soros port nem lévén usb-soros átalakítót használtam. Ezzel a gyatra jelszintek miatt nem működött.”
Nem (csak) a jelszintek miatt, hanem azért, mert az időzítés is egészen más, mivel a PC nem fér közvetlenül hozzá a lábakhoz, hanem üzeneteket küld az USB adatvonalon (szépen bekeretezve, fejléccel meg CRC ellenőrző összeggel), s aztán ezt az átalakító végén egy mikrovezérlő értelmezi, és végrehatja, amit kell.
(#) watt válasza icserny hozzászólására (») Ápr 2, 2010 /
 
Idézet:
„és végrehatja, amit kell.”

És ebben az esetben pont nem azt, amit kell!
(#) watt válasza mgy hozzászólására (») Ápr 2, 2010 /
 
Javaslom, hogy ezügyben ezt a topicot válaszd!
PICKit2 klón építése
Igazából tudom, hogy ez nem klón, de azért sok hasznos dolog derülhet ki a javítása során, ami sokaknak segíthet a klón építésekor is.
(#) trudnai válasza freex hozzászólására (») Ápr 2, 2010 /
 
1. PICkit2 nem termelesi programozo (nem tudom hogy mondjak pontosabban magyarul, nem production programmer), meg csak nem is fejlesztoi, csupan egy nagyon klassz hobby eszkoz

2. Tonkre mehet, minden tonkre mehet -- csak kerdes mi az ami tonkre ment benne, meg a jelenseget sem irtad le?

3. A leg tamadhatobb pont talan a 6 pin header, amivel az aramkorodet csatlakoztatod a PICkit2-hoz. Az aramkorodrol johetnek esetleg tranziens jelek vagy nagy feszultseg, negativ aram stb amik haza vaghatjak -- mint emlitettem nem bomba biztos az aramkor, nem is erre a celra keszult. Ha vigyazol akkor annak nem lehet baja

4. Ha nem jo a geped, vagy nincs foldelve rendesen, vagy a kulso aramkorod es a PC kozt a fold szintje nem azonos, akkor az is okozhat problemakat

5. Es vegul amivel eddig nekem problemam volt: Neha firmware frissites kozben eldobja magat, es akkor csak nagy kuzdelem aran lehet ratenni az uj firmware-t. Extrem esetben akar manualisan kell vissza rakni ra a bootloadert es a firmware-t (ilyen nekem meg egyszer sem fordult elo az evek soran)
(#) Hp41C válasza trudnai hozzászólására (») Ápr 2, 2010 /
 
Sziasztok!

Egy tapasztalat:
Ha a PicKit2 saját kezelő programjával az uart tool, a logic tool vagy a logic analyzer funkciót használjuk és a megtalált hiba miatt az MpLab-ot indítjuk (olyan project-tel, amiben a PicKit2 a beállított programozó), az MpLab úgy érzékeli, hogy nem jó a PicKit2 firmware-je. Ha nem figyelünk oda, megkezdi a letöltést, de az nem sikerül.....

Sziasztok
(#) zenetom válasza Hp41C hozzászólására (») Ápr 2, 2010 /
 
  1. MOVF SZAMLALO_COUNTER,W
  2.         MOVWF SZAMLALO_COUNTER
  3.         BTFSC STATUS,Z

Illyenkor működik a BTFSC helyesen? Illetve változik a STATUS Z bite? Mert már megint valamit elszúrtam és erre gyanakodok, de elvileg a MOVF utasítás hatással van a STATUS zero bitére
(#) icserny válasza zenetom hozzászólására (») Ápr 2, 2010 /
 
Így egyszerűbb:
  1. MOVF SZAMLALO_COUNTER
  2.     BTFSC STATUS,Z


Az adatlap szerint a MOVF utasítás a Z és N jelzőbiteket állítja be a mozgatott tartalom szerint. A BTFSC STATUS,Z pedig Z=0 estén (az adat nem nulla) lép át egy utasítást. (Ugye, még mindig PIC18-ról van szó?)
(#) zenetom válasza icserny hozzászólására (») Ápr 2, 2010 /
 
Akkor valahol máshol van a hiba, először én is így irtam be.
Igen, még mindig 18F1320-at programozok.
(#) zenetom válasza zenetom hozzászólására (») Ápr 2, 2010 /
 
Bemásol már ide, hátha valaki meglátja benne a hibát, bár kétlem hogy van benne.
  1. CONVERSION_BIN                 ;ha egy változó értéke binárisan pl. '01110001' akkor ezt így írja ki LCD-re
  2.         CALL LCD_TORLES
  3.         CALL HOSSZU_DELAY
  4.         MOVLW d'8'
  5.         MOVWF SZAMLALO_COUNTER
  6.         MOVLW d'8'
  7.         MOVWF SZAMLALO_COUNTER_2
  8. CONVERSION_BIN_ELSO_BYTE
  9.         MOVF SZAMLALO_COUNTER,F      
  10.         BTFSC STATUS,2                                  ; ha a STATUS Z bite 1 akkor a SZAMLALO_COUNTER 0 és ugrik     MASODIK_BYTE-ra
  11.         GOTO CONVERSION_BIN_MASODIK_BYTE
  12.         DECF SZAMLALO_COUNTER
  13.         BTFSS SZAMLALO_INFO_ELSO,SZAMLALO_COUNTER     ;ha a vizsgált bit 1 akkor ugrik és 1-et ír ki az LCD-re
  14.         CALL KIIR_NULLA
  15.         BTFSC SZAMLALO_INFO_ELSO,SZAMLALO_COUNTER     ;ha a vizsgált bit 1 akkor 1-et ír ki az LCD-re
  16.         CALL KIIR_EGY
  17.         GOTO CONVERSION_BIN_ELSO_BYTE
  18. CONVERSION_BIN_MASODIK_BYTE
  19.         MOVF SZAMLALO_COUNTER_2,F      
  20.         BTFSC STATUS,2                        ; ha a STATUS Z bite 1 akkor a SZAMLALO_COUNTER2 0, és ugrik a CONVERION_BIN_VEGE-re
  21.         GOTO CONVERION_BIN_VEGE
  22.         DECF SZAMLALO_COUNTER_2
  23.         BTFSS SZAMLALO_INFO_MASODIK,SZAMLALO_COUNTER_2     ;ha a vizsgált bit 1 akkor ugrik és 1-et ír ki az LCD-re
  24.         CALL KIIR_NULLA
  25.         BTFSC SZAMLALO_INFO_MASODIK,SZAMLALO_COUNTER_2     ;ha a vizsgált bit 1 akkor 1-et ír ki az LCD-re
  26.         CALL KIIR_EGY
  27.         GOTO CONVERSION_BIN_MASODIK_BYTE
  28. CONVERION_BIN_VEGE
  29.         RETURN


A lényeg: binárisan ki kéne neki írnia LCD-re a két változó értékét. Próbaképp értéket adtam a két változónak ( SZAMLALO_INFO_ELSO meg a második...) , persze csak nullákat ír ki. Viszont ha 255-öt adok neki akkor kiírja a 8db 1-est.
A KIIR_EGY eljárás egy '1'-et ír ki az LCD-re, a nulla meg értelemszerűen egy nullát.
Következő: »»   22 / 66
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