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   949 / 1209
(#) rolandgw válasza Hp41C hozzászólására (») Máj 12, 2017 /
 
A Mikroelektonika jó fejlesztőeszközöket készít, de a fordítói kis túlzással kb. vicc kategória, Avr-nél is. Másrészt aki - többek között- azt sem tudja mi a pointer, ne írjon C programot. Elnézést a szerzőtől! A C-t nem MCU fejlesztőkörnyezetben kell megtanulni, ott használni kell.
(#) Hp41C válasza usane hozzászólására (») Máj 12, 2017 /
 
Eddig rendben is lenne, sok feladatnál majdnem mindegy, hogy mekkora a kód. De itt arról volt szó, hogy a LED -ek beállításának ideje és a delay_us(220) 200us ideje milyen viszonyban van egymással.
(#) Hp41C válasza sonajkniz hozzászólására (») Máj 12, 2017 /
 
18F -en egy utasítás két byte (goto, call, lfsr, movff 4 byte, movffl 6 byte). A program memória címzése byte alapú.
A hozzászólás módosítva: Máj 12, 2017
(#) Hp41C válasza rolandgw hozzászólására (») Máj 12, 2017 /
 
Ez itt a kezdők rovata. Amikor valaki kezdőként az első (néhányadik) C programját írja, nem sok fogalma van a pointerek használatáról...
(#) slimcolt hozzászólása Máj 12, 2017 /
 
Sziasztok,

Próbálgatom használni a megszakításokat, egyenlőre még az IOC megszakításoknál tartok.
Írtam egy egyszerű kódot a gyakorlásra (PIC16LF1825), MPLAB-ban működik, de Proteus-ban nem
Mit rontok el? Kérlek segítsetek!

  1. // CONFIG1
  2. #pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
  3. #pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
  4. #pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
  5. #pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
  6. #pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
  7. #pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
  8. #pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
  9. #pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
  10. #pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
  11. #pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
  12.  
  13. // CONFIG2
  14. #pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
  15. #pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled)
  16. #pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
  17. #pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
  18. #pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)
  19.  
  20. #include <xc.h>
  21.  
  22. void interrupt RST() // Ha RA4 vagy RA5 bemenetre lefutóél érkezik, akkor az IOCAF regiszterbe tárolja az eseményt.
  23. {
  24.     if (IOCAFbits.IOCAF4 & IOCAFbits.IOCAF5) // HA RA4 és RA5-re is érkezett lefutó él.
  25.     {
  26.         RESET(); // Meghív minket egy sörre.
  27.     }
  28.     IOCAF = 0; // IOCAF flag bitek törölve.
  29. }
  30.  
  31. void main(void)
  32. {
  33.     OSCCON = 0b00111010; // 4XPLL kikapcsolva, Belső oszcillátor 500kHz-en.
  34.     TRISA = 0b00110100; // PORTA RA2 - RA4 - RA5 bemenetre állítva.
  35.     ANSELA = 0b00000000; // Digitális I/O engedélyezve PORTA-n.
  36.     IOCAN = 0b00110000; // RA4 - RA5-ön lefutóél vezérelt IOC beállítva.
  37.     TRISC = 0b00000000; // PORTC kimenetre állítva.
  38.     ANSELC = 0b00000000; // Digitális I/O engedélyezve PORTC-n.
  39.     INTCONbits.IOCIE = 1; // IOC engedélyezve.
  40.     INTCONbits.GIE = 1; // Globális megszakítások engedélyezve.
  41.     LATC = 0b00000000; // PORTC minden kimenete 0.
  42.    
  43.     if (PORTAbits.RA2 == 1) // Ha RA2 = 1 akkor LATC RC4 és RC5 kimenete 1.
  44.     {
  45.         while(1)
  46.         {
  47.             LATC = 0b00110000;
  48.         }
  49.     }
  50. }
(#) pajti2 válasza slimcolt hozzászólására (») Máj 12, 2017 /
 
És pic-ben működik?
(#) Net_Boy_debr hozzászólása Máj 12, 2017 /
 
Sziasztok!
PIC24fj128ga010 mikrokontroller programozását kezdtem el most tanulgatni és szeretnék segítséget kérni egy egyszerű feladat megvalósításában. A célom az lenne, hogy a PIC két kimenetén egy-egy darab LED-et szeretnék felváltva villogtatni 1 másodpercenként. Mit ajánlanátok, hogy valósítsam meg a feladatot? A lényeg az lenne, hogy az alap villogtatás között más feladatokat is szeretnék végrehajtani a jövőben, pl. soros porti kezelés, egyéb LED-ek vezérlése, nyomógomb. Milyen megoldást alkalmazzak? PIC timer? megszakítás? Valakinek nincs véletlenül egy hasonló feladatra készített forráskódja C-re?
Előre is köszönöm a segítséget!
(#) slimcolt válasza pajti2 hozzászólására (») Máj 12, 2017 /
 
Hát szívesen kipróbálnám, de még úton van a Pickit3
(#) Tasznka válasza Net_Boy_debr hozzászólására (») Máj 12, 2017 /
 
Szia!
Ha most kezded,akkor másik Pic-et válassz...ennek eléggé karcsú az újraírhatósága.Igen majd timer kell,megszakítással.
Jó lenne tudni,hogy pl.külső oszcit szeretnél használni,vagy belsőt? , a ledeket hová szeretnéd kötni?,... Csak ezek után tudunk valamit mutatni....Kellene valami rajz,hogy mit hová kötnél.
(#) Hp41C válasza Net_Boy_debr hozzászólására (») Máj 12, 2017 /
 
(#) Hp41C válasza usane hozzászólására (») Máj 12, 2017 /
 
Kényelmes fejleszteni, gyötrelmes kivárni amíg lefut... Lassan már a levélíráshoz is 64Gbyte RAM kell
A hozzászólás módosítva: Máj 12, 2017
(#) cross51 válasza slimcolt hozzászólására (») Máj 12, 2017 /
 
Ez a sor
  1. if (IOCAFbits.IOCAF4 & IOCAFbits.IOCAF5)


nem ez akart lenni?
  1. if (IOCAFbits.IOCAF4 && IOCAFbits.IOCAF5)


Nem tudom, hogy az XC8 bitek AND-elésén mit értene, de (én a) másodikat ismerem helyesként erre az esetre.
Logikai AND-et akarsz csinálni, hogy mind a két érték = '1' nem össze AND-elni a két értéket.
(#) ktamas66 válasza slimcolt hozzászólására (») Máj 12, 2017 /
 
Ez így csak akkor működne, ha egy IT-n belül, kb. egyszerre megy le a két lábon a jel. Ha kis késés van köztük, akkor az első lefutó él lekezelése után törlöd az IOCAF regisztert, így soha nem lesz benne két egyes. Különben is, ha jól értelmezem, neked nem a lefutó él a feltétel, hanem a két nulla szint. Én az IOC-t csak a változás detektálására használnám, a reset feltételénél a port állapotát tenném be.
(#) kriszrap válasza Hp41C hozzászólására (») Máj 13, 2017 /
 
Idézet:
„Elkezdtem nézegetni:
- Ahogy írták már mások is kitörlődött / megszökött egy sor. A pa deklarációja után kimaradt az értékadás.[quote] pa = & l[i][0];”

- Milyen típusa is van a pa mutatónak? Olyannak kellene lennie, mint az l[][] tömb elemeinek. Azonban a int *pa; a deklarációja, az tömb pedig char l[6][26]; A char *pa; a jó megoldás.
/// Az int ebben a fordítóban 16 bites (2 byte - os), a char pedig 8 bites (1 byte - os). Az int típusra mutatóként deklarált változó a ++ műveletre 2 byte -tal megy arrébb a memóriában.

A Watch ablakba vedd fel a ps és a l változót és figyeld az értéküket.

A ledkockanagy_2 képen az is látszik, hogy a pa változó szépen ellépkedett az l[1][25] címére. Így nem használható az oszlopok() hívásában paraméternek. Az is látszik a ledkockanagy_3 képen, hogy az indexelés milyen műveleteket hajt végre ... CALL _Mul_16x16_U, 0 Nini egy szorzó rutin...[/quote]

Most volt időm felnézni ...
Idézet:
„pa = & l[i][0];”
Nem is értem hogy nem került bele a kódba...
int *pa állítsam át char *pa..
Idézet:
„Így nem használható az oszlopok() hívásában paraméternek”
Ezért hagytam a sima indexelést ha az nem probléma? lesz egy pici időm megnézem és írom mire jutottam.
(#) slimcolt hozzászólása Máj 13, 2017 /
 
Sziasztok,

Még mindig problémázok Bemásolom ide a teljes kódomat. Sajnos már minden ötletből kifogytam, ezért kérném a segítségeteket!
A program jól működik, a baj akkor kezdődik ha INTCONbits.GIE = 1; -re beállítom, mert szeretnék megszakításokat használni.
Mert akkor ugyanis csak annyit csinál ha elindítom (a proteus szimulációt), hogy PORTC = 0b00110110 értékre állítja (?), és hiába csinálok akármit, semmire nem reagál.
Most vagy a kódban van a hiba, vagy kihagytam valamit?

  1. #include <xc.h>
  2. #include "config.h"
  3. #define _XTAL_FREQ 500000
  4.  
  5. void interrupt IOC()
  6. {
  7.     if (IOCAFbits.IOCAF4 || IOCAFbits.IOCAF5)
  8.     {
  9.         IOCAF = 0;
  10.         if (PORTAbits.RA4 == 0 && PORTAbits.RA5 == 0)
  11.         {
  12.             RESET();
  13.         }
  14.     }
  15.     if (IOCAFbits.IOCAF2)
  16.     {
  17.         IOCAF = 0;
  18.     }
  19. }
  20.  
  21. void main(void)
  22. {
  23.    
  24.     OSCCON = 0b00111010; // 4XPLL kikapcsolva, 500Khz belső oszcillátor kiválasztva.
  25.     TRISA = 0b00110100; // PORTA bemenetei beállítva.
  26.     LATA = 0; // PORTA kimenetei 0-ra állítva.
  27.     INLVLA = 0b00110100; // RA2-RA4-RA5-re Shmitt trigger inputok beállítva.
  28.     ANSELA = 0b00000000; // Digitális I/O engedélyezve PORTA-n.
  29.     TRISC = 0b00000000; // PORTC kimenetre állítva.
  30.     ANSELC = 0b00000000; // Digitális I/O engedélyezve PORTC-n.
  31.     IOCAP = 0b00110000; // RA4 és RA5-ön felfutó él IOC
  32.     IOCAN = 0;
  33.     INTCONbits.IOCIE = 1; // IOC engedélyezve
  34.     INTCONbits.GIE = 1; // Globális megszakítások engedélyezve.
  35.            
  36.     unsigned char BP = 0;
  37.     unsigned char RES;
  38.     unsigned int WAIT;
  39.     unsigned char PUSH = 0;
  40.            
  41.     while (1)
  42.     {      
  43.         if (PORTAbits.RA4 && PORTAbits.RA5) // Ha RA4 ÉS RA5 = 1
  44.         {
  45.            
  46.             IOCAN = 0b00110100; // RA2-RA4-RA5-ön lefutóél IOC engedélyezve.
  47.             IOCAP = 0b00000100; // RA2-n felfutó él IOC engedélyezve.
  48.                              
  49.             LATCbits.LATC3 = 1;
  50.             LATCbits.LATC5 = 0;
  51.             LATCbits.LATC1 = 1;
  52.                
  53.             while (PORTAbits.RA4 || PORTAbits.RA5) // Ha RA4 VAGY RA5 = 1.
  54.             {
  55.                 if (PORTAbits.RA2 == 1 && PUSH == 0) // Ha megvan nyomva a gomb.
  56.                 {
  57.                     if (BP == 0)
  58.                     {
  59.                         BP = 1;
  60.                         PUSH = 1; // Gomb nyomás érzékelése és tárolása.
  61.                         LATCbits.LATC5 = 1;
  62.                         LATCbits.LATC2 = 1;
  63.                         LATCbits.LATC1 = 0;
  64.                         __delay_ms(5);
  65.    
  66.                         for (RES = 0; RES <= 200; RES++)
  67.                         {
  68.                             if (PORTAbits.RA5 == 1)
  69.                             {
  70.                                 break;
  71.                             }
  72.                             __delay_us(200);
  73.                         }
  74.                        
  75.                         LATCbits.LATC4 = 0;
  76.                        
  77.                         for (WAIT = 0; WAIT <= 2500; WAIT++ ) // Gomb hosszan nyomásának érzékelése.
  78.                         {
  79.                             if (PORTAbits.RA2 != 1) // Ha nincs megnyomva a gomb, akkor a for ciklus megszakítva.
  80.                             {
  81.                                 break;
  82.                             }
  83.                             __delay_us(200);
  84.                         }
  85.                            
  86.                         if (WAIT >= 2500) // Ha minimum 2mp-ig nyomták a gombot.
  87.                         {
  88.                             LATCbits.LATC5 = 1;
  89.                             LATCbits.LATC4 = 1;
  90.                             LATCbits.LATC2 = 1;
  91.                             LATCbits.LATC1 = 1;
  92.                                
  93.                         }
  94.                        
  95.                     }
  96.                     else
  97.                     {
  98.                         BP = 0;
  99.                         PUSH = 1; // Gomb nyomás érzékelése és tárolása.
  100.                         LATCbits.LATC4 = 1;
  101.                         LATCbits.LATC1 = 1;
  102.                         LATCbits.LATC2 = 0;
  103.                         __delay_ms(5);
  104.                            
  105.                         for (RES = 0; RES <= 200; RES++)
  106.                         {
  107.                             if (PORTAbits.RA4 == 1)
  108.                             {
  109.                                 break;
  110.                             }
  111.                             __delay_us(200);
  112.                         }
  113.                        
  114.                         LATCbits.LATC5 = 0;
  115.                        
  116.                         for (WAIT = 0; WAIT <= 2500; WAIT++ ) // Gomb hosszan nyomásának érzékelése.
  117.                         {
  118.                             if (PORTAbits.RA2 != 1) // Ha nincs megnyomva a gomb, akkor a for ciklus megszakítva.
  119.                             {
  120.                                 break;
  121.                             }
  122.                             __delay_us(200);
  123.                         }
  124.  
  125.                         if (WAIT >= 2500) // Ha minimum 2mp-ig nyomták a gombot.
  126.                         {
  127.                             LATCbits.LATC4 = 1;
  128.                             LATCbits.LATC5 = 1;
  129.                             LATCbits.LATC1 = 1;
  130.                             LATCbits.LATC2 = 1;
  131.                             BP = 1;
  132.                                     }
  133.                     }
  134.                 }
  135.                 if (PORTAbits.RA2 == 0 && PUSH == 1) // nyomógomb elengedésének érzékelése.
  136.                 {
  137.                     PUSH = 0;
  138.                 }
  139.                 SLEEP (); // Ha alszik, RA2-RA4-RA5 lefutó és RA2 felfutóél IOC ébreszti.
  140.             }
  141.         }
  142.         else // Ha RA4 ÉS RA5 != 1. akkor PORTC beállítása és mars aludni, RA4 és RA5 felfutóél IOC ébreszti.
  143.         {
  144.             LATC = 0b00110000;
  145.             SLEEP ();              
  146.         }  
  147.     }
  148. }
(#) ktamas66 válasza slimcolt hozzászólására (») Máj 13, 2017 /
 
Én azokat a == && == megoldásokat átírnám mondjuk ilyenekre:
  1. if ( !PORTAbits.RA4 && !PORTAbits.RA5)
(#) Bell hozzászólása Máj 13, 2017 /
 
Sziasztok!
Most ismerkedem az MPLABX-el.
Egy LED-et szeretnék TMR0-al, megszakítással villogtatni.
A mellékelt programmal kettőt villan, majd sötét marad.
Két gondom van:
- a TMR0L és a TMR0H nem számol, így nem generál megszakítást sem
- a szimulátorban nem áll meg a LED=~LED; töréspontnál (117.sor)
IDE: MPLABX 3.50, XC8: V1.42, kontroller PIC18F25K40.
Mit rontok el?
A program:
  1. // CONFIG1L
  2. #pragma config FEXTOSC = OFF    // External Oscillator mode Selection bits (Oscillator not enabled)
  3. #pragma config RSTOSC = HFINTOSC_64MHZ// Power-up default value for COSC bits (HFINTOSC with HFFRQ = 64 MHz and CDIV = 1:1)
  4.  
  5. // CONFIG1H
  6. #pragma config CLKOUTEN = OFF   // Clock Out Enable bit (CLKOUT function is disabled)
  7. #pragma config CSWEN = ON       // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
  8. #pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
  9.  
  10. // CONFIG2L
  11. #pragma config MCLRE = INTMCLR  // Master Clear Enable bit (If LVP = 0, MCLR pin function is port defined function; If LVP =1, RE3 pin fuction is MCLR)
  12. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (Power up timer disabled)
  13. #pragma config LPBOREN = OFF    // Low-power BOR enable bit (ULPBOR disabled)
  14. #pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled , SBOREN bit is ignored)
  15.  
  16. // CONFIG2H
  17. #pragma config BORV = VBOR_2P45 // Brown Out Reset Voltage ion bits (Brown-out Reset Voltage (VBOR) set to 2.45V)
  18. #pragma config ZCD = OFF        // ZCD Disable bit (ZCD disabled. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON)
  19. #pragma config PPS1WAY = ON     // PPSLOCK bit One-Way Set Enable bit (PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
  20. #pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
  21. #pragma config DEBUG = OFF      // Debugger Enable bit (Background debugger disabled)
  22. #pragma config XINST = OFF      // Extended Instruction Set Enable bit (Extended Instruction Set and Indexed Addressing Mode disabled)
  23.  
  24. // CONFIG3L
  25. #pragma config WDTCPS = WDTCPS_31// WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS)
  26. #pragma config WDTE = OFF       // WDT operating mode (WDT Disabled)
  27.  
  28. // CONFIG3H
  29. #pragma config WDTCWS = WDTCWS_7// WDT Window Select bits (window always open (100%); software control; keyed access not required)
  30. #pragma config WDTCCS = SC      // WDT input clock or (Software Control)
  31.  
  32. // CONFIG4L
  33. #pragma config WRT0 = OFF       // Write Protection Block 0 (Block 0 (000800-001FFFh) not write-protected)
  34. #pragma config WRT1 = OFF       // Write Protection Block 1 (Block 1 (002000-003FFFh) not write-protected)
  35. #pragma config WRT2 = OFF       // Write Protection Block 2 (Block 2 (004000-005FFFh) not write-protected)
  36. #pragma config WRT3 = OFF       // Write Protection Block 3 (Block 3 (006000-007FFFh) not write-protected)
  37.  
  38. // CONFIG4H
  39. #pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-30000Bh) not write-protected)
  40. #pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
  41. #pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
  42. #pragma config SCANE = ON       // Scanner Enable bit (Scanner module is available for use, SCANMD bit can control the module)
  43. #pragma config LVP = OFF        // Low Voltage Programming Enable bit (HV on MCLR/VPP must be used for programming)
  44.  
  45. // CONFIG5L
  46. #pragma config CP = OFF         // UserNVM Program Memory Code Protection bit (UserNVM code protection disabled)
  47. #pragma config CPD = OFF        // DataNVM Memory Code Protection bit (DataNVM code protection disabled)
  48.  
  49. // CONFIG5H
  50.  
  51. // CONFIG6L
  52. #pragma config EBTR0 = OFF      // Table Read Protection Block 0 (Block 0 (000800-001FFFh) not protected  table reads executed in other blocks)
  53. #pragma config EBTR1 = OFF      // Table Read Protection Block 1 (Block 1 (002000-003FFFh) not protected  table reads executed in other blocks)
  54. #pragma config EBTR2 = OFF      // Table Read Protection Block 2 (Block 2 (004000-005FFFh) not protected  table reads executed in other blocks)
  55. #pragma config EBTR3 = OFF      // Table Read Protection Block 3 (Block 3 (006000-007FFFh) not protected  table reads executed in other blocks)
  56.  
  57. // CONFIG6H
  58. #pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected  table reads executed in other blocks)
  59.  
  60. #define LOWBYTE(v)   ((unsigned char) (v))
  61. #define HIGHBYTE(v)  ((unsigned char) (((unsigned int) (v)) >> 8))
  62. #define _XTAL_FREQ  8000000
  63. #define time0 0xFF00
  64. #define LED LATAbits.LATA0
  65. #include <xc.h>
  66.  
  67. void Init_TMR0 (void);
  68. void Init_Interrupt (void);
  69.  
  70. void main(void)
  71. {
  72.     unsigned char i;
  73.     OSCFRQbits.HFFRQ=0x0011;  // 8MHz
  74.     TRISA =0xFE;
  75.     LATA=0x00;
  76.     Init_TMR0();
  77.     Init_Interrupt();
  78.     for(i=0; i<4; i++)
  79.     {
  80.     PIR0bits.TMR0IF=1;
  81.     __delay_ms(300);
  82.     }  
  83.     while(1)
  84.     {
  85.     }
  86. }
  87.  
  88. void Init_TMR0 (void)
  89. {
  90.     TMR0H = HIGHBYTE(time0);
  91.     TMR0L = LOWBYTE(time0);
  92.     PIE0bits.TMR0IE=1;
  93.     PIR0bits.TMR0IF=0;
  94.     IPR0bits.TMR0IP=1;
  95.     T0CON0bits.T016BIT=1; //16 bit
  96.     T0CON0bits.T0OUTPS=0b1111; //post 16
  97.     T0CON1bits.T0CS=0b010; //Fosc/4;
  98.     T0CON1bits.T0CKPS=0b1111; //pre 32768
  99.     T0CON1bits.T0ASYNC=1;
  100.     T0CON0bits.T0EN=1;
  101. }
  102.  
  103. void Init_Interrupt (void)
  104. {
  105.     INTCONbits.GIEH=1;
  106.     INTCONbits.GIE=1;
  107.     INTCONbits.GIEL=1;
  108.     INTCONbits.IPEN=1;
  109. }
  110.  
  111. void interrupt high_priority TMR0h(void)
  112. {
  113.     if (PIR0bits.TMR0IF && PIE0bits.TMR0IE)
  114.     {
  115.     TMR0H = HIGHBYTE(time0);
  116.     TMR0L = LOWBYTE(time0);
  117.     LED=~LED;
  118.     PIR0bits.TMR0IF=0;
  119.     }
  120. }
A hozzászólás módosítva: Máj 13, 2017
(#) slimcolt válasza ktamas66 hozzászólására (») Máj 13, 2017 /
 
Átírtam, így sokkal esztétikusabb, de sajnos a hiba megmaradt.
PIC16LF1825-re írtam a progit, ezt elfelejtettem írni.
(#) Lamprologus válasza Tasznka hozzászólására (») Máj 13, 2017 /
 
Idézet:
„Ha most kezded,akkor másik Pic-et válassz...ennek eléggé karcsú az újraírhatósága.”

Bakker, ezt hogy lehet észrevenni? Ott egy 200-250 oldalas dokumentum, és van benn egy nyomorult sor ami miatt ez a PIC pont nem jó egy kezdőnek.
A hozzászólás módosítva: Máj 13, 2017
(#) Hp41C válasza Lamprologus hozzászólására (») Máj 13, 2017 /
 
A típus kiválasztása előtt érdemes az errata -ját is elolvasni.
(#) ktamas66 válasza slimcolt hozzászólására (») Máj 13, 2017 /
 
Mindenhol átírtam hasonlóra, így az MPLAB szimulátorban működött.
(#) Tasznka válasza Lamprologus hozzászólására (») Máj 13, 2017 /
 
Minden adatlap elején a felsorolásoknál,hogy mit is tud ott van a Special Microcontroller Features--> xxx erase/write cycles. Érdemes átnézni,hogy mit tud,és utána ,mint a Hp41C is írta,hogy mi megy belőle .A GA010-et még anno az Explorerhez adták,így én is azzal kezdtem. Én jó ideje a PIC24FJ128GB204 -et nyüstölöm,és még sokakat . Érdemes olyat választani amiben majdnem minden van,pl: sok uart,SPI,I2C,és usb.Bár az elején nem fogsz 1-2-vel foglalkozni,de amikor már belejössz,akkor jó ha tudja.
(#) zenetom válasza Bell hozzászólására (») Máj 13, 2017 /
 
Itt kicsit összemosódott szerintem a bináris - hexa rész
  1. OSCFRQbits.HFFRQ=0x0011;  // 8MHz

Helyesen így fest:
  1. OSCFRQbits.HFFRQ=0x07;  // 8MHz

Bár ettől még mennie kéne szerintem, valahol máshol lesz a gubanc. De nálam se megy a Timer0 az MPLABX szimulátorban, mondjuk attól a valóságban lehet megy.
(#) don_peter válasza slimcolt hozzászólására (») Máj 13, 2017 /
 
Élesben nem tudod kipróbálni?
Nem mindig akarja az igazságot a Proteus. (tapasztalat)
(#) slimcolt válasza don_peter hozzászólására (») Máj 14, 2017 /
 
Sajnos még nem.
PIC-et már vettem, de a Pickit3 még nem érkezett meg.
Elvileg a kódom szerint működnie kellene? Nem tudom miért műveli ezt a Proteus. MPLAB X-ben működik.
(#) don_peter válasza slimcolt hozzászólására (») Máj 14, 2017 /
 
Nem tökéletes a szimulálás, de nem túl sűrűn fordul elő..
Egyszerűen csak számítani kell rá, hogy a szimulátor hibázhat.
Kód szerint jónak tűnik a dolog.
Élesben teszteld, addig ne agyalj rajta...
(#) Bell válasza zenetom hozzászólására (») Máj 14, 2017 /
 
Köszönöm az észrevételt! Ezt a hibát nem rég követtem el, de javítva sem számol a TIMER0.
Sem a szimulátorban, sem a kontrollerben.
Talán nem is a TIMER0 konfigban van a hiba.
Azt a néhány bitet nehéz ennyire elrontani.
(#) Hp41C válasza Bell hozzászólására (») Máj 14, 2017 /
 
Szia!
Előbb állítsd be a TMR0 módját, aztán az értéket, aztán engedélyezd:
void Init_TMR0 (void)
  1. {
  2.     T0CON0bits.T016BIT=1; //16 bit
  3.     T0CON0bits.T0OUTPS=0b1111; //post 16
  4.     T0CON1bits.T0CS=0b010; //Fosc/4;
  5.     T0CON1bits.T0CKPS=0b1111; //pre 32768
  6.     T0CON1bits.T0ASYNC=1;
  7.     TMR0H = HIGHBYTE(time0);
  8.     TMR0L = LOWBYTE(time0);
  9.     IPR0bits.TMR0IP=1;
  10.     PIE0bits.TMR0IE=1;
  11.     PIR0bits.TMR0IF=0;
  12.     T0CON0bits.T0EN=1;
  13. }


Az INTCON GIE és GIEH ugyan az a bit.
  1. void Init_Interrupt (void)
  2. {
  3.     INTCONbits.IPEN=1;
  4.     INTCONbits.GIEH=1;
  5.     INTCONbits.GIEL=1;
  6. }


Érdemes lenne egy alacsony szintű megszakítás kiszolgálót is.

A 80. sorban miért szerepel a programból való megszakítás kérése?
  1. PIR0bits.TMR0IF=1;


Abban az átkozott MpLab 8 szimulátorában volt egy lehetőség a timer-ek belső regiszterének megjelenítésére. TMR0_internal
A hozzászólás módosítva: Máj 14, 2017
(#) zenetom válasza Bell hozzászólására (») Máj 14, 2017 /
 
Illetve ennek a résznek mi lenne a célja?
  1. for(i=0; i<4; i++)
  2.     {
  3.     PIR0bits.TMR0IF=1;
  4.     __delay_ms(300);
  5.     }

Szerintem ki kéne venni, bár valószínűleg nem ez okozza a hibát.
Egyébként maga a PIC működik? Próbáld meg azt, hogy a végtelen ciklusba raksz egy párszáz ms-os delayt, meg egy LED = ~LED utasítást (a megszakításban kommentezd ki, nehogy ott is menjen végül..). Ha igy villog a LED, akkor a program legalább megy.

Szerk.: Hp41C
Idézet:
„Abban az átkozott MpLab 8 szimulátorában volt egy lehetőség a timer-ek belső regiszterének megjelenítésére.”

MPLABX-ben is van.
A hozzászólás módosítva: Máj 14, 2017
(#) zenetom hozzászólása Máj 14, 2017 /
 
Közben ahogy próbálgattam ezt az MPLABX-et, hát eléggé megutáltam. Egy rakás trágya az egész, hogy finoman fogalmazzak. A build time 1 percet vesz igénybe Bell kódjánál.
Maga az IDE is bugos, és a régi MPLAB-hoz képest egy fapados gagyiság. De legalább erőforrás zabáló is.
Ameddig csak lehet, én jó messziről elkerülöm.
Következő: »»   949 / 1209
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