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   263 / 1208
(#) Zserigta válasza Zserigta hozzászólására (») Máj 30, 2012 /
 
Az előzőt még kicsit megspékelném egy igen érdekes dologgal.

Van ez a forráskód, ami a 4Mhz-s kristállyal eddig a mobilomon lévő stopperhez képest tökéletes szinkronban volt eddig, most ha a mobil kerek 1 percnél tart, akkor a PICeszköz csak 45mp-nél.
  1. #include <16f887.h>
  2. #zero_ram
  3. #fuses XT,NOWDT,NOPROTECT,NOPUT,BROWNOUT,NOLVP
  4. #use delay(clock=4000000)
  5. #include <flex_lcd.c>
  6. #include <math.h>
  7. int32 alma;
  8. //set_timer1 alapból -10000
  9. //Ha késik vagy siet a képlet a következő:
  10. //10000 * PIC_idő/külső_idő (Az időt másodpercben kell megadni!)
  11. //5*60 = 300, 9966 = int(10000 * 300/301).
  12. #int_TIMER1
  13. void TIMER1_isr(){
  14.    set_timer1(-9916);
  15.    alma=alma+1;}
  16. #define SW_PIN   PIN_B1
  17. #int_rb
  18. void rb_isr(void){
  19.    delay_ms(10);  
  20.    if(input(SW_PIN)){output_high(pin_e0);}}
  21. void inits(void){
  22.    set_TRIS_E( 0x01 );          //RE0 Kijelző világítás
  23.    set_timer1(-9916);
  24.    setup_timer_1( T1_INTERNAL | T1_DIV_BY_1 );
  25.    //enable_interrupts( INT_TIMER1 );
  26.    clear_interrupt(INT_RB);
  27.    enable_interrupts(INT_RB1);        
  28.    enable_interrupts( GLOBAL );}
  29. void main(){
  30.    inits();
  31.    int poti, volt, menu, erzek, user, szakad, mehet, start;
  32.    int ido_ms, ido_s, ido_m;
  33.    int32 ido, user1;
  34.    user1=3000;
  35.    output_high(pin_e0);
  36.    erzek=100;
  37.    menu=1;
  38.    user=1;
  39.    set_tris_d(0x00);  
  40.    set_tris_b(0b00000111);
  41.    setup_ccp1(CCP_PWM);
  42.    setup_adc( ADC_CLOCK_INTERNAL );            
  43.    setup_adc_ports(sAN0);
  44.    set_adc_channel(0);
  45.    //setup_timer_2(T2_DIV_BY_4, 255, 1);
  46.    lcd_init();
  47.    delay_ms(20);
  48.    printf(lcd_putc,"\f[1] 2  3  <->  1");
  49.    while(1){
  50.    //if (alma>1000 && alma<1005){output_low(pin_e0);sleep();
  51.    //#asm nop #endasm}
  52.       delay_ms(10);
  53.       poti = read_adc();
  54.       set_pwm1_duty(volt);  
  55.       if(poti<volt-1 | poti>volt+1){volt=poti;}
  56.       if(input(PIN_B4)) {volt=volt-10;}
  57.       if(input(PIN_A2)){
  58.          menu=menu+1;
  59.          if(menu>3){menu=1;}
  60.          if(menu==1){printf(lcd_putc,"\f[1] 2  3  <->  %u ", user);}
  61.          if(menu==2){printf(lcd_putc,"\f 1 [2] 3  <->  %u ", user);}
  62.          if(menu==3){printf(lcd_putc,"\f 1  2 [3] <->  %u \n0:00:00--0:00:00", user);}
  63.          delay_ms(300);}
  64.       if(menu==1){
  65.          if(input(PIN_A3)) {erzek=erzek+1;}
  66.          if(input(PIN_A4)) {erzek=erzek-1;}
  67.          printf(lcd_putc,"\n%u ",erzek);
  68.          lcd_gotoxy(8,2);
  69.          printf(lcd_putc,"-- %u  ", poti);
  70.          delay_ms(50);}
  71.       mehet=0;
  72.       if(menu==3 && volt<20 && alma>300){ //&& szakad==1
  73.          //delay_ms(560);
  74.          szakad=0;mehet=1;
  75.          if (user1>ido){user1=ido;}
  76.          alma=0;}
  77.       if(menu==3 && volt<20 && start==0){
  78.          enable_interrupts( INT_TIMER1 );
  79.          start=1;}
  80.       /*if(menu==3 && volt<20 && szakad==0 && mehet==0){
  81.          delay_ms(560);
  82.          //ido_ms=80;
  83.          szakad=1;}*/  
  84.       if(menu==3 ){ //&& szakad==1
  85.          //========Köridő!==========//
  86.          ido=alma;
  87.          ido_m=ceil(ido/6000);
  88.          ido_s=ceil((ido-(ido_m*6000))/100);
  89.          ido_ms=ido-(ido_m*6000)-(ido_s*100);
  90.          printf(lcd_putc,"\n%u:", ido_m);
  91.          if (ido_s<10){printf(lcd_putc,"0");}
  92.          printf(lcd_putc,"%u:", ido_s);
  93.          if (ido_ms<10){printf(lcd_putc,"0");}
  94.          printf(lcd_putc,"%u", ido_ms);
  95.          
  96.          //========User rekord!==========//
  97.          ido_m=ceil(user1/6000);
  98.          ido_s=ceil((user1-(ido_m*6000))/100);
  99.          ido_ms=user1-(ido_m*6000)-(ido_s*100);
  100.          lcd_gotoxy(8,2);
  101.          printf(lcd_putc,"--%u:", ido_m);
  102.          if (ido_s<10){printf(lcd_putc,"0");}
  103.          printf(lcd_putc,"%u:", ido_s);
  104.          if (ido_ms<10){printf(lcd_putc,"0");}
  105.          printf(lcd_putc,"%u", ido_ms);
  106.       }  
  107.    }
  108. }


Aztán itt jön a nagyobb csavar. Ha kiszedem a végéről ezt a kis részt, tehát elvileg kevesebb dolgot kellene végrehajtani, tehát gyorsabban kellene hogy számoljon, de NEM, mert így ha a mobilon 1 kerek 1 perc van a stopperen, akkor a PICeszközön csak 33mp
  1. //========User rekord!==========//
  2.          ido_m=ceil(user1/6000);
  3.          ido_s=ceil((user1-(ido_m*6000))/100);
  4.          ido_ms=user1-(ido_m*6000)-(ido_s*100);
  5.          lcd_gotoxy(8,2);
  6.          printf(lcd_putc,"--%u:", ido_m);
  7.          if (ido_s<10){printf(lcd_putc,"0");}
  8.          printf(lcd_putc,"%u:", ido_s);
  9.          if (ido_ms<10){printf(lcd_putc,"0");}
  10.          printf(lcd_putc,"%u", ido_ms);


Na most akkor ez hogy is van? Minnél kevesebb a kód, annál lassabb a PIC?
(#) trudnai válasza Zserigta hozzászólására (») Máj 31, 2012 /
 
A 32k kristalyt a Timer1 -re tetted csak vagy az egesz PIC azzal ment? Ha az egesz PIC, akkor allitottad a fuses-t? Ha igen, vissza allitottad a 4MHz-hez?

32k eseten nem az volt a baj, hogy akkor a PIC mar tul lassan porog ahhoz, hogy azt a sokmindent idoben evegezz? Szemely szerint jobban szeretem, ha a PIC porog nagy sebesseggel, pl 20 MHz, van egy masik 32Khz kristaly az T1-en ami alvaskor is porog, es igy minel gyorsabban elvegzem a muveletet majd altatom a PIC-et (elmeletileg minel gyorsabban vegzel, annal tobbet tudsz aludni ebresztesig, igy osszessegeben kevesebb a fogyasztas - csak egy otlet amin erdemes elfilozni esetleg)
(#) Zserigta válasza trudnai hozzászólására (») Máj 31, 2012 /
 
Alapból 4Mhz-n pörgött a PIC, csak a Timer1 ment a 32.768 Khz-vel.
De sajna mivel 32.768 Khz-ből nem lehet kihozni a pontos 1 tiz4ed másodperces léptetést, ezért visszatöltöttem a biztonsági mentést a kapcsolásból meg kiszedtem a Timer1re kötött 32.768 Khz-s kvarcot.
A FUSES-t meg nem bántottam egyik állapotban sem.
Szóval minden visszaállt alapra és valamiért lassabb mint volt.

De mint írtam, ha kevesebb végrehajtás van a programkódba, akkor még lassabban számol valamiért.

Teljesen értetlenül állok már a dolgok előtt.
Számomra sokkal logikusabb volna, ha több feladatot kell végrehajtania a programkódnak a main-en belül akkor belassulhat a timer1, de az, hogy ez fordítva van, számomra logikátlan.
(#) Hp41C válasza Zserigta hozzászólására (») Máj 31, 2012 /
 
Szia!

Pontosan kellene tudni, mit csinálnak a könyvtári függvények... Ha tiltják a megszakítást, törlik a timer1 megszakítási kérését, akkor bekövetkezhet a késés. Még akkor is késhet, ha túl későn törli a megszakításkérést - persze ehhez kitartóan kellene tiltani a megszakítást... Ugyanis ha a feldolgozás alatt befut egy kérés, a kiszolglása alatt, az ok törlése elött befut még egy, akkor az ok törlésével elvész a második kérés.
Olvastad a Timer1 errata -t?

Egy másik fordítóval nem próbálod ki: Pl. HighTech C?
(#) vilmosd válasza Zserigta hozzászólására (») Máj 31, 2012 / 1
 
Probald mar meg ugy hogy a RB IT-t nem hasznalod. Abban van egy 10 ms delay, es ha rafut addig a TMR1 IT nem tud dolgozni. IT kezelesben nem illik Delay-t tenni. A nyomogomb kezelest talan a TMR1 IT alatt meg lehetne oldani, megpedig ugy hogy beolvasod a bemenet allapotat, eltarolod, es a kovetkezo IT alatt osszehasonlitod az elozo allapottal. Amikor ket egymas utani IT-ben a megnyomott allapotot olvasod, akkor bebillentesz egy jelzobitet (int1) hogy gombnyomas volt. Lekezeles utan torlod.
(#) Zserigta válasza vilmosd hozzászólására (») Máj 31, 2012 /
 
Isten áldjon komám.
Hát erre rá nem jöttem volna magamtól.

Kiszettem a delay-t az RB_ISR-ből és egyből jó lett.
(Csak nem értem, ezelőtt, hogy-hogy jó volt így is, de lényeg, hogy most már jó.)

És így arra is meglett a válasz, hogy miért lassult be a Timer1, ha kevesebb dolognak kellett végrehajtódnia a main-en belül. (Gondolom így, mivel kevesebb dolog volt a mainben, hamarabb jutott az RB_ISR-hez és így sűrűbben futott le ugyan annyi idő alatt a delay.)
(Egyébként nem tudom, minek tettem, vagy hogy került oda delay. Nyilván valami kósza ctrl+v lehetett.)

Ezer köszönet érte!
(#) hmli hozzászólása Jún 1, 2012 /
 
Sziasztok!

Találkoztam egy számomra rejtélyes jelenséggel, segítsetek kitalálni mi okozza.
PIC16F676 a donor. A kérdéses lábak PORTC0-3 kimenetként, TRISC törölve.

BSF PORTC,0
BSF PORTC,1

eredménye az lesz, hogy CSAK a PORTC,1 marad logikai H.

BSF PORTC,0
BSF PORTC,1
BSF PORTC,2
BSF PORTC,3
eredménye pedig hogy csak PORTC,3 marad H szinten, tehát csak az a legutolsó port, ahol elvégeztem a BSF utasítást.
Elgondolásom szerint egyesével be lehet állítani a biteket, viszont a gyakorlatban nem működik.
(#) icserny válasza hmli hozzászólására (») Jún 1, 2012 / 1
 
Ez az úgynevezett read-modify-write probléma lehet. A bitmanipulációs utasításoknál ugyanis mindig beolvasásra kerül a port pillanatnyi állapota, s a kijelölt bit módosítása után az egész regiszter újra lesz írva.

Ha túl gyorsan jönnek az utasítások egymás után, akkor az első utasítás eredménye még nem látszik (lassan megy fel a feszültség a külső kapacitív terhelés miatt), így visszaolvasáskor nulla íródik vissza.

Megoldások: Tegyél be egy kis várakozást az utasítások közé. Vagy használj egy szoftveres buffert, azon tartsd nyilván a I/O regiszter állapotát, azon végezd a bitműveleteteket, s az egészet egyben írd ki. Vagy használj PIC18-at, abban van hardveres buffer (LATA, LATB, LATC,...), ami megoldja ezt a problémát.
(#) hmli válasza icserny hozzászólására (») Jún 1, 2012 /
 
Az eredeti feladatot megoldottam más módon, csak érdekelt, hogy miért van a leírt jelenség.
Köszönöm!
(#) llaczo hozzászólása Jún 1, 2012 /
 
Sziasztok.
Nekem is van egy furcsa jelenségem.
12F675 nem hajlandó végrehajtani a DECFSZ műveletet. A szimulátorban szépen működik, a valóságban viszont nem. Szereztem már másik PIC-ket is de ugyanaz. Próbáltam f helyett 1-et írni de semmi.
Az adatlapon említi a TMR0-ához rendelést de ez nekem ködös és nem is hiszem hogy ide vonatkozik.
Találkozott valaki már ilyen problémával?
előre is köszi. Üdv
(#) icserny válasza llaczo hozzászólására (») Jún 1, 2012 /
 
Idézet:
„12F675 nem hajlandó végrehajtani a DECFSZ műveletet.”
Ezt miből gondolod?
(#) Hp41C válasza llaczo hozzászólására (») Jún 1, 2012 /
 
Töltsd fel a programot.
(#) llaczo válasza Hp41C hozzászólására (») Jún 1, 2012 /
 
Szóval a 16F84A programozás már elég jól megy és a méretei miatt szerettem volna a 12F675-öst is begyakorolni, azért is mert van analóg bemenet, de semmi sem úgy megy ahogy szeretném.
Ezt gyakorlásra írtam. MPLAB IDE

listP=PIC12F675
include "P12F675.INC"

__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT

CBLOCK 0x0C
T1
T2
LEP

ENDC



BCF STATUS,RP0 ;Bank 0
CLRF GPIO ;Init GPIO
MOVLW b'00000111' ;Set GP<2:0> to
MOVWF CMCON ;digital IO - Komparátor kikapcsolása
BSF STATUS,RP0 ;Bank 1
CLRF ANSEL ;Digital I/O - Összes láb dihitális módra állítása
MOVLW b'00001100' ;Set GP<3:2> as inputs
MOVWF TRISIO ;and set GP<5:4,1:0> as outputs
;bsf2007h,4
BCF STATUS,RP0 ;Bank 0


VISSZA:
VIS0 BSF GPIO,0
BSF GPIO,1
CALL DELAY
BSF GPIO,0
BCF GPIO,1
CALL DELAY

BSF GPIO,0
BSF GPIO,1
CALL DELAY
BCF GPIO,0
BSF GPIO,1
CALL DELAY
GOTO VISSZA

DELAY: MOVLW d'150'
MOVWF T1
DEL: MOVLW d'255'
MOVWF T2
DEL1: NOP
NOP
NOP
BSF GPIO,5
NOP
NOP
NOP
NOP
NOP
DECFSZ T2,1
GOTO DEL1

BSF GPIO,4
DECFSZ T1,1
GOTO DEL

RETURN
end

A GPIO,5 kigyullad de a négyesig már nem jut el a program
(#) Hp41C válasza llaczo hozzászólására (») Jún 1, 2012 /
 
Szia!

A probléma kulcsa a16F675 adatlap 2.2.2 fejezet -ben található meg. Ld.2-2 ábra. A szabad RAM terület 0x20 -tól kezdődik, 0x00 - 0x1F között a speciális célú regiszterek vannak...
(#) llaczo válasza Hp41C hozzászólására (») Jún 1, 2012 /
 
Köszi. Mindjárt bogarászom
(#) Hp41C válasza llaczo hozzászólására (») Jún 1, 2012 /
 
Jelöld ki a hozzászólás végét...
(#) llaczo válasza Hp41C hozzászólására (») Jún 1, 2012 /
 
Úgy néz ki hogy még egy kis segítség elkelne. Elég kezdő vagyok. Nem tudok rájönni mire gondoltál.
Köszi.[OFF]
(#) mrobi válasza llaczo hozzászólására (») Jún 1, 2012 /
 
"CBLOCK 0x0C "

Ez nem jó benne. Nézd meg az adatlapon hogy ez milyen memória cím.
(#) llaczo válasza mrobi hozzászólására (») Jún 1, 2012 /
 
Hát igen. Itt 0x20-nál kezdődik. Sohasem jöttem volna rá. Betöltöttem és már villog is. Ott csúsztam el hogy az 16F84A programból másoltam.
Még egyszer köszi. [OFF]
(#) mrobi válasza llaczo hozzászólására (») Jún 1, 2012 /
 
Nincs mit. Amúgy hogy ha kijelölöd Hp41C-nek ezt a hozzá szólásat akkor megkapod a választ:
Idézet:
„Szia!

A probléma kulcsa a16F675 adatlap 2.2.2 fejezet -ben található meg. Ld.2-2 ábra. A szabad RAM terület 0x20 -tól kezdődik, 0x00 - 0x1F között a speciális célú regiszterek vannak...”
(#) llaczo hozzászólása Jún 1, 2012 /
 
Persze köszönet neked Hp41C az önzetlen segítségért. Észre sem vettem hogy mrobi is válaszol.
A halványan írt szöveg nálam nem látszik mert sötétebb a háttér.
Egy csomó időt megspóroltam volna.[OFF]
(#) mrobi válasza llaczo hozzászólására (») Jún 1, 2012 /
 
Direkt csinálta.
(#) llaczo válasza mrobi hozzászólására (») Jún 1, 2012 /
 
Jól csinálja. Most jöttem rá a trükkre. Így nagyobb az esély hogy ránk kezdőkre ragad valami.
És a végeredmény is megvan. Mindketten jók vagytok. Köszi. [OFF]
(#) mrobi hozzászólása Jún 2, 2012 /
 
Sziasztok!
Egyik tanárom készített egy kis doksit. Beleolvasgattam. Véleményem szerint kezdőknek tökéletes. Nem csak a hardveres dolgokat magyarázza el hanem a softveres részeket is. Én csak az assambly nyelvet ismerem de ebből a dokumentumból már elkezdtem C nyelvet tanulni. Nem is olyan nagy ördöngösség.
Itt a link!
(#) llaczo válasza mrobi hozzászólására (») Jún 2, 2012 /
 
Köszi a dolgozatot. Kerestem már magyar nyelvű C vagy PASCAL leírást, de elég gyéren találtam. Ez nagyon jó lesz.
(#) mrobi válasza llaczo hozzászólására (») Jún 2, 2012 /
 
Örülök neki hogy tetszik! Persze a C nyelvet ez se teljesen az alapoktól kezdi de szerintem a példákkal nagyon szemléletesen van bemutatva.
(#) Auf válasza mrobi hozzászólására (») Jún 2, 2012 /
 
Szia!

Ha C -t akarsz az alapoktól, akkor ezt ajánlom, én innét kezdtem.
De máshonnan is lehet szerezni tudást. Például innen .

Köszi a pic-es c-t!
(#) pajti2 hozzászólása Jún 2, 2012 /
 
MicroSD kártyákkal bírkózott már valaki a közelmúltban? Olyasmit olvastam róla (egy ramtron adatlap említette meg), hogy nagyfrekis környezeti zavarok hatására hibásodhat az adatblokk, ami felkerül a kártyára.

Valós ez a probléma az alkalmazott gyakorlatban?
(#) Stadi válasza llaczo hozzászólására (») Jún 3, 2012 /
 
A Kónya-féle PIC könyv 3. kiadása is viszonylag részletesen tárgyalja a C-ben történő programozást.
(#) Stadi hozzászólása Jún 3, 2012 /
 
Oshonsoft PIC szimulátorban valaki próbált már szimulálni 4-bites LCD kezelést?

Én megírtam a programot, de az Istennek se akart csinálni semmit a virtuális LCD-vel. Úgy voltam vele, hogy biztos elszúrtam valamit, de képtelen voltam rájönni, mi lehet az. Végül ma fogtam a kódot, beégettem egy PIC-be, és egy dugaszolós próbapanelen gyorsan összeraktam egy minimális teszt kapcsolást. Elsőre működött a dolog. Tehát vagy a szimulátor hibás, vagy rosszul állítottam be (habár végigpróbáltam szinte mindent benne). Szóval PORT B, 4-bit high a beállítás, az RS és E jelek a PORT A megfelelő bitjeire vannak konfigurálva.

A vicc az, hogy ha megírom 8-bitesre a vezérlést, és csak annyit változtatok a beálításokon, hogy PORT B, 8-bit, akkor egyből megy a szimuláció.
Következő: »»   263 / 1208
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