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   605 / 1210
(#) vicsys válasza lastewer hozzászólására (») Dec 13, 2014 /
 
Bővebben: Link (Azért, jó lenne, ha az alapokat átvennéd, programozás előtt, mert így eléggé nyögvenyelős lesz)
(#) Beles hozzászólása Dec 14, 2014 /
 
Sziasztok!
PIC24EP családon dolgozom unsigned long-al. De bajban vagyok. Ha egy 36928-at tartalmazó integert megszorzok 512-vel akkor 4280320000 kapok eredményül . Próbáltam úgy is hogy elé írom, hogy (unsigned long), de úgy sem lett jó. Viszont ha szimplán változó nélkül írom a szorzást, úgy jó értéket kapok. Mi lehet a baj?
(#) Gergolein hozzászólása Dec 14, 2014 /
 
Üdv Mindenkinek!

A következő hiba ütötte fel a fejét:

Írok egy végtelen primitív programot. Példának okáért egy RGB led három LED-jét kapcsolgatja ki-be.
  1. void main() {
  2. SYS_INIT();
  3.  while(1)
  4.  {
  5. GREEN=RED=1;
  6. delay_ms(1000);
  7. GREEN=RED=0;
  8. delay_ms(1000);
  9.  }
  10. }


A probléma a következő:

A kódot MikroC-ben megírom, és lefordítom.

Ezután PICkit 2 Programmer szoftver, illetve PICkit 2 Klón programozó segítségével beégettem a 12F675 típusú vezérlőbe.

Ez a szoftver tanulsága szerint meg is történik, ám az áramkört beizzítva egyáltalán nem a kódban leírtakat tapasztalom. Ebben az esetben például egy másodperces sárga színű felvillanások helyett nagyon halvány kb. 1 ms hosszúságú piros impulzusokat tapasztalok.
Azért beszélek példáról, mert sok furcsaságot észleltem, például egy-egy utasítást nem hajt végre, vagy például a RED=~RED; parancsnál tipikusan megáll.

Az érdekes az, hogy a beégetett programot a PIC-ből visszaolvasva, és azt géppel szimulálva a képernyőn tökéletesen működik.

Van erre valakinek valami meglátása?

Előre is Köszönöm!
(#) Beles válasza Beles hozzászólására (») Dec 14, 2014 / 1
 
Rájöttem mi a probléma signed volt az integer, unsigned a long. Ez kavart be.
(#) mate_x válasza Gergolein hozzászólására (») Dec 15, 2014 /
 
Szia! Nem tudom mit tartalmaz a SYS_INIT() függvény, de arra tippelek, hogy nem szerepel benne az ANSEL=0; sor.
(#) usane válasza Gergolein hozzászólására (») Dec 15, 2014 /
 
Ha meg szerepel benne az az ANSEL=0 akkor meg az a baj, hogy a 3 szín ugyanazon a porton van(mivel csak egy portja van ), és ugye mindenki azt hiszi, hogy faék. Ez elektronika! El kell olvasni az adatlapot. Portok működése: READ-MODIFY-WRITE.
És az a gyanum, hogy inkább ez a probléma nem az ANSEL.
A hozzászólás módosítva: Dec 15, 2014
(#) usane válasza usane hozzászólására (») Dec 15, 2014 /
 
Már nem egyszer szó volt róla, hogy kezdőknek pic18-al kellene kezdeni, de bármely enhanched midrange is megteszi. Tudom, az ez van itthon is nagy úr, de az adatlap ingyen van, akkor OLVASNI!
(#) Kapagerenda hozzászólása Dec 15, 2014 /
 
Sziasztok!
A retlw utasítással próbálkoztam összehozni egy programot, de nem működik. A program feladata az lenne, hogy gombnyomásokra a megadott retlw utasításoknál szereplő bináris kódokat kirakja a PORTD-re, majd a 4. gombnyomás hatására újrakezdi az egészet. Sajnos addig működik csak a program, hogy az első 00000001 kódot kirakja a kimenetre és tovább semmi, hiába nyomkodom a gombot.
  1. cblock      0x20            
  2.        szam                    
  3.      
  4.        endc                        
  5.        
  6. ;************************ MAIN PROGRAM **************************************
  7.  
  8.        org           0x0000          
  9.        banksel     ANSEL          
  10.        clrf            ANSEL          
  11.        clrf            ANSELH          
  12.        banksel      TRISD          
  13.        clrf            TRISD          
  14.        movlw        B'00000001'
  15.        movwf       TRISB          
  16.        
  17.        banksel      PORTD          
  18.        movlw       B'00000001'    
  19.        movwf       PORTD
  20. program1
  21.        btfsc          PORTB,0        
  22.        goto          program1
  23. program2
  24.        call            tabla
  25.        movwf       PORTD
  26.        incf            szam,f
  27.        movfw       szam
  28.        xorlw         b'00000101'
  29.        btfss          STATUS,Z
  30.        goto          program1
  31.        clrf            szam
  32.        goto          program2
  33. ;************************ SUBROUTINES ***************************************
  34. tabla
  35.        movfw       szam
  36.        addwf        PCL,f
  37.        retlw       b'00000010'
  38.        retlw       b'00000100'
  39.        retlw       b'00001010'
  40.        retlw       b'00010010'
  41. end
A hozzászólás módosítva: Dec 15, 2014
(#) edison14 válasza Kapagerenda hozzászólására (») Dec 15, 2014 /
 
Szia!

Az első hogy a szam változót jobb ha nullázod még az elején. A második, hogy olyan parancs hogy movfw olyan nincs helyette a következő kódot kéne használni:
  1. movf     szam,w


A szam értékének vizsgálatánál inkább kivonást használnék ami beállítja a STATUS, Z (zero) bitet így el tudod dönteni hogy a szam értéke 5 vagy kevesebb mivel amíg nem lesz 5 addig az eredmény nagyobb mint nulla és a Z egy lesz. Utána már csak ennek a feltételnek megfelelően kell megadnod hogy hova ugorjon a program.

Ja és használd a szimulátort. Sokminden kiderül ha egyenként lelépteted a programot.
A hozzászólás módosítva: Dec 15, 2014
(#) ktamas66 válasza Kapagerenda hozzászólására (») Dec 15, 2014 /
 
A szam változód nincs beállítva (clrf szam), így elsőre oda ugrik ahová szívének kedves .
(#) ktamas66 válasza edison14 hozzászólására (») Dec 15, 2014 /
 
Az MPLAB értelmezi s MOVFW-t (különben sikítana), a XORLW ugyanúgy állítja a Z bitet.
(#) Kapagerenda hozzászólása Dec 15, 2014 /
 
A szam váltózót nulláztam az elején és aztán ez jelentette a megoldást is egyben. Kösz a segítségeket!
(#) edison14 válasza ktamas66 hozzászólására (») Dec 15, 2014 /
 
Szia!

Megnéztem az MPASM dokumentációt és benne van Ma is tanultam valamit. A kivonást azért javasoltam mert talán kicsit jobban látható, hogy mit is csinál a program. Legalábbis nekem mint kezdőnek sokkal jobban észrevehető pl szimuláció során hogy mi is történik, de persze sok megoldás lehet egy változó értékének vizsgálatára.
(#) Deta hozzászólása Dec 16, 2014 /
 
PIC12f1840-hez szeretnék programot irni MPLAB-al, de amikor az options-Development Mode-Tools menüt lenyitom, ez az IC nem szerepel a sorban. Igy csak a szimulációt nem fogja tudni jól megcsinálni, vagy a HEX fájl-ba fordításkor is gond lehet?
Üdv: deta
(#) spgabor válasza don_peter hozzászólására (») Dec 16, 2014 /
 
Szia!

Közben visszaolvastam az előző 150 oldalt a topicból. Pár hasznos infót kiszedtem, de ez az időzítés még mindig nem megy... Nem nagyon látom még át. Van pár példakódom, azokból is próbálom értelmezni, kisebb-nagyobb sikerrel.
Eltaláltad, levilágításhoz kellene, pár percre beállítva egy relé behúzással kezdve és csippanással a végén.
Volt a cikkek között egy univerzális időzítős, abból másoltam a kapcsolást. Viszont abban 2x16 digites kijelző van az idő kiírásra. Nekem meg van egy SDA2131-es IC-m egy régi gépből bontva 4x7 szegmenses kijelzővel. Így azzal szeretném a hátralévő időt kiíratni.
Magam szeretném megírni tanulási céllal, mert régóta foglalkoztat a PIC, csak nem volt eddig még olyan projektem, amibe kellett volna. Viszont ha tudsz segíteni elkészült megvalósítással, azt szívesen fogadnám, talán könnyebb lenne pár dolgot megérteni belőle.
(#) kissi válasza spgabor hozzászólására (») Dec 16, 2014 /
 
Szia!
Miért nem nézegeted a fórumtársak honlapjait?
Bővebben: Link_1
Bővebben: Link_2
vagy ezt: Bővebben: Link_3
Ezekről a helyekről + sok mindent megtudhatsz, plusz a barátunk sokat segít!
(#) spgabor válasza kissi hozzászólására (») Dec 16, 2014 /
 
Szia!

Linkek közül volt, amelyiket már olvasgattam, plusz a barátunk is segített többször.
Egyenlőre eddig jutottam. A gombok egyenlőre még nem tettem bele, először szeretném, ha az időzítés futna rendesen. Kijelzőt meg csak akkor, ha egyáltalán a fő funkciója működni fog...
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <htc.h>
  4. #include <pic16f628a.h>
  5.  
  6. #FUSES NOWDT
  7. #FUSES LVP
  8. #FUSES XT
  9. #FUSES NOPROTECT
  10. #FUSES PUT
  11.  
  12. #use delay(clock = 4000000)
  13. int szamlalo = 0;
  14. int perc=1;
  15. int masodperc=3;
  16.  
  17. void stop(){    //levilágítás leállítása
  18.     RB6 = 0;
  19. }
  20.  
  21. void levilagitas(void){ //levilágítás kezdete
  22.     RB6 = 1;
  23.     szamlalo++;
  24.         if(szamlalo == 2) {
  25.             masodperc--;
  26.             if(masodperc == 0 && perc >> 0){
  27.                 --perc;
  28.                 masodperc=2;
  29.             }
  30.             if(masodperc == 0 && perc == 0){
  31.                 stop();
  32.             }
  33.             szamlalo=0;
  34.         }
  35.     if(RA4 == 1){   //ha felnyílik a levilágító teteje, akkor addig leold a relé
  36.         RB6 = 0;
  37.         while(RA4 == 0){};
  38.     }
  39. }
  40.  
  41.  
  42. //----------------------------------------------------------------------------
  43. int main(int argc, char** argv) {
  44.     T0IE = 1; //enable TMR0 overflow interrupts
  45.     TRISA = 0xFFFF;  //A lábai bemenet lettek állítva
  46.     TRISB = 0;  //B lábai kimenetekre lettek állítva
  47.     PR2 = 249;
  48.     T2CON = 5;
  49.     TMR2IE = 1;
  50.     PEIE = 1;
  51.     GIE = 1;
  52.     while(1){
  53.         while((masodperc+perc) != 0){
  54.             while(RA2 != 0){//levilágítás indítása - várakozás a gomb nyomására
  55.                 levilagitas();
  56.             }
  57.             while(RA3 != 0){//levilágítás leállítása - várakozás a gomb nyomására
  58.                 stop();
  59.             }
  60.         }
  61.     }
  62.     return (EXIT_SUCCESS);
  63. }

Viszont amit nem értek több kódban sem, hogy ha nem hívom meg a megszakítás függvényt sehol, akkor hogy is fog belefutni? Pl. nekem ha üres lenne a while(1) a végén.
Több digitális óra kódjában láttam egy interrupt fv-t, mint nálam a levilagitas() fv. Viszont sehol nem láttam hivatkozást rá. Ezért nem tudom a kettőt összekapcsolni. Ez lehet, hogy elég hülye kérdés, de programozástechnikailag nem látom a kapcsolatot. Valamint biztos, hogy rossz is a kódom, mert nem a kívánt másodperces időközönként változik a masodperc változó, hanem ahogy végfut a cikluson, ledarálja. Tehát még mindig nem megy az időzítésem sajnos..
(#) nedudgi válasza spgabor hozzászólására (») Dec 16, 2014 /
 
Ha átolvasod a mikrokontroller adatlapját, találsz egy fejezetet a megszakításról (interrupt).
A megszakítás egy fix címen induló utasítássorozat, ami akkor aktiválódik, ha a megszakítás összes feltétele megvalósul/engedélyezve van. Ebben a sorozatban meg kell határozni, melyik periféria kérte a megszakítást, és azt le kell kezelni.
(#) kissi válasza spgabor hozzászólására (») Dec 16, 2014 /
 
Idézet:
„Viszont amit nem értek több kódban sem, hogy ha nem hívom meg a megszakítás függvényt sehol, akkor hogy is fog belefutni? Pl. nekem ha üres lenne a while(1) a végén.”

A megszakítás úgy működik, mint a diákok az órán: a tanár magyaráz ( fut a főprogram !), ha valaki akar valamit, akkor jelentkezik ( megszakításkérést jelző bit ), amit, ha akar, elfogad a tanár ( megszakítás maszkolási lehetőség ). Ha felszólítja és elkezdi mondani a problémáját, akkor a tanár meghallgatja és megválaszolja a kérését ( megszakítás kiszolgálás )! Ha a tanár-diák "diskurzusa" közben benyit az igazgató, akkor a tanár csendre inti a diákot és meghallgatja az igazgatót és reagál a problémájára ( magasszintű megszakítás ! ), majd befejezi a diákkal a beszédet és ezután tér vissza az óra a rendes mederbe !
Ugyanez történik elektronikusan: ha beállítasz egy perifériát ( pl. TIMER ), hogy kérhet megszakítást ( pl. TMR0IE=1), akkor a jelzés hatására ( pl.TMR0IF=1) a processzor ÖNMŰKÖDŐEN elugrik egy adott programhelyre ( megszakítás belépési cím, pl 0x04 ) és az ott lévő programot kezdi el végrehajtani ( megszakítás kiszolgáló rutin, ISR ), majd a végeztével ( RETFIE ) visszatér a főprogramhoz!
Ez azt jelenti, ha elindítottál egy timert és engedted a megszakítását, akkor a jelzéskor otthagyja akár a while(1) végtelen ciklust is és elugrik az ISR-re !

Bocs, hogy hosszú voltam, de remélem legalább érthető
A hozzászólás módosítva: Dec 16, 2014
(#) usane válasza spgabor hozzászólására (») Dec 16, 2014 /
 
A ,egszakítást nem te hívod meg, hanem a hardver. Te csak megírod meg engedélyezed, stb. Akkor hívódik meg, ha egy biznyos hardveres feltétel(amely megszakítást beállítod), esetünkben a timer tulcsordulása elérkezik.
(#) usane válasza kissi hozzászólására (») Dec 16, 2014 /
 

Vannak bizonyos zavarok amik kéretlen megszakítást okoznak .
(#) AZoli hozzászólása Dec 16, 2014 /
 
Sziasztok!

Létezik olyan tiltás, miszerint debug módban programból nem lehet írni a configurációs regisztetreket? Konkrétan 33ep256mu806 -on próbálom, de gondolom ha itt nem megy, akkor máshol sem.
relase módban rendben működik, debbug esetén kiakad azzal hogy
Idézet:
„The target device is not ready for debugging. Please check your configuration bit settings and program the device before proceeding. The most common causes for this failure are oscillator and/or PGC/PGD settings.”

De utána kiolvasva látszik, hogy ilyenkor is átírta, csak a debug áll meg.
(#) kissi válasza usane hozzászólására (») Dec 16, 2014 /
 
Látom már kapisgálod, de azt kell maszkolni !

szerk.: Bocs, azt hittem spgabor írta, nem Neled szólt
A hozzászólás módosítva: Dec 16, 2014
(#) usane válasza AZoli hozzászólására (») Dec 16, 2014 /
 
Debug előtt debug módban leforditod és felprogramozod?
A release módban lefordított program nem jó debuggolásra.
(#) usane válasza kissi hozzászólására (») Dec 16, 2014 /
 
Én az igazgatót is maszkolnám.
Vagy inkább tiltanám.
A hozzászólás módosítva: Dec 16, 2014
(#) kissi válasza usane hozzászólására (») Dec 16, 2014 /
 
Az már durva, látszik, hogy nem suliban dolgozol, de ne off-oljunk tovább !
(#) spgabor válasza kissi hozzászólására (») Dec 16, 2014 /
 
Ez így nagyon korrekt volt.
Átolvastam a 16f628 adatlapjának ide vonatkozó szakaszait is. Elméletben nem is volt vele gond, csak kicsit száraz volt. Viszont a gyakorlati megvalósítására assembly kódokat találtam csak, ezért azt megvallom őszintén, félre is raktam.
A timert amúgy úgy szeretném megvalósítani, hogy ha az RA2-n lévő gombbal a pic lábát a földre húzom, akkor induljon a visszaszámlálás.
(#) kissi válasza spgabor hozzászólására (») Dec 16, 2014 / 1
 
Örülök, hogy segített!
Idézet:
„A timert amúgy úgy szeretném megvalósítani, hogy ha az RA2-n lévő gombbal a pic lábát a földre húzom, akkor induljon a visszaszámlálás.”

Ez egy feltétel a TIMER indításához ( arra figyelj, hogy ezek a TIMER-ek CSAK előre számolnak egy beállítható kezdőértéktől és ha elérik a legnagyobb megszámolható számot / 8 vagy 16 bit /, akkor a következő impulzus hatására túlcsordul, ami bebillenti a jelzőbitet /pl.TMR0IF/! A léptetés sebességét tudod változtatni órajellel, osztókkal ).
A hozzászólás módosítva: Dec 16, 2014
(#) spgabor válasza kissi hozzászólására (») Dec 16, 2014 /
 
Igen, ebben már kaptam segítséget egy korábbi hozzászólásban.
(#) kissi válasza kissi hozzászólására (») Dec 16, 2014 /
 
Nem írtam még, hogy a tanárnak minden "közbeszólásnál" meg kell jegyeznie, hogy hol járt és tudja majd folytatni ( ha ügyes, akkor egy tanulóval felíratja egy papírra --> erre való a veremtár! )!
Lehet olyan problémája a tanárnak, hogy a táblára felírt információkat a megszakítás közben le kell törölnie ( hogy legyen helye!), miközben a tanulónak magyaráz, ilyenkor azokat is "fel kell írnia" előtte ( ez a szükséges változók mentése ), majd a "diskurzus" után újra felírnia ( változók visszatöltése !)!
A hozzászólás módosítva: Dec 16, 2014
Következő: »»   605 / 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