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   518 / 1210
(#) Pali79 válasza zlanczky hozzászólására (») Ápr 28, 2014 /
 
MCLR fel van húzva Vdd-re? A pickit felhúzza magának.
(#) Hp41C válasza zlanczky hozzászólására (») Ápr 28, 2014 /
 
A fordítást Release módben végezted?
(#) zlanczky válasza Pali79 hozzászólására (») Ápr 28, 2014 /
 
Köszönöm, igen, így működik. Persze nem értem, mert eddig ezt sosem csináltam és mégis korábban ment a dolog e nélkül is.
(#) zlanczky válasza Hp41C hozzászólására (») Ápr 28, 2014 /
 
A programot MicroC-ben írtam, ott nincs értelme debug módot használni, az MPLAB-ban meg csak letöltöm, ott nem buildelek.
(#) usane válasza zlanczky hozzászólására (») Ápr 28, 2014 /
 
Ha kikapcsolod a MCLR-t akkor lehet, hogy működik most is, de egy kis zavar és resetel, nem jó lógva hagyni.
(#) Pali79 válasza Hp41C hozzászólására (») Ápr 29, 2014 /
 
Köszönöm, működik!
Minimális átalakítással meg lehet oldani a vezérlés 4 bitesre átalakítást vagy alapjaiban kéne ahhoz átírni a programot?
(#) usane válasza Pali79 hozzászólására (») Ápr 29, 2014 /
 
Mi a minimális?
Nem néztem át csak belepillantottam a kódba és úgy néz ki az LCD_INIT és az LCDCMD rutint kell átírni. Nem vészes.
(#) Collector hozzászólása Ápr 29, 2014 /
 
Mi a véleményetek az olcsóbb eredetinek kinéző pickit 3 klónokról? Pl ez:Bővebben: Link
Chipcadnál majdnem dupla ennyibe kerül, gondoltam spórolok egy kicsit, ha funkcionálisan nem butított változatról van szó, persze a kínai odaír mindent.
(#) usane válasza Collector hozzászólására (») Ápr 29, 2014 /
 
Nagyon eredetinek néz ki. Ha az akkor valami elveszett kamionról van
Ha meg hamisítvány akkor elég gáz mert rajta van a mikor csíp logója, ezért gyanús, hogy az első teória a helytálló. Már ha egyáltalán azt kapod ami a képen van.
A hozzászólás módosítva: Ápr 29, 2014
(#) Collector válasza usane hozzászólására (») Ápr 29, 2014 /
 
Az első verzió miben különbözik?
(#) c27 válasza vicsys hozzászólására (») Ápr 29, 2014 /
 
Egy kicsit tudnád részletezni milyen csatoló fokozat? Esetleg egy kapcsolási rajz skicc is sokat segítene.
(#) nagzso hozzászólása Ápr 30, 2014 /
 
Sziasztok! Van egy kis gondom a Timer1 megszakítással. PIC18F2550-et programozok 20Mhz-es külső quartz-cal és a Timer1-nek egy 32.768Hz-essel. Nem használok low/high megszakítás beállítást. A fordító XC8 v1.31. A portok inicializálva vannak, a végtelen ciklusom üres és előtt engedélyeztem a globális megszakítást és elindítottam a Timer1-et. Egyszer meghívódik az ISR aztán többet nem, emellett ha MCLR-rel újraindítom, elszáll a következővel: PC=0x0018. Stack overflow for push of address 0x00000018 (STKFUL set). Mi lehet a probléma?
  1. void init_TMR1(void) {
  2.     RCON = 0x1F;
  3.     T1CON = 0x0E;
  4.     TMR1H = 0x80;
  5.     TMR1L = 0x00;
  6.     IPR1 = 0x00;
  7.     PIR1 = 0x00;  //ha ezt átírom 0x01-re akkor 1-szer meghívódik az isr, de csak 1-szer
  8.     PIE1 = 0x01;
  9.     INTCON = 0x40;
  10. }
  11.  
  12. void interrupt isr_high(void) {
  13.     INTCONbits.GIE = 0;
  14.     if (PIE1bits.TMR1IE && PIE1bits.TMR1IF) {
  15.         if (LATA0 == 0) LATA0 = 1;
  16.         else LATA0 = 0;
  17.         TMR1H = 0x80;
  18.         TMR1L = 0x00;
  19.         PIE1bits.TMR1IF = 0;
  20.     }
  21.     INTCONbits.GIE = 1;
  22. }
  23. /* Megírtam ezt is, hátha küszöböli a PIR1 = 0x00 / 0x01 hibát, de nem. */
  24. void interrupt low_priority isr_low(void) {
  25.     INTCONbits.GIE = 0;
  26.     if (PIE1bits.TMR1IE && PIE1bits.TMR1IF) {
  27.         if (LATA0 == 0) LATA0 = 1;
  28.         else LATA0 = 0;
  29.         TMR1H = 0x80;
  30.         TMR1L = 0x00;
  31.         PIE1bits.TMR1IF = 0;
  32.     }
  33.     INTCONbits.GIE = 1;
  34. }
(#) Hp41C válasza nagzso hozzászólására (») Ápr 30, 2014 /
 
- RCON 7. bitje 0, nem prioritásos megszakítás: INTCON.7 : GIE, INTCON.6 : PEIE
- INTCON = 0x40; Csak a PEIE áll 1 -re a GIE nem.
- Az inicializáló rész végén levő kivételével töröld a programból a GIE -t állító sorokat.
(#) nagzso válasza Hp41C hozzászólására (») Ápr 30, 2014 /
 
Ezeket mindet értem (legalábbis azt hiszem). Itt a teljes kód, csak a configot hagytam ki.
A TMR1IF sose billen be, ha az interrupt "if" részéből kiveszem ezt a feltételt, akkor ha MCLR-rel újraindítom, elkezd működni(LATA0), de csak a reset után. Ugyanez érvényes a GIE és PEIE-re. Ha kiveszem a PEIE feltételt, GIE == 0-ra írom és reset-elem, akkor elkezd villogni a LED-em (LATC7). Ha a GIE-t veszem ki és a PEIE == 1, akkor egy reset után elkezd villogni(LATC7). Szóval reset után belép az ISR-be és minden flag törlés nélkül működik. Az Errata-t is olvasgattam, amit ajánlottak a TMR1-hez ki is próbáltam, de semmi.
  1. #include <xc.h>
  2. #include "configuration.h"
  3.  
  4. void interrupt isr(void) {
  5.     if (PIE1bits.TMR1IE && PIR1bits.TMR1IF) {
  6.         if (LATA0 == 0) LATA0 = 1;
  7.         else LATA0 = 0;
  8.         TMR1H = 0x80;
  9.         PIR1bits.TMR1IF = 0;
  10.     }
  11.     if(INTCONbits.PEIE && INTCONbits.GIE) {
  12.         if (LATC7 == 0) LATC7 = 1;
  13.         else LATC7 = 0;
  14.     }
  15. }
  16.  
  17. void main(void) {
  18.     PORTA;
  19.     LATA;
  20.     TRISA = 0x00;
  21.  
  22.     PORTAB
  23.     LATB;
  24.     TRISB = 0x00;
  25.  
  26.     PORTC;
  27.     LATC;
  28.     TRISC = 0x00;
  29.  
  30.     CMCON = 0x07;
  31.     ADCON1 = 0x0F;
  32.     ADCON2 = 0xB6;
  33.     ADCON0 = 0x00;
  34.  
  35.     RCON = 0x1F;
  36.     TMR1H = 0x80;
  37.     TMR1L = 0x00;
  38.     T1CON = 0x0E;
  39.     IPR1 = 0x00;
  40.     PIR1 = 0x00;
  41.     PIE1 = 0x01;
  42.  
  43.     T1CONbits.TMR1ON = 1;
  44.     INTCONbits.PEIE = 1;
  45.     INTCONbits.GIE = 1;
  46.  
  47.     while (1) {
  48.     }
  49. }
(#) nagzso válasza nagzso hozzászólására (») Ápr 30, 2014 /
 
Megy, nincs vele gond.
(#) vilmosd válasza nagzso hozzászólására (») Ápr 30, 2014 /
 
Ha jol tevedek a GIE bit az interrupt alatt '0' szintu, tehet az IT rutin ezen resze sohan nem fog teljesulni:
  1. if(INTCONbits.PEIE && INTCONbits.GIE) {
  2.         if (LATC7 == 0) LATC7 = 1;
  3.         else LATC7 = 0;
  4.     }
Tehat semmilyen hatasa nincs a kodban. DS39632e.pdf 99. oldal 2. kolumna lap teteje.
(#) Birs Alma válasza Hp41C hozzászólására (») Máj 1, 2014 /
 
Így próbáltam, de nekem így nem működik:

#include inc.inc

így viszont működik:

#include <inc.inc>
(#) Hp41C válasza Birs Alma hozzászólására (») Máj 1, 2014 /
 
A project tulajdonságainál módosítani lehet a könyvtárat, ahol az inc állományokat keresi a fordító.
(#) vicsys válasza Birs Alma hozzászólására (») Máj 1, 2014 /
 
Ha a fordító könyvtárában van, akkor a <> jelek használatosak. A "inc.inc" a munkakönyvtárban keres elsőre. Megadható akár teljes útvonal is, pl.: "c://valahol/valami/akarmi/inc.inc" -is.
(#) icserny válasza Birs Alma hozzászólására (») Máj 1, 2014 /
 
Idézet:
„Így próbáltam, de nekem így nem működik:
#include inc.inc”

A fájlnév köré idézőjel vagy hegyes (kacsacsőrös) zárójel kell!
(#) nagzso válasza vilmosd hozzászólására (») Máj 2, 2014 /
 
Köszi szépen, ezt nem tudtam.
(#) don_peter hozzászólása Máj 3, 2014 /
 
Srácok egy buta kérdés:
P18F4550 és 25LC640 párost használok.
A kérdés pedig az, hogy, ha a memóriába csak 1bájtot lehet egyszerre írni akkor ha egy short int változóba lévő mondjuk 500-as értéket hogyan tudok bele írni?
Mert ugye ez már 2bájt helyet foglal..
Előre is köszi a kiokosítást..
(#) don_peter válasza (Felhasználó 15355) hozzászólására (») Máj 3, 2014 /
 
És ha sort int változom értéke 900 akkor meg 4részre kell bontanom?
Nem lenne túl hatékony nem?

Tudom, hogy 1bájt (unsigned) 0-255 és 2bájt 0-65536, de a 2részre bontást nem értem, hogy érted..
A hozzászólás módosítva: Máj 3, 2014
(#) nedudgi válasza don_peter hozzászólására (») Máj 3, 2014 1 /
 
A short int változó értéke nem lehet 500, vagy 900. Az már fordítási hibát, vagy futási hibát okoz. Ilyenkor a változó típusát meg kell változtatni.
A hozzászólás módosítva: Máj 3, 2014
(#) Hp41C válasza don_peter hozzászólására (») Máj 3, 2014 /
 
32767 -ig a short -ot, 65365 -ig az unsigned short -ot nem kell csak két részre bontani, négy részre majd a long -ot vagy az unsigned long -ot kell. Bővebben: Link
Érdemes egy union -t definiálni, mint állandóan osztogatni, szorozgatni.
  1. typedef union _WORD_VAL
  2. {
  3.     unsigned int Val;
  4.     struct
  5.     {
  6.         unsigned char LB;
  7.         unsigned char HB;
  8.     } bytes;
  9.    struct
  10.     {
  11.         unsigned char b0:1;
  12.         unsigned char b1:1;
  13.         unsigned char b2:1;
  14.         unsigned char b3:1;
  15.         unsigned char b4:1;
  16.         unsigned char b5:1;
  17.         unsigned char b6:1;
  18.         unsigned char b7:1;
  19.         unsigned char b8:1;
  20.         unsigned char b9:1;
  21.         unsigned char b10:1;
  22.         unsigned char b11:1;
  23.         unsigned char b12:1;
  24.         unsigned char b13:1;
  25.         unsigned char b14:1;
  26.         unsigned char b15:1;
  27.     } bits;
  28. } WORD_VAL;
A hozzászólás módosítva: Máj 3, 2014
(#) don_peter válasza nedudgi hozzászólására (») Máj 3, 2014 /
 
Hát nem úgy van, hogy unsigned char 8bit, short int 16bit, unsigned int 32bit?
(#) nedudgi válasza don_peter hozzászólására (») Máj 3, 2014 /
 
Nem szóltam, sajnos nem olvastam kellő figyelemmel.
(#) don_peter válasza Hp41C hozzászólására (») Máj 3, 2014 /
 
Kaphatnék némi használati magyarázatot ehhez a típus definicióhoz?
Hogy működik?
Az látom, hogy 16bites, de hogy adod meg neki a 2bájtos adatod?
Így valahogy:
  1. _WORD_VAL Val;
  2. Val.bytes=900;
  3. //és a beírásnál a bytes.LB és bytes.HB tárolja a szám első byte-ját és második byte-ját...

De hogyan írom ezt be? Előbb az LB-ét és utána a HB-ét íratom a memóriába...?
Amikor kiolvasom akkor már egyben lesz vagy ott is kell majd valami átváltó?
Kérlek magyarázd el a működését, mert sajna nem értem...
(#) Hp41C válasza don_peter hozzászólására (») Máj 3, 2014 /
 
Mondjuk maradjunk a példádnál. 25LC640 -be szeretnéd a temp változó értékét (900) beírni. Az SPI kezelő függvényeket már megírtnak tekintem.
Változót kell deklarálni:
WORD_VAL temp;
EEProm -ba írás:
  1. temp.Val = 900;
  2. spi_write(0, temp.bytes.LB);
  3. spi_write(1, temp.bytes.HB);

Most vissza szeretnéd olvasni:
  1. temp.bytes.LB = spi_read(0);
  2. temp.bytes.HB = spi_read(1);
  3. if (temp.Val == 900) passed() else failed();
(#) don_peter válasza Hp41C hozzászólására (») Máj 3, 2014 /
 
Értem most már...
Az adatstruktúrát használni kell be és kiírásnál is, hogy a megfelelő értéket írja és olvassa vissza. (összerakja a 2bájtot, 2x8bit-et)

Még egy része nem teljesen tiszta.
Van egy bits adatstruktúra is.
Az mit csinál?
A 16bitet külön válasza 16 külön álló bit-re?
Gyakorlatilag ez a bits struktúra fogja átváltani, tárolni bináris formában a 900-at? (0000 1001 0000 0000)
A hozzászólás módosítva: Máj 3, 2014
Következő: »»   518 / 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