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   214 / 1210
(#) cNobody válasza Skip hozzászólására (») Feb 23, 2012 /
 
Megszakítást jelző flaget kézzel kell visszaállítani (kinullázni) a megszakítás kezelés legvégén, return előtt!
Úgy sejtem, hogy ebben az esetben folyamatosan észleli hogy megszakítás van (mert nincs a flag nullázva) és végtelen ciklusba kerül.
(#) Skip válasza cNobody hozzászólására (») Feb 23, 2012 /
 
Bejött köszönöm szépen a választ. Sokat segítettél.
(#) Skip válasza cNobody hozzászólására (») Feb 23, 2012 /
 
Tovább szeretném fejleszteni a dolgot olyanra, hogy nem külső gombbal szeretnék megszakítást kérni, hanem egy bizonyos eltelt idő után. Az igaz, hogy az interrupt-ba nem lehet késleltetést írni? Ezt úgy olvastam valahol. Ha ez igaz akkor, hogy lehetne logikusan megoldani ezt a problémát?
(#) kissi válasza Skip hozzászólására (») Feb 23, 2012 /
 
Használj TMER-t és olvass sokat !

Steve
(#) Skip válasza kissi hozzászólására (») Feb 23, 2012 /
 
Már egy hete csak olvasok. amúgy gondoltam erre való a Timer0 neveztű valami, de kíváncsi voltam, hogy anélkül meg lehet-e oldani.
köszi a tippet
(#) icserny válasza Pepebá hozzászólására (») Feb 23, 2012 / 1
 
Idézet:
„Ezzel a megoldással próbálkozom”
Így próbáltam volna én is!

Van azonban egy apró ellentmondás: ha már szükségtelenül int típusúnak deklaráltad a függvényt, akkor miért nem (int) típuskényszerítés van visszatérésnél?

De logikusabb volna a függvényt is és az mcp1adat változót is uint8-nak deklarálni!
(#) kissi válasza Skip hozzászólására (») Feb 23, 2012 /
 
Idézet:
„Már egy hete csak olvasok.”
Én évek óta...

Az 1 hét nagyon kevés, ne csodálkozz, hogy még nem érted ( többször is el kell olvasni és próbálgatni kell + SZIMULÁCIÓ !!! ) !
Steve
(#) qbit válasza Skip hozzászólására (») Feb 23, 2012 /
 
Szia!

A megszakításba azért nem tehetsz késleltetést (pl. NOP-okat ciklusban), mert a megszakításkezelő rutin futásideje nem lehet hosszabb, mint a két megszakítás közt eltelt idő (különben a megszakítás önmagára futna). Ezt sok helyen le is írták már (szerintem itt is). De azt megteheted, hogy létrehozol egy globális változót (0 kezdőértékkel), aminek a tartalmát minden megszakítás alkalmával növeled egyel és vizsgálgatod minden megszakításnál. Amikor eléri a kívánt értéket, akkor jött el a késleltetett indítás pillanata. Nem bonyolult és nem is növeli sokkal a kódot...

Üdv.
(#) pittosi válasza potyo hozzászólására (») Feb 23, 2012 1 /
 
Igen ez az AVAR.http://www.hestore.hu/prod_10024859.html
Most akarok PI16628 összekötni .
Azért kérdem mert az ic lapján nem egyéltelmü neken nyelv miatt és nem szeretném elrontani
(#) pittosi válasza pittosi hozzászólására (») Feb 23, 2012 /
 
Létom már alaposan mellé nyuútam, Másra jó.
kőszönöm .
(#) Pepebá válasza icserny hozzászólására (») Feb 23, 2012 /
 
Bingó! szuperál a portbővítő. Nagyon köszönöm a segítséged, sokat segítettél mint mindíg!
Működik mind két megoldási javaslatod, tudom kezelni az A és B portot (bájt-ot). Azért, maradok az első javaslatodnál. Egy kis hardver probléma bonyolította tovább a helyzetet, nehéz úgy programot fejleszteni, hogy a hardver nem 100-s. Így jár aki kissé figyelmetlen.
Most egy ideig elleszek a PC-s progival, de utána további portbővítést és memória beépítést tervezek az I2C buszra.
Üdv.
(#) AZoli hozzászólása Feb 23, 2012 /
 
Sziasztok!

30F6012A SPI busz nem tudom rávenni hogy slave-ként működjön. Nem okoz megszakítást az üzenet érkezése, nem áll 1-be IFS0bits.SPI1IF. Így konfigoltam, biztos hogy itt nem jó valami:
  1. //SPI 1 salve
  2. SPI1CON = 0b0010000010000000; // SPIFSD:1 SSEN:1 CKP:0 CKE:0 SMP:0
  3. SPI1STAT = 0b1000000000000000; //
  4. INTCON1= 0b0000000000000000;
  5. INTCON2= 0b0000000000011110; //INT1-INT4   1 = Interrupt on negative edge
  6.  
  7. IEC0 = 0b0000000111001000; //bit SPI1 T3 T2 T1
  8. IEC1 = 0b0000000011000001; //bit 6:T5 0:INT1 6:int2
  9. IEC2 = 0b0000000000000000; //bit

A port beállítások (irányok) jók, A/D kikapcsolva az érintett lábakon. Mit kéne még beállítani?
(#) icserny válasza AZoli hozzászólására (») Feb 23, 2012 /
 
Itt találsz egy mintapéldát SPI master-slave kommunikációra. Nézd át a beállításokat, hátha találsz benne valami okosságot!
(#) AZoli válasza icserny hozzászólására (») Feb 24, 2012 /
 
Szoktam olvasgattam az oldaladat, sokszor segített már, ezt is megtaláltam de lényegi eltérést nem láttam. Annyi hogy a 30F.. sorozatban más a SPI1CON1 reg. Legalábbis én nem láttam "SLAVE_ENABLE_ON | //SLAVE mód" ezt a bitet. A 24F.. adatlapját pedig nem néztem.
De közben a megszakítás sikerült elérni, most más a probléma:
A master 10ms- onként 4byte -os csomagot küld az SPI -n. Ez okoz is 4 megszakítást a slave-ben, de a lenti kóddal valamiért nem megy a 4byte szétválogatása.
C-vel még csak ismerkedem assembly -ben programoztam sokat, minden észrevételt szívesen fogadok.
  1. void _ISRFAST _SPI1Interrupt (void)
  2. {
  3.  
  4. // 10ms-onként jönnek 4 byte-os csomagok
  5. if (SPI1_timer > 5) SPI_byte_count = 0; //sok idő eltelt, ez a csomag eleje
  6. SPI1_timer = 0; //1ms-onként számol. Ha több mint 3ms eltelt, akkor ez a csomag eleje
  7. switch (SPI_byte_count)
  8. {
  9. case 0:
  10. __asm__ ("btg LATDbits,#11");
  11. TPIC_Command = SPI1BUF;
  12. SPI1BUF = Error_code_array [Error_code_count];
  13. Error_code_count++;
  14. if (Error_code_count >= 16) //Ha már a 15. elemet kiküldtük, akkor törlés
  15. {
  16. for (Error_code_count = 0; Error_code_count < 16; Error_code_count++)
  17. {
  18. Error_code_array [Error_code_count] = 0; //Ha mind a 16-ot kiküldtük, akkor töröljük mindet
  19. }
  20. }
  21. ALLAPOTbits.TPIC_C = 1;//Jelzés mainnak ...
  22. break;
  23. case 1:
  24. Data_1 = SPI1BUF;
  25. SPI1BUF = Heat_pwm_cycle;
  26. break;
  27. case 2:
  28. Data_2 = SPI1BUF;
  29. SPI1BUF = 0x55; //UR;
  30. break;
  31. case 3:
  32. Data_3 = SPI1BUF;
  33. SPI1BUF = Szabad_out;
  34. break;
  35. default:
  36. Szabad_in = SPI1BUF; //nem kell
  37. SPI1BUF = 0xAA;
  38. }
  39. SPI_byte_count++;
  40. IFS0bits.SPI1IF = 0;
  41. //__asm__ ("btg LATB,#0");
  42. }

PORTD,11 lábat nézem szkóppal azért vannak beszúrva az asm sorok. SPI1_timer-t 1ms-onként növelem 1-el.
(#) icserny válasza AZoli hozzászólására (») Feb 24, 2012 /
 
Az interrupton kezelt változók volatile-ként vannak deklarálva?
(#) AZoli válasza icserny hozzászólására (») Feb 24, 2012 /
 
Nem. Köszönöm a segítséget! Pedig már használtam, de most lemaradt a volatile . A tömbnél is ugyan úgy mint sima változónál?
  1. unsigned int  volatile Error_code_array [16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

HA lenne ott (megszakításban) lokális változó azt is volatile -ként kellene?
(#) Skip válasza icserny hozzászólására (») Feb 24, 2012 /
 
Ha már itt tartunk valaki el tudná mondani pár szóval mi is az a volatile?! Mire jó az?
(#) AZoli válasza Skip hozzászólására (») Feb 24, 2012 /
 
Valami olyasmi hogy a fordítónak szól hogy a változón ne végezzen optimalizációt.. De majd a nagyok kiegészítik.

Persze még mindig nem jó valami, a slave mindig Heat_pwm_cycle változó értékét küldi vissza mind a 4 byte helyén. Mintha SPI_byte_count mindig 1 lenne.
(#) trudnai válasza Skip hozzászólására (») Feb 24, 2012 /
 
Idézet:
„Ha már itt tartunk valaki el tudná mondani pár szóval mi is az a volatile?! Mire jó az?”


Azzal mondod meg a forditonak, hogy ne optimalizalja ki a valtozo hasznalatat a kododbol. A fordito nem latja parhuzamos szalakat, azaz ha pl azt csinalod, hogy:

  1. char valtozo = 1;
  2. while ( valtozo ) {
  3.     // varunk amig a megszakitas ki nem nullazza a valtozot
  4. }


akkor a fordito azt hiszi a valtozo erteke mindig 1 es igy olyan kodot fog generalni ami nem vizsgalgatja folyamatosan a valtozo erteket...

Viszont ha az volatile akkor fogja tudni, hogy ilyet nem szabad csinalnia es mindig vizsgalgatnia kell a valtozodat. Ez persze csak egy egyszeru pelda, ennel osszetettebb is lehet a dolog, de a lenyeg ez.
(#) Skip válasza trudnai hozzászólására (») Feb 24, 2012 /
 
Köszi szépen megint okosabb lettem.
(#) Skip hozzászólása Feb 24, 2012 /
 
A napokban sikerült összehoznom az RBO/ INT-es megszakítást és most próbálkozom TMR0-ás megszakítással, hogy saját maga váltogassa a dolgot ne pedig külső gombbal kelljen csinálnom.
Ezzel kapcsolatban szeretném kérni a segítségeteket.
Megírtam ezt a kódot:
  1. #include <htc.h>
  2.  
  3. //config: ext reset, no code protect, no watchdog, 4MHz int clock
  4.  
  5. #ifndef _XTAL_FREQ
  6.  // Unless already defined assume 4MHz system frequency
  7.  // This definition is required to calibrate __delay_us() and
  8.  #define _XTAL_FREQ 4000000
  9. #endif
  10.  
  11.  
  12. __CONFIG(BOREN_ON & CP_OFF & WDTE_OFF & LVP_OFF & FOSC_XT);
  13.  
  14. //=====================================
  15. void main(){
  16. //=====================================
  17.         GIE = 1;
  18.        
  19.         T0IE = 1;        
  20.  
  21.         T0CS = 0;
  22.         PSA = 0;
  23.         PS2 = 1;
  24.         PS1 = 1;
  25.         PS0 = 1;
  26.        
  27.         TRISD = 0b00000000; //PORTD kimenet
  28.         PORTD = 0b11110000; //LED bekapcs
  29. }
  30.  void interrupt timer0_isr(void)
  31. {
  32.     PORTD ^= 0xFF;
  33.     TOIF = 0;
  34.   return;
  35. }


Ez nekem annyit csinál, hogy az RD4-RD7 ig folyamat világít a led és nem akarja az istennek sem XOR-ozni.
HI-TECH fordítót használok(legalább is próbálok használni)
Vajon mi lehet a probléma? Valami regisztert nem állíthatok be vagy valami még ostobább probléma lehet ebben a dologban? (nem tudom a PS2S0- át jól írtam-e be de hibát nem dob...)
Előre is köszi ha valaki tud segíteni
(#) MPi-c válasza Skip hozzászólására (») Feb 24, 2012 /
 
Számításaid szerint milyen időközönként következik be a megszakítás? Ha meg van, gondold tovább!
(A T0IF-et "O"-val írtad - legalábbis ide úgy került. Erre hibaüzenetet kellett volna kapnod!)
(#) Skip válasza MPi-c hozzászólására (») Feb 24, 2012 /
 
én úgy számoltam, hogy:
1:256-al osztom a TMR0-át. 4Mhz-es a kvarcom. leosztom 256-tal és 1/ez a szám. ez nekem 64 us-re jön így ki. elég fura de én erre tudok csak gondolni.
Ha ez igaz akkor lehetséges, hogy túl gyors?

A T0IF-vel kapcsolatban igazad volt. A programba 0-t írtam. Van egy sas szemed

Jól számolom?
(#) Babó22 hozzászólása Feb 24, 2012 /
 
Üdv mindenkinek! Most építettem egy 44 PIN-es PIC16F887 mikrokontrollerrel működő próbapanelt a Microchip tervei alapján. Mindent úgy kötöttem be, ahogy a kapcsolási rajzban meg voltak adva. A LED-ek villogtatása megy, nyomógomb szintén működik, viszont az AD átalakítós feladatoknál már gondok akadtak. A program célja az, hogy potenciométer aktuális értékét kijelzi bináris számrendszerben. Ám ez nem történik meg. Próbáltam más potenciométerek alkalmazását, sajnos kevés sikerrel. Okozhat-e gondot az, hogy ahogy a kapcsolási rajzban fel volt tüntetve, a potenciométerrel sorba volt kötve egy 1k ellenállás és vele párhuzamosan a földre volt kötve egy 100 nF-os kondenzátor (kerámiát alkalmaztam).
(#) MPi-c válasza Skip hozzászólására (») Feb 24, 2012 /
 
Nem jól számolsz, a TMR0 léptetőjele az oszcillátor órajelének negyede. (Adatlap!)
Tehát utasításciklus (Fosc/4): 1 us, 256-os osztással 256 us. A 8 bites számláló túlcsordulása 256*256 us = 65536 us, kb. 65,5 ms. Ez is gyorsnak tűnik
(Egyébként az MPLAB szimulátorában a stopperórával megmérhető...)
(#) MPi-c válasza MPi-c hozzászólására (») Feb 24, 2012 /
 
És, amit az előző hozzászólásomban is elfelejtettem: a main végére kellene egy végtelen ciklus, ha az eredetiben nincs ott, a megszakítás végén meg felesleges a return.
(#) Stefan hozzászólása Feb 25, 2012 /
 
Sziasztok!
USB HID Generic demo, PIC18F14K50.
Kezdek kifogyni a program memóriából, bootloadert nem akarok használni.
A linker fájlban ha a bootloader szekciót kiveszem és a page alsó határát az ex bootloader szekcióra alsó határára állítom akkor az úgy menni fog szerintetek, vagy valahol máshol is bele kell nyúlni?
Gondolom a vektor a átirányítást is ki lehetne szedni.
  1. // Bootloader
  2. CODEPAGE   NAME=vectors    START=0x0            END=0x29           PROTECTED
  3. CODEPAGE   NAME=bootloader   START=0x2A           END=0xFFF   PROTECTED
  4. CODEPAGE   NAME=page       START=0x1000           END=0x3FFF
  5.  
  6. // Application
  7. //CODEPAGE   NAME=boot       START=0x0            END=0x1F         PROTECTED
  8. //CODEPAGE   NAME=vectors    START=0x1000         END=0x1029         PROTECTED
  9. //CODEPAGE   NAME=page       START=0x102A         END=0x3FFF
  10.  
  11. CODEPAGE   NAME=idlocs     START=0x200000       END=0x200007       PROTECTED
  12. CODEPAGE   NAME=config     START=0x300000       END=0x30000D       PROTECTED
  13. CODEPAGE   NAME=devid      START=0x3FFFFE       END=0x3FFFFF       PROTECTED
  14.  
  15. ACCESSBANK NAME=accessram  START=0x0            END=0x5F
  16. DATABANK   NAME=gpr0       START=0x60           END=0xFF
  17. DATABANK   NAME=gpr1       START=0x100          END=0x1F3
  18. DATABANK   NAME=usb2       START=0x200          END=0x2FF          PROTECTED
  19. DATABANK   NAME=sfr15      START=0xF40          END=0xF5F          PROTECTED
  20. ACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF          PROTECTED
  21.  
  22. SECTION    NAME=CONFIG     ROM=config
  23. SECTION    NAME=GP0        RAM=gpr0
  24. SECTION    NAME=GP1        RAM=gpr1
  25. SECTION    NAME=usbram2     RAM=usb2
  26.  
  27. SECTION    NAME=USB_VARS   RAM=usb2
  28.  
  29. STACK SIZE=0x40 RAM=gpr1
(#) n_yálastrubadúr hozzászólása Feb 25, 2012 /
 
Sziasztok.
Nagyon alap kérdésem lenne, lehet volt is részletesen róla már szó. Magam is sokat keresgéltem. Watt oldalán is nézegettem. Nade a kérdés a táblázatkezelés. Hosszadalmas a programom, mert a 8bit lebontva 3 regiszterbe, hogy a 3 darab decimális jegy meglegyen. Ezek után pedig jön a szerintem kifejezetten buta és hosszú rész. Mindegyik regiszterből 0-9-ig egymás után vonogatom ki az értéket és ha megegyezik akkor veszi fel azt az értéket ami benne van és ezt 3x 0-9-ig ez nagyon hosszú és tudom hogy a táblázatkezelés lenne az okos megoldás, de nemnagyobn találok infót, és segítséget. Köszi!
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Feb 25, 2012 /
 
Szia!
Már nem is tudom hanyadszor adom meg a linket. Ez egy gyors, rövid, bővíthető, szűkíthető rutin a bináris - BCD átalakításra. Egy követelmény van (de a program módosításával ez is feloldható), hogy az R3,R2,R1,R0 változók egymás utániaknak kell lenniük és az R3 cimének alsó 3 bitjének 0 -nak kell lennie.

Nincs benne osztás, táblázatkezelés stb.

Ez meg a visszafelé konverzió hasonló módon.
(#) icserny válasza Stefan hozzászólására (») Feb 25, 2012 /
 
Az alábbi sorokkal mennie kell.
  1. CODEPAGE  NAME=vectors  START=0x0  END=0x29  PROTECTED
  2. CODEPAGE  NAME=page  START=0x002A  END=0x3FFF
Következő: »»   214 / 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