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   449 / 1210
(#) zenetom válasza Beles hozzászólására (») Szept 29, 2013 /
 
Szia!
Mint előbb is írták, valószínűleg szoftveres lesz a hiba. Esetleg a kvarc vagy kondi nem érintkezik rendesen, az nálam is okozott ilyet. De ha ezek rendben vannak, akkor a programban lesz a hiba.
(#) Beles válasza zenetom hozzászólására (») Szept 29, 2013 /
 
Timer0-ra van megszakítás beállítva. Ha megszakítás generálódik, akkor növelem a másodpercet. Ebben nincs mit nagyon elrontani, nem?
(#) zenetom válasza Beles hozzászólására (») Szept 29, 2013 /
 
Gondolom ASM. Másold be a megszakító rutint.
(#) Beles válasza zenetom hozzászólására (») Szept 29, 2013 /
 
C

  1. void interrupt INT(void)
  2. {
  3.         if(PIR1bits.TMR1IF == 1)// Display Handle
  4.         {
  5.                 switch(DisplayCounter)
  6.                 {
  7.                         case 0:
  8.                         {
  9.                                 SEGMENT1 = 0;
  10.                                 DISPLAY = Numbers[MinuteLow];
  11.                                 SEGMENT4 = 1;
  12.                                 break;
  13.                         }
  14.                         case 1:
  15.                         {
  16.                                 SEGMENT4 = 0;
  17.                                 DISPLAY = Numbers[MinuteHigh];
  18.                                 SEGMENT3 = 1;
  19.                                 break;
  20.                         }
  21.                         case 2:
  22.                         {
  23.                                 SEGMENT3 = 0;
  24.                                 DISPLAY = Numbers[HourLow];
  25.                                 SEGMENT2 = 1;
  26.                                 break;
  27.                         }
  28.                         case 3:
  29.                         {
  30.                                 SEGMENT2 = 0;
  31.                                 DISPLAY = Numbers[HourHigh];
  32.                                 SEGMENT1 = 1;
  33.                                 break;
  34.                         }
  35.                 }
  36.                 DisplayCounter++;
  37.                 TMR1H = 255;
  38.                 TMR1L = 100;
  39.                 if (DisplayCounter ==4) DisplayCounter = 0;
  40.                 PIR1bits.TMR1IF = 0;
  41.         }
  42.        
  43.         if (INTCONbits.T0IF == 1) //Clock Handle
  44.         {
  45.                 SecondLow++;
  46.                 if (SecondLow == 10)
  47.                 {
  48.                         SecondLow = 0;
  49.                         SecondHigh++;
  50.                 }
  51.                 if (SecondHigh == 6)
  52.                 {
  53.                         MinuteLow++;
  54.                         SecondHigh = 0;
  55.                 }
  56.                 if (MinuteLow == 10)
  57.                 {
  58.                         MinuteLow = 0;
  59.                         MinuteHigh++;
  60.                 }
  61.                 if (MinuteHigh == 6)
  62.                 {
  63.                         HourLow++;
  64.                         MinuteHigh = 0;
  65.                 }
  66.                 if (HourLow == 10)
  67.                 {
  68.                         HourLow = 0;
  69.                         HourHigh++;
  70.                 }
  71.                 if ((HourHigh == 2) && (HourLow == 4))
  72.                 {
  73.                         HourHigh = 0;
  74.                         HourLow = 0;
  75.                 }
  76.                 INTCONbits.T0IF = 0;
  77.         }
  78. }
(#) kissi válasza Beles hozzászólására (») Szept 29, 2013 /
 
A TMR0 hogy van beállítva ? Ha jól számoltam, akkor a 32768 Hz az 65536-os osztásnál 2s-os periódusidőt ad !?
(#) Beles válasza kissi hozzászólására (») Szept 29, 2013 /
 
256-os előosztás van beállítva. Amit furcsálok is, mert én úgy számoltam, hogy 32768/4 = 8192. Amit 32-es osztóval beállítva kijön az 1Sec, de mégsem így történik. És nem értem miért.
(#) zenetom válasza Beles hozzászólására (») Szept 29, 2013 /
 
Hogy hajtod a Timer0-t? Mert neki nincs belső oszcija, tehát nem tud külső kvarcról menni, csak stabil négyszögjelről (T0CKI). Tehát a Timer0-t közvetlenül nem lehet külső kvarcról hajtani. Viszont a Timer1-et igen. Tehát a Timer1 megszakításba kell rakni az időléptetést, és a Timer0-ba a kijelzést, és akkor mehet az idő külső kvarcről.
Hogy vannak beállítva a timer regiszterek?
(#) Beles válasza zenetom hozzászólására (») Szept 29, 2013 /
 
Belső órajerről hajtom a TIMER0-t. Akkor a FOSC/4 az órajele ha jól tudom.
De itt az egész kód:
  1. #include <pic.h>
  2. #include <pic16f877A.h>
  3.  
  4. __CONFIG        (WRT_OFF & WDTE_OFF & CP_OFF & FOSC_XT & PWRTE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & CP_OFF & DEBUG_ON);
  5.  
  6. #define _XTAL_FREQ 32768
  7.  
  8.  
  9. //7Segment display PIN
  10. #define a PORTDbits.RD0
  11. #define b PORTDbits.RD1
  12. #define c PORTDbits.RD2
  13. #define d PORTDbits.RD3
  14. #define e PORTDbits.RD4
  15. #define f PORTDbits.RD5
  16. #define g PORTDbits.RD6
  17. #define DISPLAY PORTD
  18.  
  19. //7Segment display Numbers
  20. unsigned char Numbers [] = {0b01000000,
  21.                                                          0b01111001,
  22.                                                          0b00100100,
  23.                                                          0b00110000,
  24.                                                          0b00011001,
  25.                                                          0b00010010,
  26.                                                          0b00000010,
  27.                                                          0b01111000,
  28.                                                          0b00000000,
  29.                                                          0b00010000};
  30.  
  31. unsigned char DisplayCounter = 0; //Wich display switch on
  32.  
  33.  
  34. //7Segment display Select
  35. #define SEGMENT1 PORTCbits.RC4
  36. #define SEGMENT2 PORTCbits.RC5
  37. #define SEGMENT3 PORTCbits.RC6
  38. #define SEGMENT4 PORTCbits.RC7
  39.  
  40.  
  41. unsigned char SecondLow = 0;
  42. unsigned char SecondHigh = 0;
  43. unsigned char MinuteLow = 0;
  44. unsigned char MinuteHigh = 5;
  45. unsigned char HourLow = 0;
  46. unsigned char HourHigh = 2;
  47.  
  48. void init(void)
  49. {
  50.         OPTION_REG = 0b00000111;
  51.         INTCON = 0b11100000;
  52.         T1CON = 0b00000101;
  53.         PIE1bits.TMR1IE = 1;
  54.         TRISD = 0b00000000;
  55.         TRISC = 0b00000000;
  56.         PORTC = 0;
  57. }
  58.  
  59.  
  60.  
  61. int main ()
  62. {
  63.         init();
  64.         while(1)
  65.         {
  66.                 NOP();
  67.         }
  68. }
  69.  
  70.  
  71. void interrupt INT(void)
  72. {
  73.         if(PIR1bits.TMR1IF == 1)// Display Handle
  74.         {
  75.                 switch(DisplayCounter)
  76.                 {
  77.                         case 0:
  78.                         {
  79.                                 SEGMENT1 = 0;
  80.                                 DISPLAY = Numbers[MinuteLow];
  81.                                 SEGMENT4 = 1;
  82.                                 break;
  83.                         }
  84.                         case 1:
  85.                         {
  86.                                 SEGMENT4 = 0;
  87.                                 DISPLAY = Numbers[MinuteHigh];
  88.                                 SEGMENT3 = 1;
  89.                                 break;
  90.                         }
  91.                         case 2:
  92.                         {
  93.                                 SEGMENT3 = 0;
  94.                                 DISPLAY = Numbers[HourLow];
  95.                                 SEGMENT2 = 1;
  96.                                 break;
  97.                         }
  98.                         case 3:
  99.                         {
  100.                                 SEGMENT2 = 0;
  101.                                 DISPLAY = Numbers[HourHigh];
  102.                                 SEGMENT1 = 1;
  103.                                 break;
  104.                         }
  105.                 }
  106.                 DisplayCounter++;
  107.                 TMR1H = 255;
  108.                 TMR1L = 100;
  109.                 if (DisplayCounter ==4) DisplayCounter = 0;
  110.                 PIR1bits.TMR1IF = 0;
  111.         }
  112.        
  113.         if (INTCONbits.T0IF == 1) //Clock Handle
  114.         {
  115.                 SecondLow++;
  116.                 if (SecondLow == 10)
  117.                 {
  118.                         SecondLow = 0;
  119.                         SecondHigh++;
  120.                 }
  121.                 if (SecondHigh == 6)
  122.                 {
  123.                         MinuteLow++;
  124.                         SecondHigh = 0;
  125.                 }
  126.                 if (MinuteLow == 10)
  127.                 {
  128.                         MinuteLow = 0;
  129.                         MinuteHigh++;
  130.                 }
  131.                 if (MinuteHigh == 6)
  132.                 {
  133.                         HourLow++;
  134.                         MinuteHigh = 0;
  135.                 }
  136.                 if (HourLow == 10)
  137.                 {
  138.                         HourLow = 0;
  139.                         HourHigh++;
  140.                 }
  141.                 if ((HourHigh == 2) && (HourLow == 4))
  142.                 {
  143.                         HourHigh = 0;
  144.                         HourLow = 0;
  145.                 }
  146.                 INTCONbits.T0IF = 0;
  147.         }
  148. }
(#) kissi válasza Beles hozzászólására (») Szept 29, 2013 /
 
Valamit nem jól számolsz... 4/32768 --> kb. 122 us , ez a léptetési órajeled ideje. Ebből kell 65536 db, hogy megszakításod legyen --> 8 s ( az OPTION alapján 256-os az osztód ! ) ! Ez azt jelenti, hogy 8 s alatt számolna neked 1 -et !

szerk.:
Idézet:
„#define _XTAL_FREQ 32768”
Ezt magadnak írtad ?
A hozzászólás módosítva: Szept 29, 2013
(#) kissi válasza Beles hozzászólására (») Szept 29, 2013 /
 
Nem félreértelmezel valamit ? Ha 32768-as kvarcról működteted a PIC-et, akkor az XT beállítás nem jó !
A hozzászólás módosítva: Szept 29, 2013
(#) Beles válasza kissi hozzászólására (») Szept 29, 2013 /
 
De a TIMER0 az csak 8 bites ennél a PIC-nél, nem 16! Vagy miért számolsz 65536-al?
Akkor mire kell állítani, ha nem XT?
(#) zenetom válasza Beles hozzászólására (») Szept 29, 2013 /
 
Itt valaki nagyon nem kerek.
Bár még nem teljesen világos, hogy akkor hol is van a kvarc, és milyen frekvenciájú?!
Ha a főoszcinak raktál be 32.768kHz-es kvarcot, akkor a megszakítás 32768/4/256/256 = 0.125Hz lenne, vagyis minden 8. másodpercben léptetné csak a másodperc változót.
De a főoszciról egyébként nem érdemes járatni óraalapot.
Ha tényleg FOSC-nak raktad be ezt a kvarcot, akkor a konfigbiteknél XT helyett LP-t kell beállítani (lehet ez okozza a hibát).
(#) kissi válasza Beles hozzászólására (») Szept 29, 2013 /
 
LP beállítás kell, zenetom jól írta ezen a frekin!

Azért írtam 65536-ot, mert 256-os ( 8 bit ! ) előosztót állítottál a 8 bites regiszterhez, ami összesen 16 bitesnek felel így meg !
(#) Beles válasza zenetom hozzászólására (») Szept 29, 2013 /
 
32768 a kristály igen, ezért nem értem hogy miért kellett 256-os osztó, mikor 32-es kellene. De akkor átálítom LP-re, és kiderül mi lesz. Aztán áttervezem akkor külön órajelforrásra.
(#) vilmosd válasza Beles hozzászólására (») Szept 29, 2013 /
 
A TMR1 alkalmas erre a feladatra. Van neki oszcija direkt erre a frekire. Es az meg 16 bites is. Masik: Az IT rutinban ne tartozkodj sokaig mert igy sohasem lesz pontos orad. Jelzobitek allitasaval a foprogramban kell elvegezni a szamitasokat.
(#) Beles válasza vilmosd hozzászólására (») Szept 29, 2013 /
 
Rendben, köszi! Akkor átírom azt is!
(#) kissi válasza vilmosd hozzászólására (») Szept 29, 2013 /
 
Idézet:
„Az IT rutinban ne tartozkodj sokaig mert igy sohasem lesz pontos orad.”
Szerintem ez most nem gond, mert a hardver simán számol, nem kell "előretekerni" a számlálót , de általában igaz !
(#) Beles válasza kissi hozzászólására (») Szept 29, 2013 /
 
Én is így gondoltam, ezért írtam a interruptba.
(#) Beles válasza kissi hozzászólására (») Szept 29, 2013 /
 
Idézet:
„Azért írtam 65536-ot, mert 256-os ( 8 bit ! ) előosztót állítottál a 8 bites regiszterhez, ami összesen 16 bitesnek felel így meg !”

Erre nem is gondoltam már így késő este
Na tényleg az volt a baj, hogy nem LP-n volt, hanem XT-n. Nem is gondoltam volna, hogy ennyit számít. Mindíg tanulok valami újjat Mostmár az elősztót is 32-re állítottam, és jól számol.
Egyébként majd szeretnék DFC77-es vevőt hozzá, így annyira nem lényeg, ha naponta pár másodpercnyit késne...
Köszönöm a segítséget!
(#) kissi válasza Beles hozzászólására (») Szept 29, 2013 /
 
!
(#) zenetom válasza Beles hozzászólására (») Szept 30, 2013 /
 
Mondtam én.
(#) Beles válasza zenetom hozzászólására (») Szept 30, 2013 /
 
Tegnap este óta megy, nem veszem észre rajta, hogy késik vagy siet bár másodpercet azt még nem látok. úgyhogy király a cucc
(#) usane hozzászólása Szept 30, 2013 /
 
Hello!
Van egy PIC16F690, ICSP-n programozva.
  1. #include <xc.h>
  2. #include <pic16f690.h>
  3. #pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
  4. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
  5. #pragma config PWRTE = ON      // Power-up Timer Enable bit (PWRT disabled)
  6. #pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
  7. #pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
  8. #pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
  9. #pragma config BOREN = ON       // Brown-out Reset Selection bits (BOR enabled)
  10. #pragma config IESO = OFF        // Internal External Switchover bit (Internal External Switchover mode is disabled)
  11. #pragma config FCMEN = OFF       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
  12. void main(void)
  13. {
  14.    
  15.  
  16.         OSCCON=0b1100001;
  17.     ANSEL=0x00;
  18.     ANSELH=0x00;
  19.     TRISA=0x06;
  20.     TRISB=0x70;
  21.     TRISC=0x07;
  22.  
  23.  while(1)
  24.     {
  25.  if (PORTBbits.RB6==0)                     // 1-es csatorna
  26.         {
  27.                 if (PORTBbits.RB7==1)
  28.                         {
  29.                     PORTBbits.RB7=0;
  30.                         }
  31.                         else
  32.                         {
  33.                         PORTBbits.RB7=1;
  34.                         }
  35.             while (PORTBbits.RB6==0)
  36.             {
  37.                 delay(1000);
  38.             }        
  39.         }
  40.         else
  41.         {
  42.             ;
  43.         }
  44. ifek..... minden bemenet-kimenet párra.

RB6->RB7
RB5->RC7
RB4->RC6
RC2->RC3
RC1->RC4
RC0->RC5
RA2->RA4
RA1->RA5
A bal oldal bemenet, a jobb oldal kimenet.
Ha a fenti konfig alapján bekapcsolom a kimenetek magasak, és a hozzájuk tartozó bemenetekkel tudom őket kapcsolgatni.
Ha nullázom a portokat, tehát odaírok még egy PORTA=0,PORTB=0,PORTC=0 a TRIS után akkor az RC6 kimenet magasan indul el, és kapcsolgatni se tudom, mert csak addig marad alacsony a kimenet amíg a hozzá tartozó bemenetet alacsonyan tartom. Mit hagytam ki?
(#) usane válasza usane hozzászólására (») Szept 30, 2013 /
 
Megvan, elírtam egy összekapcsolást.
(#) usane hozzászólása Szept 30, 2013 /
 
Kérdés. Egy tápról működő PIC és relék esetén ki tudom eléggé szűrni valahogy a tápot, hogy 9 relé(9*100mA) egyszerre kapcsolása ne resetelje a PIC-et?
A hozzászólás módosítva: Szept 30, 2013
(#) bbalazs_ válasza usane hozzászólására (») Szept 30, 2013 /
 
Dioda-pufferkondi kombo a PIC tapjaban?
(#) usane válasza bbalazs_ hozzászólására (») Szept 30, 2013 /
 
Dióda még nincs, pufferkondi is csak a főtápon van a 7805 után, még azt is növelem. Mekkora puffer lehet elég a PIC tápra, és a diódát hová kéne tennem konkrétan és hogyan?
(#) Kovabe hozzászólása Szept 30, 2013 /
 
Sziasztok
Egy matematikai pardoxonban kovájgok és nem találok ki. Milyen egyenlettel tudnék byte-ot átszámolni "0x"és hex stringre?
(#) zenetom válasza Kovabe hozzászólására (») Szept 30, 2013 /
 
Szia!
Egy lehetőség: először is csinálsz egy 16 elemű karakter tömböt [0..9, A, B.. E, F] (tehát itt a számok ASCII kódját tárolod!).
Aztán szétválasztod az átszámolandó számot két 4bites számra, és ezeket a számokat felhasználod tömb indexként. Tehát legyen mondjuk a (decimálisan) 91 (0101 1011). A felső 4 bit értéke 5, vagyis hozzárendelet a tömb 5. elemét (a 0. elem a 0!), ez 5.
Ezután veszed az alsó négy bitet, ez 11. A tömb 11. eleme a "B" lesz. Összeolvasva: 5B.
Ha erre gondoltál...
(#) Kovabe válasza zenetom hozzászólására (») Szept 30, 2013 /
 
Nem tudom, nem teljesen. Legalábis azt gondoltam, hogy van valami egyszerü számitás mert ez nekem teljesen idegen. Vagyis értem csak a kivitelezéssel van bajom.
Igazábol flowcode-ban szeretnék számolni de nem teljesen tiszta a dolog.
A hozzászólás módosítva: Szept 30, 2013
Következő: »»   449 / 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