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   638 / 1210
(#) elektro777 hozzászólása Márc 4, 2015 /
 
Sziasztok!
Valaki jártas ezzel a cikkel kapcsolatban?
Köszönöm előre is!
(#) Hp41C válasza sonajkniz hozzászólására (») Márc 4, 2015 /
 
A DT direktíva egy-egy retlw utasítás paraméterének tárolja a karaktereket. Az utasítás kódja 18F -en 16 bites, ami lehetővé teszi utasításonként két karaktert tároljunk, így a szövegek fele annyi helyet foglalnának.
A DB direktíva egy-egy byte -ot fordít a program memóriába, utasításonként 2 darabot. Páratlan számú adatot kiegészíti egy 0x00 -val.
Működik az alábbi forma is, ugyan úgy látható, mi lesz a kijelzőn:
DB "Szerbusz pajti! "," Hogy vagy? "
A kiolvasásra a tblrd utasítás használható.
(#) don_peter válasza spgabor hozzászólására (») Márc 4, 2015 / 1
 
A reléhez mindenképp tedd be a diódát nehogy visszacsókoljon
Nézd meg, hogy a Buzzered hány voltos mert, ha 5v-al táplálod, és 12v-os, akkor nem fog szépen és hangosan sípolni.
És lehetőleg a Buzzert ne a PIC-ről jövő szálról tápláld...és talán ellenállás sem kell vagy csak nagyon kicsi, ha 5v-os..

A gombnyomásokat nem kezeled, nem látok pergésmentesítést ez is lehet baj..
Az isr-ben azért is bennragadhat mert van benne végtelen ciklus.
(#) sonajkniz válasza Hp41C hozzászólására (») Márc 4, 2015 /
 
Tehát azt mondod, ha DB-t használnék, nem kellene a tblrd-t kettesével léptetnem?
(#) Hp41C válasza sonajkniz hozzászólására (») Márc 4, 2015 /
 
Ha db -t használsz, akkor tblrd utasítással lehet kiolvasni az adatot. A DT -t használsz, akkor egy a szubrutinban elhelyezett PCL regiszterbe való írással lehet hozzáférni az adatokhoz. Működik az a öszvér megoldás is, hogy DT -vel letett adatokat tblrd utasítással olvasunk ki, de ebben az esetben minden "felső" byte számunkra értéktelen lesz, így a TBLPTR regisztereket módosítani kell.
A hozzászólás módosítva: Márc 4, 2015
(#) spgabor válasza don_peter hozzászólására (») Márc 4, 2015 /
 
A reléhez milyen diódát érdemes tenni?
A buzzerem öt voltos, így valószínűleg nagyon sok neki az 1k, este miután írtam a bejegyzést, kicsit variáltam vele, úgy hangosabb lett, de szerintem ki fogom hagyni teljesen.

Viszont az öt voltot hogy érted? Kösszem közvetlenül a feszstab 5V-os lábához, vagy elég, ha kicsit megvastagítom a közös táp vezetőszálat.

A gombsormban van pergésmentesítő, csak beleraktam a kijelző vezérlést, met ha folyamatosan nyomom a gombot, akkor addig a kijelző meghajtás nem működik.
  1. if(!PERC){
  2.             while(!PERC){
  3.                 display_drive(perc / 10, masodperc / 10, BalDigit);
  4.                 __delay_ms(5);
  5.                 display_drive(perc % 10, masodperc % 10, JobbDigit);
  6.                 __delay_ms(5);
  7.             }
  8.             perc++;
  9.             if(perc > 99){
  10.                 perc = 0;
  11.             }
  12.         }

Igazából arra gondoltam még, hogy a PIC másik időzítőjét kellene használnom a kijelzőre, ami folyamatosan menne. Így sok kódsort spórolhatnék, valamint nem is kellene mindenhol kezelni a meghajtást. Csak ehhez megint nem nagyon értek még.

Végtelen ciklusban mire gondolsz? Arra, amikor a perc és a mp is nulla lesz? Mert ott akkor kikapcsolom az időzítőt, akkor nem kellene az egész megszakítás folyamatnak megszakadnia?
(#) sonajkniz válasza Hp41C hozzászólására (») Márc 4, 2015 /
 
A PCL regiszteres módszer nekem nem működött normálisan. Csak csekély adatmennyiséget tudtam vele letárolni, azt is csak a programmemória egy adott területén. Jelenleg így olvasom:
KIOLVASAS
CLRF TBLPTRU
MOVFF MI6,TBLPTRH
MOVFF MI5,TBLPTRL
TBLRD*
MOVF TABLAT,W
CALL KIIRAS
RETURN
Az adatokat pedig a program legvége mögött tárolom, a 0x2000 hexa cím fölött.
Ha tudsz jobb módszert, szívesen kipróbálnám.
(#) Hp41C válasza sonajkniz hozzászólására (») Márc 4, 2015 /
 
Még meg kellene tudnom, hogy hogyan tárolod a szöveget és hogyan módosítod a MI5 értékét.

Egy adott hosszúságú szöveg kiírása:
  1. Message: DB "Hello word." ; egy 0x00 -t még hozzátesz
  2. movlw .11
  3. movwf LENGTH
  4. movlw low(Message)
  5. movwf TBLPTRL
  6. movlw high(Message)
  7. movwf TBLPTRH
  8. clrf TBLPTRU
  9. loop:
  10. tblrd*+
  11. movf TABLAT,w
  12. call KIIRAS
  13. decfsz LENTGH,f
  14. bra loop

Egy 0x00 végű szöveg kiírása:
  1. Message: DB "Hello word." ; egy 0x00 -t még hozzátesz
  2. movlw low(Message)
  3. movwf TBLPTRL
  4. movlw high(Message)
  5. movwf TBLPTRH
  6. clrf TBLPTRU
  7. loop:
  8. tblrd*+
  9. movf TABLAT,w
  10. btfsc STATUS,z
  11. return 0
  12. call KIIRAS
  13. bra loop
A hozzászólás módosítva: Márc 4, 2015
(#) don_peter válasza spgabor hozzászólására (») Márc 4, 2015 / 1
 
1N4007-es egyenirányítót használok én oda.
Az kb. 1-1.5A-et bír el.
Az 1k-s ellenállás a Buzzerhez nagyon sok, tegyél oda egy 100Ohm-ost vagy 200 körülit, próbálgasd ki. (A Buzzer adatait is megnézheted, hogy mennyi áramerősség kell neki és úgy is beállíthatod az ellenállás értékét)
Közvetlen vidd a stabilizátortól a vezetőt a buzerig, ne a PIC-en keresztül.
A Buzzer meg húzhatja vagy bezavarhatja a PIC táplálását.
Ráadásul 100nF-os kondikkal sem szűröd a PIC közvetlen lábát vagy táplábait, ez is egy hiba lehet.

Bár most nem pontosan tudom mi miért is van, de szerintem ez rész nem szerencsés az isr-ben.
  1. if(!STOP){ //PAUSE
  2.         while(!STOP){
  3.             display_drive(perc / 10, masodperc / 10, BalDigit);
  4.             __delay_ms(5);
  5.             display_drive(perc % 10, masodperc % 10, JobbDigit);
  6.             __delay_ms(5);
  7.         }
  8.         RELE = 0;
  9.         TMR2IE = 0;
  10.     }

Ha STOP van akkor egyszerűbb lenne csak simán a STOP-ra reagálnia nem még a kivezérlésre is, amúgy az csak egy pillanat, szóval...

  1. if(!STOP){ //PAUSE
  2.         while(!STOP);   // Várakozunk gomb felengedéséig
  3.         RELE = 0;
  4.         TMR2IE = 0;
  5.     }

Persze lehet neked tök más miatt van ott, de a lényeg, hogy nem szerencsés..
(#) sonajkniz válasza Hp41C hozzászólására (») Márc 4, 2015 /
 
Ha jól értem, akkor te a programba írod a szöveget, és rögtön ki is olvasod?
Akkor minden egyes szöveg megjelenítéséhez kell ez a 13 sor?
Nekem van írva egy 55 soros olvasórutin, ami a programmemória hátsó részéből címzés alapján veszi ki a szöveget. Akár 255 előre letárolt 2x16 karakteres szöveget.
Így néz ki:
  1. ;-------------Szöveg kiolvasása memóriából, és kiírása kijelz?re----------------
  2. SZOVEG
  3.     MOVLW   D'64'              ;------------------------------------------------
  4.     MULWF   MI1                ; MI1 a szöveg sorszáma
  5.     MOVFF   PRODL,MI5          ;
  6.     MOVFF   MI5,MI4            ; Ez a rutin, a megadott szövegsorszám alapján
  7.     MOVLW   H'20'              ;beállítja a kiolvasási kezd?pozíciókat(MI5, MI6)
  8.     ADDWF   PRODH,W            ;és a lépésszám ellen?rzést(MI4).
  9.     MOVWF   MI6                ;
  10.     MOVLW   D'30'              ;
  11.     ADDWF   MI4,F              ;------------------------------------------------
  12.     UTASITAS                   ;------------------------------------------------
  13.         MOVLW   B'00000001'        ;
  14.     CALL    KIIRAS             ; Ez a rutin átkapcsolja a kijelz?t utasítás
  15.     DELAY   D'250'             ;fogadására. Ezt követ?en törli a kijelz?t, majd
  16.     DELAY   D'250'             ;rövid kivárás után beállítja a fels? sor kezd?-
  17.         MOVLW   B'10000000'        ;címét, ezután visszaálítja adatfogadásra.
  18.     CALL    KIIRAS             ;
  19.     ADAT                       ;------------------------------------------------
  20. VERS1                          ;------------------------------------------------
  21.     CALL    KIOLVASAS          ;
  22.     MOVF    MI4,W              ; Ez a rutin meghívja a KIOLVASAS rutint, majd
  23.     SUBWF   MI5,W              ;miután visszatért, összehasonlítja MI5 és MI4
  24.     BTFSC   STATUS,C           ;értékét.  Ha egyenl?, átlép VAS-ra. Ha nem,
  25.     GOTO    VAS                ;akkor MI5 értékét 2-vel növeli, és újra indítja
  26.     INCF    MI5                ;a ciklust.
  27.     INCF    MI5                ;       (VAS=Vers Alsó Sora)
  28.     GOTO    VERS1              ;------------------------------------------------
  29. VAS INCF    MI5                ;
  30.     INCF    MI5                ; Ebben a részben megnöveljük MI5 értékét 2-vel,
  31.     BTFSC   STATUS,C           ; Ellen?rízzük a túlcsordulást. Ha túlcsordult,
  32.     INCF    MI6                ;akkor MI6-ot is megnöveljük 1-el. (Ezáltal 255
  33.     MOVLW   D'32'              ;sor szöveget lehet létrehozni lapozás nélkül.)
  34.     ADDWF   MI4,F              ; MI4 értékét 32-vel növeljük.
  35.     UTASITAS                   ;(Egy szövegmez? hossza a memóriában 32 byte)
  36.         MOVLW   B'11000000'        ; Ezután beállítjuk az alsó sor kezd?címét.
  37.     CALL    KIIRAS             ;
  38.     ADAT                       ;------------------------------------------------
  39. VERS2                          ;------------------------------------------------
  40.     CALL    KIOLVASAS          ;
  41.     MOVF    MI4,W              ;
  42.     SUBWF   MI5,W              ; VERS2 rutin teljesen megegyezik VERS1 rutinnal,
  43.     BTFSC   STATUS,C           ;csak MI5 és MI4 egyezése esetén innen már
  44.     RETURN                     ;visszalép a program a meghívási pontra.
  45.     INCF    MI5                ;
  46.     INCF    MI5                ;
  47.     GOTO    VERS2              ;------------------------------------------------
  48. KIOLVASAS                      ;------------------------------------------------
  49.     CLRF    TBLPTRU            ;
  50.     MOVFF   MI6,TBLPTRH        ; Ez a rutin a beállított címzési értékek alapján
  51.     MOVFF   MI5,TBLPTRL        ;(MI5 MI6) kiolvassa a programmemória egy pontján
  52.     TBLRD*                     ;tárolt változó értékét. Az értéket W-be tölti
  53.     MOVF    TABLAT,W           ;majd meghívja KIIRAS rutint. Ezt követ?en a
  54.     CALL    KIIRAS             ;program visszatér a meghívási pontra.
  55.     RETURN

A szöveget bpedig így tárolom:
  1. ;------------------------Szöveg beírása 1-es tábla------------------------------
  2. ; A szöveg hossza mindíg 2x16 karakter kell legyen! Az üres mez?ket "SPACE"-val
  3. ;kell kitölteni! FIGYELEM!!!  org értékét TILOS átírni. Felborítja a programot!
  4.     org     0x2020
  5.     DT      "                "           ;Ez a mez? mindíg üres kell hogy legyen
  6.     DT      "Szerbusz Petike!","Szerbusz Lacib",H'00',"!"            ; szöveg 1
  7.     DT      "Ez a program j",H'03'," ","alap ahhoz, hogy"            ; szöveg 2
  8.     DT      "kijelz",H'02',"vel ren- ","delkez",H'02'," progra- "    ; szöveg 3
  9.     DT      "mot k",H'01',"sz",H'04',"tsetek.","Ha a gombot meg-"    ; szöveg 4
  10.     DT      "nyomod, ",H'01',"rdeke- ","sen fog v",H'00',"ltozni"    ; szöveg 5
  11.     DT      "a program fut",H'00',"sa","    Viszl",H'00',"t!    "    ; szöveg 6
  12.  
  13. ;-------------------------------------------------------------------------------
  14.     END

Meghívása pedig ennyi:
MOVLW D'4'
MOVWF MI1
CALL SZOVEG
(#) spgabor válasza don_peter hozzászólására (») Márc 4, 2015 /
 
Néztem már a buzzer adatlapját, de már nem emlékszem. Majd az alapján kicserélem az ellenállást, a tápot meg átkötöm.
100nf-os kondit a Vdd és Vpp-hez is tegyek, vagy elég csak a Vdd-hez?

A STOP-ot azért tettem az isr-be, hogy le tudjam állítani az időzítőt, majd folytatni. Ha kiveszem belőle, akkor sem működik megfelelően.
Eredetileg a kijelzés nem volt benne a gombok kezelésében, de zavart, hogy bár csak max másodpercekig tart a gombnyomás, de nem szépen reagál a kijelző rá. Azért is írtam, hogy lehet megfelelőbb lenne egy másik timer-t beiktatni ami csak a kijelzőt kezelné.
(#) nedudgi válasza elektro777 hozzászólására (») Márc 4, 2015 /
 
Az miért jó, ha tudod? Mire mész 50 igen, 32 talán válasszal?
Tegyél fel egy jól megfogalmazott kérdést, majd kiderül, tudunk-e segíteni.
A hozzászólás módosítva: Márc 4, 2015
(#) Hp41C válasza sonajkniz hozzászólására (») Márc 4, 2015 /
 
Sok apró kérdés:
Miért nem használod a tblrd*+ változatot, ami automatikusan növeli a TBLPTR regisztereket (átvitelkezeléssel)?
Mivel a DT leteszi a "felső" byte -okba a retlw utasításkódját, ezzel a megoldással kétszer kell növelni a mutató regisztereket átvitel kezeléssel. Egy második tblrd*+ egyszerűen megtenné, a kiolvasott adatot nem is kellene kivenni a TABLAT -ból.
Ha egy sorral végzett, a mutató pontosan a következő sorra állna automatikusan, csak akkor kellene módosítani, ha nem a soron következőt kellene kiírni...
A megoldásomban a kiíró rutinok szétbonthatók két részre:
1 - a TBLPTR regiszterek feltölése és a hossz megadása, ha kell
2 - maga a kiolvasó és kiíró rész.
Az elsőből annyi kell, ahány különböző szöveget kell kiírni, a másikból csak egy példány kell.
A hozzászólás módosítva: Márc 4, 2015
(#) sonajkniz válasza Hp41C hozzászólására (») Márc 4, 2015 /
 
Azért találtam ki ezt a módszert, mert komplex vezérléseket is kell készítssek, és így a programomba nem zavar bele a kijelzőkezelő. Az csak ott van valahol a progi végén, és ha a program futása közben üzenetet kell küldjek a felhasználónak, egy 3 soros paranccsal megtehetem, és a program már megy is tovább, a kijelzőn meg ott a szöveg. Ráadásul, mivel teljesen különálló egységként van a program végén, így nem zavar bele a program értelmezésébe. Áttekinthetőbb az egész. Többek között ezért is programozok assemblerben, mert szekcionáltan futtatható a program, nem kotor végig, ha kell ha nem az összes kódon, ezáltal a futás sokkal gyorsabb és stabilabb. Gyakran programozok PLC-t. A létradiagramm kezelése még egyszerűbb mint a C nyelv, de egy hosszabb programnál már csúnyán be tud lassulni, ráadásul egy látszatra egyszerű és logikus módosítástól, van hogy egész más helyen borul el az agya, mint ahol módosítok. Viszont valamiben segíthetnél! Tudsz olyan módszert, amivel a programmemória egy előre kiválasztott területére a program futása közben adatokat lehet írni, későbbi kiolvasás céljából? Mert amiket én a netről összemazsoláztam, vagy túl bonyolultak, vagy nem működnek.
(#) don_peter válasza spgabor hozzászólására (») Márc 4, 2015 /
 
A 100nF-ot a VDD és GND közé kell tenni a PIC-hez lehető legközelebb.
Arra kell törekedni, hogy az isr-ben a lehető legkevesebb utasítás legyen.
Mindent amit lehet kezeld inkább a main() szekcióba.

Az isr elvileg másodpercenként 1000szer fog lefutni, vagy is ha minden pompásan működik, akkor 1 ezredmásodperce van a megszakításnak, hogy minden utasítást elvégezzen.
Ez fontos, hogy ezen idő alatt ki is tudjon lépni a főprogramban..

Azt kell megnézned, hogy mi is történik valójában a programodban.
Fut a main() szekciód folyamatosan és mikor megszakítás van 1000-ed másodpercenként vagy is 1ms-onként, akkor mindent felfüggeszt a PIC és elvégzi a megszakításban megadott utasításokat, majd ha végzet vissza tér a főprogramba oda ahol előtte félbehagyta a műveletét...és ezt ismételgeti ameddig le nem állítod.

Közben elfelejtettem miért is írtam ezt

Mit csinál egyébként, videót készítettél róla?
A hozzászólás módosítva: Márc 4, 2015
(#) spgabor válasza don_peter hozzászólására (») Márc 4, 2015 /
 
Elmegyek enni, rakok bele diódát meg kondit és csinálok videót.
Annyit csinál amúgy, hogy fut a végtelen ciklus, és amikor elindítom a megszakítást, a próbaképp beállított 17 perc 32 másodperc kb egy perc nullára ér, majd bennragad a korábban említett buzzer csipogtató if ágban.
(#) elektro777 válasza nedudgi hozzászólására (») Márc 4, 2015 /
 
Megépítettem a Kapcsolást, beégettem a pic-be az ott található hex file-t.
És mivel nem vagyok jártas a hálózatokban, a kérdésem az lenne hogy milyen beállítások szükségesek az android oldalon, és a router oldalon hogy műkődjön a a 3g-s vezérlés.
Köszönöm!
(#) Hp41C válasza sonajkniz hozzászólására (») Márc 4, 2015 /
 
Az általam javasolt megoldás szövegei, a szöveg paramétereinek beállítása(i) és a kiíró rész egymástől függetlenül bárhol lehetnek elszórva a programmemóriában (ha 64k -nál nagyobb a programtár, a TBLPTRU is kezelendő).
Hogyne működne, de több dolgot be kell tartani:
- Ne legyen program végrehajtás az írni / törölni szánt területen, még a megszakítási rutinból sem.
- Egy teljes tarományt lehet törölni és írás előtt törölni is kell. Ha csak módosítani szeretnénk egy-két adatot, akkor a tarományt ki kell olvasni RAM -ra, ott módosítani, a tartományt törölni kell és vissza kell írni a módosított adatokat. Az üres tartalomra törlés nélkül is lehet írni. (Álatalában egy 1 bitet lehet 0 -ba írni, de 0 bitet csak törléssel lehet 1 étrékűre állítani.)
- A programozási utasításban megadott számú byte - ot / utasítást lehet egyszerre beírni.
Konkréten a 18F14K22 esetén 64 byte -os tarományok törölhetők, 16 byte = 8 utasítás írható egyszerre.
Az assembly nyelvű mintapélda az adatlapban megtalálható.
(#) don_peter válasza spgabor hozzászólására (») Márc 4, 2015 /
 
Kicsit módosítottam a kódon..
  1. #include <stdio.h>
  2.     #include <stdlib.h>
  3.     #include <htc.h>
  4.      
  5.     __CONFIG(WDTE_OFF & FOSC_XT & CP_OFF & LVP_OFF & BOREN_OFF & MCLRE_ON & PWRTE_ON);
  6.      
  7.     #define _XTAL_FREQ 4000000
  8.     //gombok
  9.     #define PERC RA1
  10.     #define MASODPERC RA0
  11.     #define TOROL RA2
  12.     #define START RA3
  13.     #define STOP RA4
  14.     //kijelzo
  15.     #define BLANK RB0
  16.     #define DATA RB1
  17.     #define CLK RB2
  18.     #define ENABLE RB3
  19.     //rele, beep
  20.     #define RELE RB4
  21.     #define BEEP RB5
  22.      
  23.     volatile unsigned int szamlalo = 0;
  24.     volatile unsigned int perc = 0;
  25.     volatile unsigned int masodperc = 30;
  26.     volatile unsigned int karakter_1 = 0;
  27.     volatile unsigned int karakter_2 = 0;
  28.     volatile unsigned int karakter_3 = 0;
  29.     volatile unsigned int karakter_4 = 0;
  30.     volatile unsigned int dispword = 0;
  31.      
  32.     unsigned char DigitBal[10] = {0x77, 0x41, 0x6E, 0x6B, 0x59, 0x3B, 0x3F, 0x61, 0x7F, 0x7B};
  33.     unsigned char DigitJobb[10] = {0x77, 0x44, 0x3E, 0x5E, 0x4D, 0xDB, 0xFB, 0x46, 0xFF, 0xDF};
  34.      
  35.     unsigned int BalDigit = 0x100;
  36.     unsigned int JobbDigit = 0x80;
  37.      
  38.     void display_drive(int kijelzo_bal, int kijelzo_jobb, int oldal){
  39.         BLANK = 0;
  40.         dispword = (DigitBal[kijelzo_bal] | (DigitJobb[kijelzo_jobb] << 9)) | oldal;
  41.         CLK = 0;
  42.         ENABLE = 1;
  43.         for(int i = 0; i < 16; i++){
  44.             CLK = 1;
  45.             DATA = (dispword & 0x01);
  46.             dispword >>= 1;
  47.             __delay_us(1);
  48.             CLK = 0;
  49.             __delay_us(1);
  50.         }
  51.         __delay_us(1);
  52.         ENABLE = 0;
  53.         BLANK = 1;
  54.     }
  55.      
  56.     void interrupt isr(void){
  57.         szamlalo++;
  58.         if(!STOP){ // Ez nem szünetelteti hanem megállítja timer2-őt itt érdemes törölni az idő változóit
  59.             while(!STOP); // Innen kivettem a felesleges részeket
  60.             RELE = 0;
  61.             TMR2IE = 0;
  62.         }
  63.         if(szamlalo == 1000){ // Esetleg próbálkozhatsz egy ilyen operandus párossal (szamlalo >= 1000)
  64.             if(masodperc == 0 && perc != 0){
  65.                 perc--;
  66.                 masodperc=60;
  67.             }else if(masodperc == 0 && perc == 0){
  68.                 RELE = 0;
  69.                 TMR2IE = 0;
  70.                 BEEP = 1;
  71.                 __delay_ms(200);  // Ez a rész okozhat fejfájást főleg, hogy a megszakítás 1ms-onként ismétlődik , ezt a timer leállítása után kellene tenni úgy biztosabb lesz a dolog, át is teszem
  72.                 BEEP = 0;
  73.             }else{
  74.                 masodperc--;
  75.             }
  76.             szamlalo = 0;
  77.         }
  78.     }
  79.      
  80.     int main() {
  81.         TRISA = 0xFF;  //A lábai bemenet lettek állítva
  82.         PORTA = 0; // PortA alacsony szinten
  83.         PORTB = 0x00; //PortB alacsony szinten
  84.         TRISB = 0x00; // B lábai kimenetek
  85.         CMCON = 7; // Comparator kikapcsolva
  86.         CCP1CON = 0; // Capt/Comp/PWM kikapcsolva
  87.         INTCON = 0;   // Összes interrupt láb kikapcsolva
  88.         PR2 = 249; // Timer2 PR2 8bites periódus regiszter
  89.         T2CON = 5; // T2CON regiszter
  90.         TMR2IE = 0; // TMR2IE megszakítást engedélyez? bit (leállítva a Timer2)
  91.         PEIE = 1; // Peripheral interrupt engedélyezése
  92.         GIE = 1; // Globális interrupt engedélyezése
  93.         DATA = 1;
  94.         ENABLE = 0;
  95.      
  96.         while(1){
  97.             display_drive(perc / 10, masodperc / 10, BalDigit);
  98.             __delay_ms(5);
  99.             display_drive(perc % 10, masodperc % 10, JobbDigit);
  100.             __delay_ms(5);
  101.             if(!PERC){
  102.                 while(!PERC); // Nem kell itt is a kijelzőt hajtani, a gombnyomás is egy pillanat műve
  103.                 perc++;
  104.                 if(perc > 99){
  105.                     perc = 0;
  106.                 }
  107.             }
  108.             if(!MASODPERC){
  109.                 while(!MASODPERC); // Nem kell itt is a kijelzőt hajtani, a gombnyomás is egy pillanat műve
  110.                 masodperc++;
  111.                 if(masodperc > 60){
  112.                     masodperc = 0;
  113.                 }
  114.             }
  115.             if(!TOROL){
  116.                 while(!TOROL); // Nem kell itt is a kijelzőt hajtani, a gombnyomás is egy pillanat műve
  117.                 perc = 0;
  118.                 masodperc = 0;
  119.             }
  120.             if(!START){
  121.                 while(!START); // Nem kell itt is a kijelzőt hajtani, a gombnyomás is egy pillanat műve
  122.                 RELE =  1;
  123.                 TMR2IE = 1;
  124.             }
  125.         }
  126.     }


Próbáld meg így, hátha
A hozzászólás módosítva: Márc 4, 2015
(#) sonajkniz válasza Hp41C hozzászólására (») Márc 4, 2015 /
 
Kösz a választ, de sajna az én esetemben ez a megoldás nem járható. Túl lassú és macerás.
Akkor már inkább EEPROM-ba tárolok, az jóval egyszerűbb, csak annak meg a felülírhatósága véges. Vagy kell csináljak egy olyan tápot, ami külön látja el a PIC-et egy komoly pufferrel, és el kell használjak egy lábat tápfigyelésre, hogy adatokat tudjak menteni, és alapban a ramban kell dolgozzak. Az meg ugye osztott, így kevés áll rendelkezésre, ráadásul az indirekt címzésnek is vannak komoly gyerekbetegségei. Ugyanúgy, mint a PCL-nek. Igazából nem is értem a fejlesztőket, hogy a programmemória írása miért van ilyen kegyetlenül elbonyolítva. Ha egyszerűen írható lenne, nem is kellene bele EEPROM. Főleg azért, mert ha módosítok a programon, az EEPROM-ból ugyanúgy eltünnek a bevitt adatok, mint a programmemóriából. Ehez képest viccesnek találom, hogy ha a táp nem szűnik meg a PIC-en a programmodosítás során, akkor a RAM-ban lévő adatok megmaradnak.
(#) spgabor válasza don_peter hozzászólására (») Márc 4, 2015 /
 
Az általad javasolt módosításokkal annyi változást történt, hogy kicsit lassabb fut le az interupt. De még mindig sokkal gyorsabban, mint a valós idő sebessége.
Itt elérhető egy videó a kijelzőről működés közben: http://spgabor.uw.hu/VIDEO0007.mp4
A picre töltött kód az általad javasolt módosításokat tartalmazza. A videón 5 percre beállított időzítés történik. Akkor indul el az időzítés, amikor a kijelzés meghajtás leáll, ez látszik is, hogy az utoljára kiírt két karakter marad csak a kijelzőn. Majd amikor nullázódik a perc és másodperc, akkor visszatért a while(1) ciklusba a folyamat és csupa nulla lesz a kijelzőn.
(#) don_peter válasza spgabor hozzászólására (») Márc 4, 2015 /
 
Azt próbáld már ki, hogy mondjuk a másodpercenkét ki és be kapcsolod a relét vagy ha van különálló LED akkor azt.
A kijelző meghajtás és egyéb addig legyen kikommentelve..

Ezt azért, hogy kizárd az esetleges rossz beállításokat vagy hibás beültetést..
Csak az isr működjön..
Ez próbáld ki több féle idővel és közben mérjed is egy órán vagy valamivel...

Amúgy a videón nem sokat látni, árnyékban kellett volna a kijelzőt tartani mert alig látható mit ír ki..
A hozzászólás módosítva: Márc 4, 2015
(#) Hp41C válasza sonajkniz hozzászólására (») Márc 4, 2015 /
 
Idézet:
„Akkor már inkább EEPROM-ba tárolok, az jóval egyszerűbb, csak annak meg a felülírhatósága véges.”

De mégis sokkal több, mint a program memóriáé...
Idézet:
„Az meg ugye osztott, így kevés áll rendelkezésre, ráadásul az indirekt címzésnek is vannak komoly gyerekbetegségei.”

Ez inkább a 16F -ekre vonakkozik, a 18F -eken az egész RAM egyszerűen kezelhető indeirekten.
Idézet:
„Főleg azért, mert ha módosítok a programon, az EEPROM-ból ugyanúgy eltünnek a bevitt adatok, mint a programmemóriából.”

Mind az MpLab -ban, mind a PICKit2 kezelőú programjában beállítható az EEPRom mamória tartalmának megőrzése.
A hozzászólás módosítva: Márc 4, 2015
(#) sonajkniz válasza Hp41C hozzászólására (») Márc 4, 2015 /
 
Én a neten azt olvastam, hogy az EEPROM ujraírhatósága kb 1000, a programmemóriájé viszont min 10000. Mindazonáltal hagyom magam meggyőzni, ha azt mondod hogy ez pont forditott.
Idézet:
„Ez inkább a 16F -ekre vonakkozik, a 18F -eken az egész RAM egyszerűen kezelhető indeirekten.”

Az adatlap szerint a ramból mindössze 96 byte-ot használhatok szabadon. Ez van a memoria lap elején. A másik 160 byte a funkcióregisztereknek van fentartva. Indirekt címzéssel még sosem tudtam a felső ramsort elérni.
(#) spgabor válasza don_peter hozzászólására (») Márc 4, 2015 /
 
Relével próbáltam és most tényleg valami nem jó.

  1. void interrupt isr(void){
  2.         szamlalo++;
  3.         if(szamlalo == 1000){
  4.             if(RELE == 0){
  5.                 RELE = 1;
  6.                 szamlalo = 0;
  7.             }else{
  8.                 RELE = 0;
  9.                 szamlalo = 0;
  10.             }
  11.         }
  12.     }


A relé nem másodpercenként vált, hanem darál nagyon gyorsan.

Viszont így, meg a relé egyszer sem húz be:
  1. void interrupt isr(void){
  2.         szamlalo++;
  3.         if(szamlalo == 1000){
  4.             szamlalo = 0;
  5.             if(RELE == 0){
  6.                 RELE = 1;
  7.             }else{
  8.                 RELE = 0;
  9.             }
  10.         }
  11.     }
A hozzászólás módosítva: Márc 4, 2015
(#) nedudgi válasza elektro777 hozzászólására (») Márc 4, 2015 /
 
Az EEPROM tartalmat beállítottad?
A hozzászólás módosítva: Márc 4, 2015
(#) spgabor válasza spgabor hozzászólására (») Márc 4, 2015 /
 
Hülyeséget írtam, a második esetben is rossz, folyamatosan kapcsolgatja a relé állását, csak véletlenül kinyomtam az időzítés futását.
(#) don_peter válasza spgabor hozzászólására (») Márc 4, 2015 / 1
 
Akkor valami a beállításoknál hibázik, vagy a bekötésnél..
Az első verziónak működnie kellene..

De ne felejtsd ki a timer flag-et törölni mert akkor nem lesz jó sosem..
Az isr végére ezt be kell tenned:
  1. TMR2IF = 0;

Valahogy így:
  1. void interrupt isr(void){
  2.             szamlalo++;
  3.             if(szamlalo == 1000){
  4.                 if(RELE == 0){
  5.                     RELE = 1;
  6.                     szamlalo = 0;
  7.                 }else{
  8.                     RELE = 0;
  9.                     szamlalo = 0;
  10.                 }
  11.             }
  12.              TMR2IF = 0;
  13.         }
A hozzászólás módosítva: Márc 4, 2015
(#) spgabor válasza don_peter hozzászólására (») Márc 4, 2015 /
 
De ha nem törlöm, akkor ezzel folyamatosan másodpercenként kellene ki-be kapcsolnia a relének.
(#) don_peter válasza spgabor hozzászólására (») Márc 4, 2015 /
 
A megszakítás végén mindig törölni kell a flag-et..
Lehet ez meg is oldja a problémádat..
Következő: »»   638 / 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