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   1127 / 1203
(#) Peet19 válasza slimcolt hozzászólására (») Júl 2, 2020 /
 
Rosszul írtam boccs. Nem a visszaverődő fény idejét mentem el, hanem azt a feszültség értéket amit a fototranzisztoron eredményez. Ez lesz a referencia feszültség amihez a következőt hasonlítom. Mint egy komparátor, csak szoftveresen.
Van egy ultrahangos terv is ami hasonlóan működne és azzal kevertem össze egy kicsit. Ott kell az időt mérni, itt a feszültséget mérem. Ezért kell az analóg bemenet.
(#) Kera_Will válasza Peet19 hozzászólására (») Júl 3, 2020 /
 
Amivel jobban jarnal mozgas erzekelonek azt PIR senzornak hivjak.
Passiv Infra Red sensor.
Par dollaros eszkoz , kimenete mar logikai jel a .... lesd meg adatlapjat a hestoreban .
(#) Peet19 válasza Kera_Will hozzászólására (») Júl 3, 2020 /
 
Megnézem, köszi.
(#) Kera_Will válasza Peet19 hozzászólására (») Júl 3, 2020 /
 
(#) Peet19 válasza Kera_Will hozzászólására (») Júl 3, 2020 /
 
Ja, így már más. Jó ötlet, köszönöm.
(#) slimcolt hozzászólása Júl 8, 2020 /
 
Sziasztok,

Egy PIC32MM-el szeretnék egy olyat megvalósítani, hogy az UART-on kapot byte-okat egy state-machine-al szétválogatom a beolvasás során. Én polling-ra gondoltam, hogy figyelem az URXDA bit-et és ha van elérhető karakter, akkor eldöntöm mit kezdjek vele. Tehát így nem egy bufferbe olvasnám be az adatot, hanem minden egyes byte-ot figyelnék, hogy éppen ami jött, mit kezdjek vele.
A kérdésem annyi, hogy az URXDA bit mikor kerül törlésre? Tegyük fel, hogy érkezett egy karakter, majd kiolvasom az UxRXREG-ből, ekkor törlődik az URXDA bit? Vagy erre az alkalmazásra a megszakítás jobb lenne? Igazából elég lenne a polling is, a lényeg hogy a beérkező byte-okon eltudjam végezni a hozzá tartozó műveletet.
(#) Hp41C válasza slimcolt hozzászólására (») Júl 11, 2020 /
 
Idézet:
„URXDA: UARTx Receive Buffer Data Available bit (read-only)”

Valami azt súgja nekem, hogy automatikusan törlődik.
(#) artur60 hozzászólása Júl 19, 2020 /
 
Sziasztok,

Pic32MX530F128H epprom írás nem sikerül 25AA256 eepromal 3,3V 2MHz. Ha 32 vagy 64 byte-ot írok akkor visszaolvasásnál megvan az adat, ha kevesebbet, vagy csak 1bytot magában akkor nem változik az eeprom tartalma. Ha debugger módban végig léptetem az írás lépésein akkor elmenti az adatokat. Levettem a sebességet 300KHz-re is akkor is ez a jelenség.


Van valakinek ötlete hol a hiba?

Itt vannak az írási program részek Piccoló project alapján, az inicializálás MCC generálta:

A System és PCB clock 48MHz.

  1. void SPI2_Initialize (void)
  2. {
  3.     // FRMERR disabled;
  4.     SPI2STAT = 0x0;
  5.     // SPI2BRG 16;
  6.     SPI2BRG = 0x49; // 0x49=300KHz 0x10= 2MHz
  7.     // AUDMONO disabled; AUDEN disabled; SPITUREN disabled; FRMERREN disabled; IGNROV disabled; SPISGNEXT disabled; SPIROVEN disabled; AUDMOD disabled; IGNTUR disabled;
  8.     SPI2CON2 = 0x0;
  9.     // MCLKSEL PBCLK; DISSDO disabled; SRXISEL Last Word is Read; CKP Idle:Low, Active:High; FRMEN disabled; FRMSYPW One-Clock; SSEN disabled; FRMCNT 1; MSSEN disabled; MSTEN Master; MODE16 disabled; FRMPOL disabled; SMP Middle; SIDL disabled; FRMSYNC disabled; CKE Idle to Active; MODE32 disabled; SPIFE Frame Sync pulse precedes; STXISEL Complete; DISSDI disabled; ON enabled; ENHBUF enabled;
  10.     SPI2CON = 0x18120;
  11.  
  12. }
  13.  
  14.  
  15. uint8_t ByteRead25AA128(uint16_t poz) {
  16.     if (SPI_EEPROM_IsReady()) { //Várunk, ha az EEPROM elfoglalt
  17.         SLAVE_ENABLE();
  18.         DELAY_microseconds(1);
  19.         SPI_EEPROM_TransRecevie8bit(CMD_WREN); //Írás újraengedélyezése    
  20.         SLAVE_DISABLE();
  21.         SLAVE_ENABLE();
  22.         DELAY_microseconds(1);
  23.         SPI_EEPROM_TransRecevie8bit(CMD_WRITE); //Adatblokk írása
  24.         SPI_EEPROM_TransRecevie8bit(poz>>8);
  25.         SPI_EEPROM_TransRecevie8bit(poz & 0xFF);
  26.         SPI_EEPROM_TransRecevie8bit(data);
  27.         SLAVE_DISABLE();
  28.     }
  29. void MemWrite25AA128(uint16_t poz, uint8_t *puff, uint8_t len) {
  30. if (SPI_EEPROM_IsReady()) { //Várunk, ha az EEPROM elfoglalt
  31.         SLAVE_ENABLE();
  32.         SPI_EEPROM_TransRecevie8bit(CMD_WREN); //Írás újraengedélyezése
  33.         SLAVE_DISABLE();
  34.         DELAY_microseconds(50);
  35.         SLAVE_ENABLE();
  36.         SPI_EEPROM_TransRecevie8bit(CMD_WRITE); //Adatblokk írása
  37.         SPI_EEPROM_TransRecevie8bit(poz >> 8);
  38.         SPI_EEPROM_TransRecevie8bit(poz & 0xFF);
  39.         for (i = 0; i < len; i++) {
  40.             SPI_EEPROM_TransRecevie8bit(*puff++);
  41.         }
  42.         SLAVE_DISABLE();
  43.     }


Próbáltam késleltetéseket is belerakni, SS lábak váltá az sem haszált
(#) Bakman válasza artur60 hozzászólására (») Júl 19, 2020 /
 
Idézet:
„Ha debugger módban végig léptetem az írás lépésein akkor elmenti az adatokat.”
Első ránézésre és az idézett mondatod alapján arra tippelnék, hogy előbb kerül H szintre a CS láb, mint hogy az SPI kommunikáció véget érne. Az utolsó (42. sor) SLAVE_DISABLE(); elé tegyél várakozást. Én a 35. és 36. sor közé is raknék.
(#) artur60 válasza Bakman hozzászólására (») Júl 20, 2020 / 1
 
Köszi a segítséget!
Azt hiszem megvan a hiba! a WP és a HOLD lábak lebegtek, csoda hogy így is ment.
(#) Peet19 hozzászólása Júl 20, 2020 /
 
Sziasztok!

A mellékelt képen a regiszter bankválasztó biteknél nem értek valamit. Ha a 01 = bank1 akkor hogy lehet hogy bank2 is 01? Ott nem 10 -nak kellene lennie?
Előre is köszi a segítséget.

stat_reg.png
    
(#) kissi válasza Peet19 hozzászólására (») Júl 20, 2020 /
 
Szia!

Ennél a kontroller családnál max.512 regiszter címzésére van lehetőség, melyek 9 bites címzést igényelnek ( 9 biten tudsz 512 kombinációt létrehozni!). Az utasítás gépi kódjába viszont csak 7 bitet tettek bele ( valószínűleg rendszerszervezési okokból !), így kell még további két bit a tényleges címzésnél! Regisztert kétféleképpen címezhetsz: közvetlenül (direkt) vagy közvetve (indirekt). Indirekt címzésnél egy regiszter (FSR regiszter) mondja meg, hogy igazából ki a címzett és ilyenkor az FSR 8 bitjét kiegészíti a STATUS reg. 7. bitje, így lehetővé teszi egy időben 256 regiszter címzését ( de a lehetséges 512 regiszter 2 részre van osztva a 7.bit által!). Ha direkt címzést használsz, akkor az utasításba csak a címzett regiszter 7 bitje fér bele és a tényleges címzéshez szükséges 2 további bitet a STATUS 6-5.bitje adja ( ezt nevezik BANK választásnak!) és így 4*128-as csoport érhető el!

Ha megnézed a direkt címzésnél ott van a 4-féle BANK kombináció a 6-5. biteken, de a 2-es BANK-ot eltévesztették, az tényleg 10 (binárisan) lenne ! !
(#) pipi válasza Peet19 hozzászólására (») Júl 20, 2020 /
 
Nyilván. Ha megnézed binárisan a bankbiteket, és decimálisan melyik bank...
Nem lehet hogy öreg doksit nézel?
(#) Peet19 válasza kissi hozzászólására (») Júl 20, 2020 /
 
Köszönöm, értem. Nem mondom hogy teljesen világos minden de szerintem pár nap múlva érteni fogok mindent. Csak még egy párszor át kell ismételgetnem .

pipi: sejtettem, köszi. Azt hiszem 2003-as a könyv amiből most tanulok.
(#) pipi válasza Peet19 hozzászólására (») Júl 20, 2020 /
 
A könyv mellé javaslom a "rendes" gyári adatlapot. ÉS van a majd minden procinak errata doksija, ahol leírják az "ismert" hibákat amik a doksiban és a processzorban vannak. Arra is figyelni kell időnkét a proci milyen REV számú mert lehet hogy a korábbi reviziójú prociban levő hibát javították. Mondjuk ezzel én csak akkor foglalkoztam, mikor belefutottam pl pic24-nél a soroson az adás kezelő bitek hibájába.
(#) Peet19 válasza pipi hozzászólására (») Júl 20, 2020 /
 
Ok. köszi. Nem tudom mi az errata doksi, de utána nézek. Egyenlőre csak általánosan tanulok, nem konkrét egy PIC érdekel, hanem mindegyik. Leginkább C-ben programozok, de úgy vettem észre hogy nem lehet kihagyni az Assembly-t.
(#) pipi válasza Peet19 hozzászólására (») Júl 20, 2020 /
 
Jó a C, én teljesen áttértem. Ha időkritikus a dolog csak akkor írnék asm betétet, de eddig nem kellett
(#) Peet19 válasza pipi hozzászólására (») Júl 20, 2020 /
 
Először C-ben akartam elkezdeni, de tényleg úgy vettem észre (ahogy a könyveket bújtam), hogy nem kerülhetem meg az asm-t. Szerintem így jobban megértem az egész működését. Aztán persze ha már megy "legalább az alap dolgok" akkor C-ben szeretnék próbálkozni.
(#) slimcolt hozzászólása Júl 23, 2020 /
 
Sziasztok,

PIC32mm0256gpm064-en szeretnék egy Change Notice megszakítást létrehozni, de sajnos nem sikerül A 8bit-es PIC-ek után ennek elég bonyolult a megszakítás vezérlője...

Az RC7-es lábon szeretnék lefutóélre egy megszakítást.
A TRIS beállítás helyes, mert megszakítás nélkül működik a láb bemenetként.
A beállítások:

#include <sys/attribs.h>

CNEN1Cbits.CNIE1C7 = 1; // RC7 lefutóél figyelés
CNCONCbits.CNSTYLE = 1;
CNCONCbits.PORT32 = 0;
CNCONCbits.ON = 1;

IEC0bits.CNCIE = 0;
INTCONbits.VS = 1;
INTCONbits.MVEC = 1;
INTCONbits.TPC = 0;
IPC2bits.CNCIP = 7;
IPC2bits.CNCIS = 0;
IFS0bits.CNCIF = 0;
IEC0bits.CNCIE = 1;

A megszakítási rutin:

void __ISR(_CHANGE_NOTICE_C_VECTOR, IPL7SOFT) demo_isr(void)
{
RED_LED = 1;
IFS0bits.CNCIF = 0;
}

Mi hiányzik még, hogy működjön?
(#) Broy hozzászólása Júl 27, 2020 /
 
Sziasztok!

Régebben már voltam itt, 16f1823-al próbálkoztam. Félbehagytam, most újra előjött a dolog. Először csak egy LED-es villogót szeretnék TMR0-val, de nem megy. Elvileg a belső oszcillátort 8Mhz-re állítottam, a TMR0-át 100Hz-re és 100 IRQ-nként invertálom a LED-et. A fordítást MPLABX/X(-al végzem. A LED folyamatosan világít. Mi lehet a probléma?

  1. #include <xc.h>
  2. #include <pic16f1823.h>
  3.  
  4. #define _XTAL_FREQ 8000000 //define crystal frequency to 8MHz
  5.  
  6. // CONFIG1
  7. #pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
  8. #pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
  9. #pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
  10. #pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
  11. #pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
  12. #pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
  13. #pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
  14. #pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
  15. #pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
  16. #pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
  17.  
  18. // CONFIG2
  19. #pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
  20. #pragma config PLLEN = ON       // PLL Enable (4x PLL enabled)
  21. #pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
  22. #pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
  23. #pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
  24.  
  25.  
  26. int counter = 0;
  27.  
  28. int main(int argc, char** argv)
  29. {
  30.     OSCCON = 0x60;
  31.     TRISC = 0x00; // Set C port as output
  32.  
  33.  
  34.   //Timer0 Registers Prescaler= 128 - TMR0 Preset = 101 - Freq = 100.81 Hz - Period = 0.009920 seconds
  35.  
  36.   OPTION_REG = 0x06;
  37.   TMR0 = 0x65;             // preset for timer register
  38.  
  39.   INTCON = 0;           // clear the interrpt control register
  40.   TMR0IE = 1;
  41.   GIE=1;          //Enable Global Interrupt
  42.  
  43.   while (1)
  44.   {
  45.    if (counter >= 100) {
  46.       RC0 = !RC0;
  47.       counter = 0;
  48.       };
  49.  
  50.    
  51.   };
  52. }
  53.  
  54. void interrupt Timer0_ISR(void)
  55. {
  56.   if(TMR0IF) // Timer flag has been triggered due to timer overflow
  57.     {
  58.         TMR0 = 0x65;     //Load the timer Value
  59.         TMR0IF=0;       // Clear timer interrupt flag
  60.         counter++;
  61.     }
  62. }
(#) pipi válasza Broy hozzászólására (») Júl 27, 2020 /
 
Hali!
Így messziről első ránézésre nagyon kevés regisztert inicializálsz, gyanús hogy még az analóg dolgokat ki kell kapcsolni.
Bővebben: Link
eszerint a 120 oldalon, az anselc-t is kell piszkálni. Azt is érdemes megszokni hogy amelyik picnél van LATx regiszter akkor kimenet esetén azt illik írni nem a PORTx-et
(#) Broy válasza pipi hozzászólására (») Júl 27, 2020 /
 
Köszi, megnézem. A mintaprogramokban, amiket néztem, még az OSCCON-t se babrálják.
Sima delay-es villogtatás ment a PORTx-el, de a LATx tényleg korrektebb.
(#) cross51 válasza slimcolt hozzászólására (») Júl 28, 2020 / 1
 
Itt a devhelp vegven latod hogy a golbal interruptot engedelyezni kell a __builtin_enable_interrupts() fuggvennyel.
(Ez ekvivalens az asm("EI")-vel)
(#) slimcolt válasza cross51 hozzászólására (») Júl 28, 2020 /
 
Köszi! Így működik.
Viszont csak a legelső lefutóélre generál megszakítást, utána már nem, hiába törlöm a flag bit-et. Érdekes. Nem tudom mi lehet a problémája...
(#) slimcolt válasza slimcolt hozzászólására (») Júl 28, 2020 /
 
A CNFx regiszter bitjét nem töröltem, ez volt a probléma. Most már OK.
(#) Broy válasza pipi hozzászólására (») Júl 29, 2020 /
 
Egy kis inicializálás és a Latx megoldotta a problémát. Még egy kérdésem lenne. XC8 alatt szeretném makrózni a portot (#define LED1 LATCbits.LATC0), hogy LED1 = !LED1 sort tudjak írni. De ez utóbbi 195 error-ral leáll fordításkor. Mi a hiba?
(#) pipi válasza Broy hozzászólására (») Júl 29, 2020 /
 
~ kell
(#) Broy válasza pipi hozzászólására (») Júl 30, 2020 /
 
~-vel is ugyanaz a hiba.
(#) usane válasza Broy hozzászólására (») Júl 30, 2020 /
 
Így írtad? :
LED1 = ~LED1;
Ennek mennie kell.
A hozzászólás módosítva: Júl 30, 2020
(#) Broy válasza usane hozzászólására (») Júl 30, 2020 /
 
Így írtam. Érdekes, ha annyit írok, hogy "LED1;" vagy "~LED1;", azt megeszi (de ezt nem tudom semmire sem használni). Lehet, hogy rosszul definiálom? Vagy valamit be kell állítani még? MPLABX és XC8 a környezet.
Következő: »»   1127 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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