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   1195 / 1206
(#) don_peter válasza asch hozzászólására (») Okt 19, 2023 /
 
Köszi.
Akartam írni tegnap, de a rendszer nem engedte, remélem most már jó lesz.
Én is így csináltam, annyi változással, hogy bites struktúrába rendeztem az elmentett adatokat és csak az aktuális bitekre hoztam létre feltételeket. Köszi a logikai leírást.
(#) don_peter válasza sonajkniz hozzászólására (») Okt 19, 2023 /
 
Köszi, tán az a rész nem jó számomra, hogy ha R és S nem változott, akkor értelem szerűen a T lesz. Mi van, ha éppen fázis kimaradás vagy valamilyen hiba lépet fel?
De köszi szépen a logika itt is szépen látszik, a szükséges hiba kezeléseket már megírtam, mert fontos, hogy ha kimarad vagy elmegy egy fázis vagy netán egyforma két fázis, akkor bizony azonnal hibát kell jelezzen a rendszer. Köszi srácok.
(#) KoblogPerGyok hozzászólása Okt 24, 2023 /
 
Üdv!

Megint nem értem pontosan mi történik, mert megint hulla fáradt is vagyok már.

Minden működik, de tényleg. UART-ról fogadok karaktereket, küldök sok adatot, de az SPI csak nem megy. Az is a baj, hogy Proteusban csak p33FJ32MC202-t tudok szimulálni, de nekem p33FJ128MC202-m van. A szimulációban minden tökéletes, simán jó. A valóságban meg....
Átírom mindenhol a header-eket, hogy a p33FJ128MC802.h forduljon bele a kódba. Feltöltöm, ráteszem az analizátort és a csatolt képet kapom. Elvileg RAM-ba kellene írni. Az írás nem jó, mert nagy vonalakban, mikor olvasnék ki akkor az óra jele megjelenik és jó. Előtte a három próbálkozás az az RAM felé az instrukció, cím felső byte, majd alsó byte, majd ami már jó, az az olvasás lenne. Nem tudom mia baj. Lehet kellene lehúzó ellenállás, meg ilyesmi, de akkor olvasáskor miért jó? Nem értem.
A MOSI sem jó, ott is hiba van, semmit nem csinál. A képen látszik, hogy az első 3 próbálkozás, ami a write lenne időben sem jó, sokkal rövidebb, nem csak hiányzik az óra impulzus sorozat.
Itt a kód:

  1. #include <p33FJ128MC802.h>
  2. //#include<p33FJ32MC202.h>
  3.  
  4.   void SPI_Master_Init(void)
  5.   {
  6.    
  7.      //SPI Error flag, overflow stb.
  8.      SPI1STATbits.SPIROV=0;
  9.      SPI1STATbits.SPITBF=0;
  10.      
  11.     //* The following code shows the SPI register configuration for Master mode */
  12.     IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
  13.     IEC0bits.SPI1IE = 0; // Disable the Interrupt
  14.     // SPI1CON1 Register Settings
  15.     SPI1CON1bits.DISSCK = 0; // Internal Serial Clock is Enabled
  16.    
  17.     SPI1CON1bits.DISSDO =0; // SDOx pin is controlled by the module
  18.    
  19.     SPI1CON1bits.MODE16 = 0; // Communication is word-wide (16 bits)
  20.     SPI1CON1bits.SMP = 0; // Input data is sampled at the middle of data
  21.    
  22.     // output time
  23.     SPI1CON1bits.CKE = 0; // Serial output data changes on transition
  24.     // from Idle clock state to active clock state
  25.     SPI1CON1bits.CKP = 0; // Idle state for clock is a low level;
  26.     // If CKP = 0, always place a pull-down
  27.     //resistor on SSx.
  28.     // active state is a high level
  29.     SPI1CON1bits.MSTEN = 1; // Master mode Enabled
  30.    
  31.     //Most 1:64 és 1:8!!
  32.     //Oszcillátor leosztása://bit 1-0 PPRE<1:0>: Primary Prescale bits (Master mode)(3)
  33.     //    //11 = Primary prescale 1:1
  34.     //    //10 = Primary prescale 4:1
  35.     //    //01 = Primary prescale 16:1
  36.     //    //00 = Primary prescale 64:1
  37.     //    SPI1CON1bits.PPRE = 0b10;
  38.     //    //bit 4-2 SPRE<2:0>: Secondary Prescale bits (Master mode)(3)
  39.     //    //111 = Secondary prescale 1:1
  40.     //    //110 = Secondary prescale 2:1
  41.  
  42.     SPI1CON1bits.PPRE = 0b00; //10 = Primary prescale 64:1
  43.     SPI1CON1bits.SPRE = 0b110; //110 = Secondary prescale 2:1
  44.  
  45.     //SPI1STATbits.SPIEN = 1; // Enable SPI module
  46.  
  47.  
  48.     //SPI1BUF = 0b11111111; // Write data to be transmitted
  49.     // Interrupt Controller Settings
  50.     IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
  51.     IEC0bits.SPI1IE = 1; // Enable the Interrupt
  52.  
  53.   }
  54.   void Write_SPI(unsigned char data)
  55.   {
  56.     IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
  57.     SPI1STATbits.SPIEN = 1; // Enable SPI module    
  58.     SPI1BUF = data;     // Write character to SPI buffer
  59.     while(SPI1STATbits.SPITBF) ;  // Wait until transmission is started
  60.     IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
  61.     SPI1STATbits.SPIEN = 0; // Enable SPI module    
  62.    
  63.   }
  64.   char SPI_Read(void)
  65. {    
  66.     IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
  67.     SPI1STATbits.SPIEN = 1; // Enable SPI module  
  68.     SPI1STATbits.SPIROV = 0;  // Reset overflow bit
  69.      char C;
  70.     SPI1BUF=0x0;
  71.     SPI1STATbits.SPIRBF  =0x00;
  72.    
  73.      while (!SPI1STATbits.SPIRBF); // Wait for character
  74.      SPI1STATbits.SPIROV = 0;  // Reset overflow bit
  75.     C = SPI1BUF & 0xff;    // Get character
  76.     IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
  77.     SPI1STATbits.SPIEN = 0; // Enable SPI module      
  78.    
  79.     return(C);
  80. }


Elvileg a pin remapping jó, mert akkor nem jelenne meg az óra, mikor a read()-t hívom meg. A csatolt képen látszik a hiba, de olvasáskor a megjelenő óra ideje jó, 80 MHz van leosztva 128-al.
A hozzászólás módosítva: Okt 24, 2023
(#) pipi válasza KoblogPerGyok hozzászólására (») Okt 24, 2023 / 1
 
Szerintem ne szimulálj Debuggered nincs? mivel tolod fel a programot?
(#) KoblogPerGyok válasza pipi hozzászólására (») Okt 24, 2023 /
 
PICKIT-3-al. A debugot nem tudom még hogyan kell használni. A logikai analizátor mutatja, hogy mi a helyzet. Nem jó!
A hozzászólás módosítva: Okt 24, 2023
(#) Bakman válasza KoblogPerGyok hozzászólására (») Okt 24, 2023 / 1
 
Nem ismerem ezt a PIC-et, de ha a kódban lévő megjegyzések jók, akkor:

SPI1BUF = data;
várakozás, amíg elindul az adás
flag törlés
SPI modul kikapcs

Nem lehet, hogy túl korán kapcsolod ki az SPI modult? Egyáltalán miért kell ki-be kapcsolgatni?
(#) KoblogPerGyok válasza Bakman hozzászólására (») Okt 24, 2023 /
 
Nekem sem világos, ezt valahonnan nyestem, a szimulációkban ok minden.

Adatlapból:

Idézet:
„bit 1 SPITBF: SPIx Transmit Buffer Full Status bit
1 = Transmit not yet started, SPIxTXB is full
0 = Transmit started, SPIxTXB is empty
Automatically set in hardware when CPU writes SPIxBUF location, loading SPIxTXB
Automatically cleared in hardware when SPIx module transfers data from SPIxTXB to SPIxSR”


Eddig azt hittem az a while azt csinálja, hogy megvárja, mire vége lesz az átvitelnek. Itt lehet a hiba? Nincs vége, de már bezárom? Ok, kipróbálom, majd, hogy csak az init-ben indítom el és nem kapcsolom ki. De addig is nincs olyan lehetőség, while, ami megmondja, hogy mikor ment át az adat? Hasonlóan a read-nél lévőnél? Melyik regiszter és bitje lehet ez. Sajnos most nem látom már át rendesen.
A hozzászólás módosítva: Okt 24, 2023
(#) Hp41C válasza KoblogPerGyok hozzászólására (») Okt 25, 2023 /
 
- Nem kell kikapcsolni az SPI modult, főleg nem egy távirat közepén (Write_SPI).
- HA beírunk egy adatot az adó bufferébe, akkor nyilván tele van a buffer (SPITBF == 1). Meg kell vérni, amíg üres lesz.
  1. void Write_SPI(unsigned char data)
  2.   {
  3.     IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
  4.     SPI1STATbits.SPIEN = 1; // Enable SPI module    
  5.     SPI1BUF = data;     // Write character to SPI buffer
  6.     while(!SPI1STATbits.SPITBF) ;  // Wait until transmission is started
  7.     IFS0bits.SPI1IF = 0; // Clear the Interrupt Flag
  8.   }
(#) KoblogPerGyok válasza Hp41C hozzászólására (») Okt 25, 2023 /
 
Köszönöm!

Több hiba is volt, nem csak ez.
- Mivel több bytenak ki kell mennie a RAM felé, ezért nem szabad mgszakítani
- A /CS select láb pillanatra sem szakadhat meg.
- Amit írtál, plusz, mivel több byte megy ki egymás után, amit a kód többi része egymás után küldi ki, gyorsabban, mint ahogy kimenne az SPI-n, meg kell oldani, hogy az SPI wrire/read várjon, míg kész nincs. Ennek egy kis trükkje is van, mivel ugyanaz a buffer, de végül megy. Amit írtál az addig vár, míg az esetleges előző adat még ki nem ment. De mivel gyorsan küldeném az adatokat a kódból, ezért meg kell várni míg kész nincs. RAM-nak kell 1 byte instrukció, 2 Byte cím, és 1 byte adat. Azaz minden egyes byte-ot meg kell várni. Mindeközben a /CS nem szakadha meg. Miután a várakozás megoldódott rögtön lehetett látni a többi hibát, amit perc volt javítani.
Mert valójában olyan, mintha két szál indulna el. Egy a fő program, a másik pedig egy timer vezérelte eseméy. A kettő nincs szinkronban, azaz kiküldüm a RAM_Write függvénnyel az adatot, amiben 4 Byte lesz végül, még ki sem ment, már küldené a másikat. Erre is figyelni kell.
A hozzászólás módosítva: Okt 25, 2023
(#) sonajkniz válasza KoblogPerGyok hozzászólására (») Okt 25, 2023 /
 
Na pont ez a bajom a PIC-ek hardveres kommunikációjával.
Hogy nincs egy nagyobb buffer, vagy nem jelölhető ki egy adott memóriaterület buffernek, hogy oda beteszek x byteot, azt küldi. Vagy fogad x byteot, azután szól.
Mivel csak egyesével küldhető - fogadható, értelmetlen. Akkor már inkább küldöm szoftveresen, legalább átlátom az egész folyamatot.
(#) majkimester válasza sonajkniz hozzászólására (») Okt 25, 2023 /
 
Erre van a megszakítás. Csinálsz magad egy ring buffert, amibe berakod a kiküldeni kívánt byte-okat. Elindítod az első byte küldését, majd ha az UART/SPI/I2C modul 1 byte-os buffere kiürül, akkor keletkezik egy megszakítás, amivel a saját bufferedből veszed a következő byte-ot a kiküldésre. A főprogramnak nem kell várnia ha elég nagy a buffered, ha kiment egy byte a IT küldi a következőt. Közben a főprogram csinálhat mást. A fogadás is hasonlóan megvalósítható. Példa ITT

Szoftveres küldésnél a küldés alatt nem csinálhatsz mást még IT-ből sem.
(#) KoblogPerGyok válasza majkimester hozzászólására (») Okt 25, 2023 /
 
Hát, egyelőre nem értem ezt pontosan, de értem nagyjából ezt. A hiba nem annyira a PiC-ben van szerintem, hanem abban, hogy igen tömören fogalmaz minden datasheet. A megoldás ugyan benne van, de a pontos példa kódok nem. Azaz leír egy megoldást, egy példát az írásra, olvasásra, de ilyen problémra nem térnek ki. Utólag persze minden tökéletesen érthető, de az oda vezető út kicsit rázós volt. Főleg a buffer cseréje, ami megoldja a várakozás problémáját. Az nélkül nem megy.

A másik igen fonts tapasztalat, hogy a szimulációk néha köszönő viszonyban sincsenek a valósággal. Engem ez is megvezetett, folyton hardver hibára gondoltam. Forrasztás, eleve hibás IC-k stb. De nem, a hiba logikai volt.

De nagyon örülök, hogy megy, simán megy a LED villogtatás, UART-ról adat fogadás/küldés, miközben SPI-RAM is tökéletesen fut. A szerencsétlen RAM még úgy is megy, hogy párszor elgörbültek a lábai.
Valamelyik kolléga itt említette, hogy logikai analizátor nélkül nem megy. Igza volt! Persze kellett oszcilloszkóp is...

Lehet ez nem éppen kezdő kérdés volt különben.
A hozzászólás módosítva: Okt 25, 2023
(#) Bakman válasza majkimester hozzászólására (») Okt 25, 2023 /
 
Vagy DMA használata, már ha tudja a kontroller.
(#) majkimester válasza KoblogPerGyok hozzászólására (») Okt 25, 2023 /
 
Az előző hozzászólás mondjuk nem a kezdőknek ajánlott, de tudjuk sonajkiz már rég óta gyűri a PIC-eket, nem árt továbblépnie a SW UART-ról, ha akar.

A dsPIC sorozatnál már az adatlap magában kevés, de van családonként egy sokrészes Reference Manual sorozat, annak a megfelelő részét kell fellapozni, pl. SPI a te konrolleredhez: ITT

Az adatlap az SPI-t 6 oldalban foglalja össze, a RefManu SPI fejezet lényegi része meg 37 oldal, példákkal is megtűzdelve.

Ahogy Bakman említette van DMA is bizonyos kontrollerekben, például a te kontrolleredben is, sok adat mozgatásánál jól jöhet.
(#) Kera_Will válasza majkimester hozzászólására (») Okt 26, 2023 /
 
Idézet:
„említette van DMA is bizonyos kontrollerekben”

Az ős öreg Z-80 is tudta már ezt
A hozzászólás módosítva: Okt 26, 2023
(#) majkimester válasza Kera_Will hozzászólására (») Okt 26, 2023 /
 
Igen, bár nem a Z80 CPU-ban volt ilyen lehetőség, hanem a periféria családba tartozott egy DMA kontroller IC is. Viszont a DMA nem jellemző a low és mid range mikrokontrollerekre, mert ezeknek más a célja mint egy mikroprocesszornak, ritkán mozgatnak sok adatot, a 24 és dsPIC család viszont tartalmaz már DMA-t, ha nem is minden típus.
(#) Hp41C válasza majkimester hozzászólására (») Okt 27, 2023 /
 
(#) Laja1 hozzászólása Nov 2, 2023 /
 
Sziasztok!

Azt olvastam valahol, hogy előre megírt függvények vannak az MPLAB X IDE v5.50 környezetben. Hogyan lehet ezeket előcsalni?

Köszönöm!
(#) pipi válasza Laja1 hozzászólására (») Nov 2, 2023 /
 
Mire is gondolsz pontosan? Megnézed az include fájlokat, benne vannak a definíciók...
Egyébként meg külön letölthető graphics, tcpip stb library a Microchiptől.
Mostanában nem néztem, de külön letölthető a Microchip Code Configurátor...
(#) Bakman válasza Laja1 hozzászólására (») Nov 2, 2023 /
 
Ha a Code Configuratorra gondolsz, itt találsz róla némi infót: MPLAB® Code Configurator.
(#) don_peter hozzászólása Nov 3, 2023 /
 
Srácok MPLAB X stimulus létrehozásában van valaki aki jártas?
Tesztelném a programomat és a 3 fázist illetve a 3 fázis okozta különböző megszakításokat kellene tesztelnem szimulátorban.

Meg lehet ezt egyáltalán tenni?
Köszi előre is.
A hozzászólás módosítva: Nov 3, 2023
(#) Hp41C válasza don_peter hozzászólására (») Nov 3, 2023 /
 
Csak az MpLba 8 -on használtam stimulust.
Itt lehet találni módszereket.
Register injection: Egy regiszter értékét lehet a stimulussal beállítható idővel vagy időközönként módosítani.
(#) don_peter válasza Hp41C hozzászólására (») Nov 3, 2023 /
 
Igen, google-val kezdtem én is. MBLAB X kicsit bohóckodik, de biztosan rájövök egy helyes beállításra. Egyszer..
(#) Laja1 hozzászólása Nov 7, 2023 /
 
Sziasztok!

Tudnátok segíteni, hogy vajon a valóságban miért nem működik ez a program? 4 bites LCD vezérlés. Az Az A0 bemeneten lévő feszültséget szeretném kijeleztetni. A D0-t kötöttem az LCD D4 lábára...... és a D3 kimenetet a D7 lábára. Azt gondolom, hogy az iniciálást ronthattam el. (8 bites vezérléssel működik) Az MPLAB szimulátora alapján a PORTD rendben van. PIC16F877A mikrovezérlőt használok és 2×16-os LCD kijelzőt.
Köszönöm!
  1. #include <xc.h>
  2. #include <pic.h>
  3. #define delay for (i=0; i<=1000;i++)
  4. #define rs RC0
  5. #define rw RC1
  6. #define e RC2
  7.  
  8. __CONFIG( FOSC_HS & WDTE_OFF & PWRTE_OFF & CP_OFF & BOREN_ON & LVP_OFF & CPD_OFF & DEBUG_OFF);
  9.  
  10. void adc ();
  11.  
  12. void lcd_int ();
  13. void cmd (unsigned char a);
  14.  
  15. void dat (unsigned char b);
  16. void show (unsigned char *s);
  17.  
  18.  
  19. int i;
  20.  
  21.  
  22. void main()
  23. {
  24.     TRISB=TRISC=TRISD=0;
  25.     TRISA0=1;
  26.     lcd_int();
  27.     show("Feszultseg=");
  28.     while (1)
  29.     {
  30.         cmd(0x8C);
  31.         adc();
  32.     }
  33.    
  34.    
  35. }
  36.  
  37. void lcd_int()
  38. {
  39.     delay;
  40.     cmd(0x30); // beindítás a biztonság kedvéért
  41.     delay;
  42.     cmd(0x30);
  43.     delay;
  44.     cmd(0x30);
  45.     cmd(0x20); // 4 bites, kétsoros, 5×11 dots
  46.     cmd(0x28); // 4 bites, kétsoros, 5×11 dots
  47.     cmd(0x0C); // Képernyő bekapcsolva, kurzor és a villogása kikapcsolva
  48.     cmd(0x06); //Entry Mode
  49.     cmd(0x80); //kurzor az 1. sor 1. helyén
  50. }
  51.  
  52.  
  53. void cmd(unsigned char a)
  54. {
  55.      unsigned char d;
  56.     d=(a>>4);
  57.     PORTD=(PORTD&0xF0);
  58.     PORTD=d;
  59.     rs=0;
  60.     rw=0;
  61.     e=1;
  62.     delay;
  63.     e=0;
  64.     delay;
  65.     d=(a&0x0F);
  66.    
  67.     PORTD=(PORTD&0xF0);
  68.     PORTD=d;
  69.     rs=0;
  70.     rw=0;
  71.     e=1;
  72.     delay;
  73.     e=0;
  74. }
  75.  
  76. void dat(unsigned char b)
  77. {
  78.     unsigned char c;
  79.    
  80.     c=(b>>4);
  81.     PORTD=(PORTD&0xF0);
  82.     PORTD=c;
  83.     rs=1;
  84.     rw=0;
  85.     e=1;
  86.     delay;
  87.     e=0;
  88.     delay;
  89.     c=(b&0x0F);
  90.     PORTD=(PORTD&0xF0);
  91.     PORTD=c;
  92.     rs=1;
  93.     rw=0;
  94.     e=1;
  95.     delay;
  96.     e=0;
  97. }
  98.  
  99. void show(unsigned char *s)
  100. {
  101.     while(*s)
  102.     {
  103.         dat(*s++);
  104.     }
  105. }
  106.  
  107.  
  108. void adc()
  109. {
  110.    unsigned int adcval;
  111.    
  112.     ADCON1=0xC0;
  113.     ADCON0=0x85;
  114.     while(GO_nDONE);
  115.     adcval=((ADRESH<<8)|(ADRESL));
  116.    // adcval=(adcval/3)-1;
  117.     adcval= adcval*4.8875;
  118.    dat((adcval/1000)+48);
  119.     dat(((adcval/100)%10)+48);
  120.     dat(((adcval/10)%10)+48);
  121.     dat((adcval%10)+48);
  122.    // dat(adcval+48);
  123.    
  124.     }
A hozzászólás módosítva: Nov 7, 2023
(#) Laja1 válasza Laja1 hozzászólására (») Nov 9, 2023 /
 
Megoldódott! Segítségképpen, ha esetleg másoknak is hasonló problémája lenne, az volt a baj, hogy a 0x30-as és a 0x20-as parancsot még 8 biten kell kiadni és csak ez után 2×4 biten.
(#) Bubu58 hozzászólása Nov 15, 2023 /
 
Üdv. Mindenkinek! Kérdezném, hogy vállalna-e valaki egy PIC18F458-as kicserélését programozással.
Köszönöm.
(#) don_peter válasza Bubu58 hozzászólására (») Nov 15, 2023 /
 
Pár infó azért még nem ártana hozzá. Pl. ki van vezetve a programozó felület? Meg van az eredeti hex állomány? Hogy néz ki a panel, amelyen dolgozni kellene? Kb. ilyen kérdések biztos érdekesek, annak aki vállalná.
(#) bitmixer válasza Bubu58 hozzászólására (») Nov 16, 2023 /
 
Ha jobban körülírod a feladatot (akár magánban is), lehet, hogy vállalom (Bp. 1173)
(#) Bubu58 válasza don_peter hozzászólására (») Nov 16, 2023 /
 
Üdv. Ez egy op-com. Hamis PIC18FXXXX-el. Egyébként működik. Azt hiszem,hogy kint kell felprogramozni.
(#) Bubu58 válasza bitmixer hozzászólására (») Nov 16, 2023 /
 
Üdv. Ez egy op-com. Hamis PIC18FXXXX-el. Azt hiszem kint kell a programot rátenni.
Következő: »»   1195 / 1206
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