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   260 / 1210
(#) vilmosd válasza Stadi hozzászólására (») Máj 24, 2012 /
 
1-1 a meghajto lab fele mutato dioda is jo szigeteles gyanant.
(#) Stadi válasza Hp41C hozzászólására (») Máj 24, 2012 /
 
Kiszedtem a feltételes eseményt, és most így is működik a program, Animate üzemmódban. Viszont Single Step-nél továbbra is reménytelenül kifagy a szimuláció a while-ciklusos TMR0IF ellenőrzésnél, és csak az MPLAB újraindítása segít rajta (legalábbis más orvosságot nem találtam).

Amúgy az normális, hogy a szimuláció folyamán a zöld nyilacska az éppen végrehajtott utasítás alatt van 2 programsorral? Ha a következő utasításon állna, azt még megérteném, de így...
(#) Hp41C válasza Stadi hozzászólására (») Máj 24, 2012 /
 
Szia!

Akkor fordul elő a zöld nyilacska elcsúszása, ha a forrásban nem látható vezérlő karakterek vannak (CR, LF magában, unikódos karakter, stb).
(#) kissi válasza Stadi hozzászólására (») Máj 24, 2012 /
 
Szia!

Változtatások után ( egy sor beírása, törlése ) lefordítottad a projektet újra vagy "csak" szimuláltál ?

Steve
(#) llaczo válasza icserny hozzászólására (») Máj 24, 2012 /
 
Köszi a segítséget. Az a További gondom hogy átbújtam az adatlapot és nem tudtam letiltani az MCLR funkciót. - & _MCLRE_OFF & - nem segített. Próbáltam a - 2007h,5 - címen is de nem jött be. Tudnátok segíteni hogy kell letíltani az MCLR t?
(#) vilmosd válasza llaczo hozzászólására (») Máj 24, 2012 /
 
Probald meg a MPLAB config biteknel. Ki kell venni a pipat, es utana tudod allitani. Persze amugy ASM-bol is mukodni kellene. Probalj valami ujabb MPLAB-ot letolteni. Most valami V8.8x az utolso.
(#) thomas01 hozzászólása Máj 25, 2012 /
 
Valaki tudna segíteni abban, hogy ezek között a megnevezés szerint milyen különbség van, illetve, hogy ezeket USB-s égetővel lehet-e égetni:

PIC12F683-E/MD
PIC12F683-E/MF
PIC12F683-E/P
PIC12F683-E/SN
PIC12F683-I/MD
PIC12F683-I/MF
PIC12F683-I/P
PIC12F683-I/SN
PIC12F683T-E/SN
PIC12F683T-I/MD
PIC12F683T-I/MF
PIC12F683T-I/SN

Az a helyzet, hogy még kezdő vagyok, szóval jól jönne egy kis segítség
(#) nedudgi válasza thomas01 hozzászólására (») Máj 25, 2012 /
 
Itt a Microchip megmondja.
A különbség a tokozásban és a működési hőmérséklettartományban van.
A PICkit programozó USB interfészű. Milyen USB programozóra gondolsz?
(#) Stadi válasza Hp41C hozzászólására (») Máj 25, 2012 /
 
A kódot végig MPLAB-ban írtam, és miver angolul van kommentezve, még ékezet se lehet benne. Úgyhogy ennek fényében nem értem a dolgot, de ezek szerint nem sikerült megfelelő minőségű UI-t írni a microchipes fiúknak.
(#) Stadi válasza kissi hozzászólására (») Máj 25, 2012 /
 
Minden esetben az F9-et püföltem, szóval igen, újra lett fordítva a kód.

Nagyon hasznos a szimulátor, én pl. mindig elszámolok bizonyos értékeket +/-1-gyel, esetleg elfelejtek invertálni egy változót. Ezek single step üzemmódban gyönyörűen kibuknak, és gyorsan lehet javítani őket.
(#) kissi válasza Stadi hozzászólására (») Máj 25, 2012 /
 
Idézet:
„Nagyon hasznos a szimulátor,”


Egyetértek :yes: ! Steve
(#) vicsys válasza edison14 hozzászólására (») Máj 25, 2012 / 1
 
Idézet:
„Egy a gond hogy ezzel nem tudod azt megcsinálni, hogy mind a kettő ki legyen kapcsolva egyszerre.”
Mindenféle hardveres trükközés nélkül meg lehet csinálni, hiszen ha a kimenet tri state állapotú...
(#) Hp41C válasza Stadi hozzászólására (») Máj 25, 2012 /
 
Szia!

Egy sorstárs írta.
(#) Zsora válasza Hp41C hozzászólására (») Máj 26, 2012 /
 
Na, ezt az elcsúszást már én is tapasztaltam, ráadásul akkor, amikor egy szívatós hiba okát kellett volna megtalálnom. A program így látszólag olyan helyen szállt el mindig, ahol nem szállhatott volna el. Ráadásul az MPLAB X azt sem mondta, hogy mi volt az oka, csak puff; reset. Kb. 1 nap kellett hogy rájöjjek mi a gond. Majd az összes hajamat kitéptem.
(#) Zserigta hozzászólása Máj 26, 2012 /
 
Sziasztok.

Van ez a jó kis cikk itt hobbielektronikán:
Bővebben: Link

  1. #define XTAL_FREQUENCY  4000000
  2. #define TIMER1_FREQUENCY (XTAL_FREQUENCY / 4)
  3. #int_TIMER1
  4. void TIMER1_isr(){
  5.         Ticker -= 65535;
  6.         if ( Ticker < 65536 ) {
  7.                 Ticker += TIMER1_FREQUENCY;
  8.                 output_toggle(PIN_B0);
  9.         }
  10. }


Ez ugye 1mp-enként hajtja végre a következőt:
  1. output_toggle(PIN_B0);


Arra rájöttem, ha a
  1. #define TIMER1_FREQUENCY (XTAL_FREQUENCY / 4)

részben a 4-est átírom 40-re, akkor tized mp-ekben fog számolni.
Viszont ha átírom 400-ra, akkor nem csinál semmit.

A kérdésem az lenne, hogy hogyan tudnám úgy átírni a kódot, hogy századmásodpercben számoljon/dolgozzon?


Előre is köszi a segítséget.
(#) icserny válasza Zserigta hozzászólására (») Máj 27, 2012 /
 
Idézet:
„Viszont ha átírom 400-ra, akkor nem csinál semmit.”
Még szép! 10 ms-onként akarsz kapcsolgatni egy olyan megszakítással, ami 65,535 ms-onként következik be?

Egy lehetőség: Ha gyakoribb megszakítást akarsz, akkor ne a 16 bites Timer1-et használd, hanem a 8 bites Timer0-t, vagy a Timer2-t!
(#) Hp41C válasza Zserigta hozzászólására (») Máj 27, 2012 /
 
Szia!

T1 -et minden átfordulás után töltsd fel 10000 -rel. A 65536 -ot cseréld le 10000 -re.

Vagy

Írd át T1 -ről T2 -re a megszakítást. Ha az órajel 4.00MHz, akkor a T2 1.00MHz -es bemenetet kap. Ezt nem tudod változtatni. A megszakításokat 100Hz -vel szeretnéd kérni. Ehhez az előosztót állítsd 4 -re, a PR2 -be (250-1) -re. Ez 1000 -rel való osztást jelent, azaz a T2 1ms -onként fog átfordulni. Az utóosztót állítsd 10 -re, a megszakítást 10ms -enként fogja kérni.
(#) Zserigta válasza icserny hozzászólására (») Máj 27, 2012 /
 
Idézet:
„Egy lehetőség: Ha gyakoribb megszakítást akarsz, akkor ne a 16 bites Timer1-et használd, hanem a 8 bites Timer0-t, vagy a Timer2-t!”


Az a baj, hogy szeretném ha a Timer sleep üzemmódban is ketyegne, erre meg tudtommal csak a Timer1 alkalmas.
(Igen sajnos ezt nem írtam le az előzőben.)

Egyébként amiről szó van az egy PIC16F887.

Ha arról van szó, tudok más kristályt is alkalmazni, nem ragaszkodom a 4Mhz-hez.
(#) Zserigta válasza Hp41C hozzászólására (») Máj 27, 2012 /
 
Idézet:
„T1 -et minden átfordulás után töltsd fel 10000 -rel. A 65536 -ot cseréld le 10000 -re.”


Megtörtént, utána olyan 6-7 mp-enként lépett csak. Szóval jelentősen lassabb lett.

Idézet:
„Írd át T1 -ről T2 -re a megszakítást. Ha az órajel 4.00MHz, akkor a T2 1.00MHz -es bemenetet kap. Ezt nem tudod változtatni. A megszakításokat 100Hz -vel szeretnéd kérni. Ehhez az előosztót állítsd 4 -re, a PR2 -be (250-1) -re. Ez 1000 -rel való osztást jelent, azaz a T2 1ms -onként fog átfordulni. Az utóosztót állítsd 10 -re, a megszakítást 10ms -enként fogja kérni.”


Erre ugyan az a válaszom, mint amit icserny-nek írtam. Sleep módban is szeretném ha ketyegne a timer, de nem ragaszkodom a 4Mhz-hez.
(#) Hp41C válasza Zserigta hozzászólására (») Máj 27, 2012 /
 
Ha feltennéd az egész programot, tudnánk segíteni.... De ne várd el, hogy mindenki minden fordítóról (arról is, amit nem használ) tudjon mindent... Még azt sem írtad, melyik fordítót használod...
(#) Hp41C válasza Hp41C hozzászólására (») Máj 27, 2012 /
 
Itt a megoldás - assembly -ben... Ennyi idő alatt arra nem jöttem rá, hogy miért nem dolgozza fel a CCS a
  1. #include <devices.h>
sort...

t1_10ms.asm
    
(#) icserny válasza Zserigta hozzászólására (») Máj 27, 2012 /
 
Idézet:
„Az a baj, hogy szeretném ha a Timer sleep üzemmódban is ketyegne, erre meg tudtommal csak a Timer1 alkalmas.”
A Timer1 sem alkalmas arra, hogy sleep üzemmódban a kikapcsolt oszcillátor periódusait számlálja.

Az adatlap nem azt mondja, hogy Timer1 csak aszinkron módban és külső jelforrásról képes sleep módban számlálni?
(#) Zsora hozzászólása Máj 27, 2012 /
 
Egy korábbi problémámmal jövök újra, mert még mindig nem sikerült megoldanom:
MPLAB X alatt írok programot, amit több modulba szeretnék szervezni. Az egyes modulokban hivatkozások lennének egy másik modul rutinjaira, illetve változóira. Ez valamiért nem akar összejönni.
Ha .include parancsot használok egy modul beszúrásához, akkor működik minden, de duplázódik is minden a memóriában, ami nem jó. Ha meg .global meghatározást alkalmazok, akkor vagy nem talál valami, vagy egyszerűen lefagy a linker ( és bedobja a szokásos ablakot) fordítás közben. Fogalmam sincs hogy mi nem jó, pedig szerintem stimmel minden.
Jelenleg az alábbi módon próbálkozok, de ennél is hibaablak lesz az eredmény: (Két modul van: Foprogram.s és Valami.s)
  1. ;---------------------------------- Foprogram
  2. .include "p24HJ256GP210A.inc"
  3. .global __reset
  4. .global szin
  5.  
  6. .bss
  7. szin:
  8. .space 2*5
  9.  
  10. .text
  11. __reset:
  12. mov #__SP_init,w15
  13. mov #__SPLIM_init,w0
  14. mov w0,SPLIM
  15. rcall Rutin
  16. 1:
  17. bra 1b
  18. .end
  19. ;------------------------------------
  20.  
  21.  
  22. ;------------------------------------ Valami
  23. .global Rutin
  24.  
  25. Rutin:
  26. mov szin,wreg
  27. return
  28. ;-------------------------------------
(#) Zserigta válasza Hp41C hozzászólására (») Máj 27, 2012 /
 
Nem akartam a teljes forrást bemásolni, mert 100% mindenki olyanba fog belekötni, ami teljesen lényegtelen, mert nem arra irányul a kérdésem, legalább is eddig mindig így volt, és hetek kellettek mire végre valaki a tényleges kérdésemre válaszolt, utána áttértem, hogy a lényeget másolom csak be, és úgy eddig mindig ha nem is órákon belül, de jóval hamarabb megvolt a válasz és nem voltak felesleges kötözködések, de ám legyen.

Jelenleg így tizedmásodpercben számol.
A program meg CCS PIC C Compiler

  1. #include <16f887.h>
  2. #zero_ram
  3. #fuses XT,NOWDT,NOPROTECT,NOPUT,BROWNOUT,NOLVP
  4. #use delay(clock=4000000)
  5. #define XTAL_FREQUENCY  4000000 //kristály frekvenciája Hertzben
  6. #define TIMER1_FREQUENCY (XTAL_FREQUENCY / 40)
  7. int32 Ticker, alma;
  8. #include <flex_lcd.c>
  9. #include <math.h>
  10. #int_TIMER1
  11. void TIMER1_isr(){
  12.    Ticker -= 65535;
  13.    if ( Ticker < 65536 ) {
  14.       Ticker += TIMER1_FREQUENCY;
  15.       output_toggle(PIN_B0);
  16.       alma=alma+1;
  17.       if (alma==50){sleep();}
  18.    }
  19. }
  20. void inits(void){
  21.         //set_TRIS_A( 0xFF );          //0=kimenet, 1=bemenet      
  22.         set_TRIS_B( 0x01 );          //RB0-ára van kötve egy LED
  23.         Ticker = TIMER1_FREQUENCY;
  24.         setup_timer_1( T1_INTERNAL | T1_DIV_BY_1 );
  25.         enable_interrupts( INT_TIMER1 );
  26.         enable_interrupts( GLOBAL );
  27. }
  28.  
  29. void main(){
  30.    inits();
  31.    int poti, volt, menu, erzek, user, szakad, mehet;
  32.    int ido_ms, ido_s, ido_m;
  33.    int32 ido, user1;
  34.    ido=0;
  35.    user1=30000;
  36.    mehet=0;
  37.    ido_ms=0;
  38.    ido_s=0;
  39.    ido_m=0;
  40.    szakad=0;
  41.    erzek=100;
  42.    menu=1;
  43.    user=1;
  44.    set_tris_d(0x00);  
  45.    set_tris_b(0b00000111);
  46.    setup_ccp1(CCP_PWM);
  47.    setup_adc( ADC_CLOCK_INTERNAL );            
  48.    setup_adc_ports(sAN0);
  49.    set_adc_channel(0);
  50.    setup_timer_2(T2_DIV_BY_4, 255, 1);
  51.    lcd_init();
  52.    delay_ms(20);
  53.    printf(lcd_putc,"\f[1] 2  3  <->  1");
  54.    while(1){
  55.       delay_ms(2);
  56.       poti = read_adc();
  57.       set_pwm1_duty(volt);  
  58.       if(poti<volt-1 | poti>volt+1){volt=poti;}
  59.       if(input(PIN_B4)) {volt=volt-10;}
  60.       //printf(lcd_putc,"\n%u  ",volt);
  61.       if(input(PIN_A2)){
  62.          menu=menu+1;
  63.          if(menu>3){menu=1;}
  64.          if(menu==1){printf(lcd_putc,"\f[1] 2  3  <->  %u ", user);}
  65.          if(menu==2){printf(lcd_putc,"\f 1 [2] 3  <->  %u ", user);}
  66.          if(menu==3){printf(lcd_putc,"\f 1  2 [3] <->  %u ", user);}
  67.          delay_ms(300);}
  68.       if(menu==1){
  69.          if(input(PIN_A3)) {erzek=erzek+1;}
  70.          if(input(PIN_A4)) {erzek=erzek-1;}
  71.          printf(lcd_putc,"\n%u ",erzek);
  72.          delay_ms(50);}
  73.       mehet=0;
  74.       if (volt<20 && szakad==1){
  75.          delay_ms(560);
  76.          szakad=0;mehet=1;
  77.          if (user1>ido){user1=ido;}
  78.          ido=0;}
  79.       if (volt<20 && szakad==0 && mehet==0){
  80.          delay_ms(560);
  81.          ido_ms=80;
  82.          szakad=1;}  
  83.       if(menu==3 && szakad==1){
  84.          //ido=ido+1;
  85.          ido=alma;
  86.          ido_m=ceil(ido/6000);
  87.          ido_s=ceil((ido-(ido_m*6000))/100);
  88.          ido_ms=ido-(ido_m*6000)-(ido_s*100);
  89.          printf(lcd_putc,"\n%u:", ido_m);
  90.          if (ido_s<10){printf(lcd_putc,"0");}
  91.          printf(lcd_putc,"%u:", ido_s);
  92.          if (ido_ms<10){printf(lcd_putc,"0");}
  93.          printf(lcd_putc,"%u", ido_ms);
  94.          
  95.          ido_m=ceil(user1/6000);
  96.          ido_s=ceil((user1-(ido_m*6000))/100);
  97.          ido_ms=user1-(ido_m*6000)-(ido_s*100);
  98.          lcd_gotoxy(8,2);
  99.          printf(lcd_putc,"--%u:", alma);
  100.          if (ido_s<10){printf(lcd_putc,"0");}
  101.          printf(lcd_putc,"%u:", ido_s);
  102.          if (ido_ms<10){printf(lcd_putc,"0");}
  103.          printf(lcd_putc,"%u", ido_ms);
  104.          }  
  105.    }
  106. }
(#) Hp41C válasza Zserigta hozzászólására (») Máj 27, 2012 /
 
Megvan CCS -ben is...

ccs10ms.c
    
(#) Zserigta válasza Hp41C hozzászólására (») Máj 27, 2012 /
 
Hmmm... Hát ez ahogy elnézem pofon egyszerű volt.
Ezer köszönet érte!

Annyi hiba van csak, hogy 5 percenkét késik 1mp-et.
Ezzel lehet kezdeni valamit?
Legalább kb óránkénti 1mp késésig javítani?

Viszont időközbe felmerült egy másik probléma/kérdés, mert még a válaszra vártam, próbálkoztam a SLEEP funkcióval, de sehogy sem működik.

A fenti forráskód amit írtam, abban mi lehet a hiba, hogy nem működik a sleep? Gondolom a fuses-ben rontok el valamit.
(#) Hp41C válasza Zserigta hozzászólására (») Máj 27, 2012 /
 
A set_timer1(-10000); helyett set_timer1(-9966);
A sleep -et ne az ISR -ben használd...
(#) icserny válasza Zserigta hozzászólására (») Máj 27, 2012 /
 
próbáld a -10000-es értéket finoman változtatni!
(#) Zserigta válasza Hp41C hozzászólására (») Máj 27, 2012 /
 
Idézet:
„A set_timer1(-10000); helyett set_timer1(-9966)”


Ok, azt hittem számolgatni kell valamit, de akkor ezek szerint nem. Köszi.

Idézet:
„A sleep et ne az ISR -ben használd...”

Hmm, így már jó is.
De miért nem mind1 neki, hogy hova van rakva?

Plusz felmerült még 1 utolsó kérdés.
Hogy lehet azt oldani, hogy X idő (mondjuk 2 perc) után ébredjen fel?
Meg azt meglehet e oldani, hogy 1 gomb megnyomására ébredjen fel?
Ha igen, hogyan?
Köszi!
(#) Zserigta válasza icserny hozzászólására (») Máj 27, 2012 /
 
Idézet:
„próbáld a -10000-es értéket finoman változtatni!”

Ok. Köszi.
Következő: »»   260 / 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