Fórum témák
- • Videomagnó problémák
- • Elfogadnám, ha ingyen elvihető
- • SMD, mi a típusa?
- • Androidos okos telefonok
- • Központi fűtés (vezérlés)
- • Műhelyünk felszerelése, szerszámai
- • Audiofil, High End Audio
- • Borhűtő vezérlő panel
- • Kombikazán működési hiba
- • Laptop javítás, tuning
- • Kondenzátor
- • Alternativ HE találkozó(k)
- • Klíma beszerelése, fűtés-hűtés házilag
- • Digitális óra
- • Varrógép elektronika
- • IMI villanymotor
- • Arduino
- • Súlymérés
- • Erősítő mindig és mindig
- • Mosógép vezérlők és általános problémáik
- • Analóg oszcilloszkóp javítása
- • Boombox javítás
- • Elektromos távirányítós kapunyitó
- • Számítógép hiba, de mi a probléma?
- • Szünetmentes táp javítása, élesztése
- • Hűtőgép probléma
- • Videoton EA-7386-s erösítő
- • Digitális mérleg
- • Kapcsolási rajzot keresek
- • TV hiba, mi a megoldás?
- • Felajánlás, azaz ingyen elvihető
- • Triak és tirisztor helyettesítése
- • Rádióamatőrök topikja
- • Hangszórójavítás (otthon)
- • LED-es világítás
- • Whirlpool mosógép
- • Vásárlás, hol kapható?
- • Autóelektronika
- • Hangváltók (készítése)
- • Függvénygenerátor építése
- • Vicces - mókás történetek
- • Dobozolási technikák, műszerdobozok
- • Forrasztópákák - melyik miért jó
- • CPLD, FPGA - Miértek, hogyanok
- • Eredményjelző
- • Klíma szervizelés, javítás
- • V-FET és SIT erősítő kapcsolások
- • Érdekességek
- • Autós erősítős kérdések, problémák
- • Padlófűtés vezérlés
- • Li-Ion saját akkucsomag készítése
- • Tranzisztor teszter
- • Elektromos kerékpár, robogó házilag
- • TDA7294 végerősítő
- • 3D nyomtatás
» Több friss téma
|
- 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.
Megpróbálom köszönöm. Most felraktam a 3.50 -est de sajna abban sincs. Kár hogy nincs rá lehetőség hogy valahogy beimportálni olyan PIC -eket amik nem szerepelnek alapból az IDE -be.
Sziasztok!
Tudnátok nekem magyar nyelvű cikkeket vagy magyar nyelvű videókat ajánlani ami az egyszerű számítógépek működésével foglalkozik logikaikapuk,regiszterek és gépikód szintjén.
Hogyan olvassa ki a memóriából a bináris adatokat, hogyan dolgozza fel az alu az információt és hasonló...
Sziasztok! Sikerült megoldani amit akartam. Tudom, hogy egy programozónak ez semmi. Nekem nagy örömet okozott a siker, mert nekünk még a csöves technikát tanították.
//PIC12675
//Nyomógombra indúl.
//A GP2-ön 10mp-ig magas szint van.
//A GP4-en is 10mp-ig magas szint van.
//A GP5-ön villog amíg feszt kap.
#define nyg GPIO.GP3
void main()
{
GPIO = 0;
TRISIO = 0b00001000;
ANSEL = 0;
while (1)
{
if(nyg != 1)
{
GPIO = 0b00000100;
Delay_ms (10000);
GPIO = 0b00010000;
Delay_ms (10000);
vilog:
GPIO = 0b00100000;
Delay_ms (500);
GPIO = 0b00000000;
Delay_ms (500);
GPIO = 0b00100000;
Delay_ms (500);
GPIO = 0b00000000;
goto vilog;
}
}
}
Sziasztok!
Furcsa jelenséggel szembesülök. A pic amire a programot írom 16F887. A jelenség a következő:
a főprogram 1-16 csatorna nyitva tartása előre meghatározott ideig, amit az lcd kijelzőn figyelemmel lehet kisérni. Az időket a programból változtatni lehet.
Bizonyos megfontolásból a csatornák bármelyikét figyelmen kívül lehet hagyni, szintén a programból.
És itt van a probléma. Bárhova helyezem el ezt a programrészt, a program be se lép a whie(1) ciklusba.
Ha kiveszem a programrészből az lcd kiírásra vonatkozó utasításokat akkor a program rendesen fut.
while(allapot2.F2) //belépés a locsolásból kivett csatornák
{
if(allapot2.F3)
{
Lcd_Cmd(_LCD_CLEAR); LCD_Cmd(_LCD_UNDERLINE_ON); LCD_Cmd(_LCD_MOVE_CURSOR_LEFT);
//123456789012345678901234
Lcd_Out(1,2,"Kihagyott csatornak");
Lcd_Out(2,2,"Csatorna-> " );
csat_ki1=csat; csat=1;
allapot2.F3=0;allapot.F1=1;
}
while(allapot.F1) //csatorna léptetés
{
if(csat>16) csat=1;
txt1[0]=csat/10+48;if(txt1[0]==48) txt1[0]=' ';txt1[1]=csat%10+48;
for (i=0; i<2; i++){ Lcd_Chr(2,13+i,txt1[i]); LCD_Cmd(_LCD_MOVE_CURSOR_LEFT); } //
delay_ms(500);
if(!leptet && !a)
{
a=1;
csat++;
}
a=0;
if(!nysel && !a) allapot.F2=1; //csatorna kiválasztás
a=0;
if(EEPROM_Read(csat+48))allapot.F4=1; else allapot.F4=0;
while(allapot.F2) //a cstorna ki be kapcsolása
{
if(allapot.F4) Lcd_Out(2,26,"be");
//else Lcd_Out(2,26,"ki");
if(!leptet && !a)
{
a=1; allapot.F4=~allapot.F4;
}
a=0;
if(!nysel && !a)
{
a=1;
EEPROM_Write(csat+48,allapot.F4);
csat++; allapot.F2=0;
}
a=0; /* */
} //eddig tart a csatorna ki be kapcsolása
if(allapot.F6) //start gomb megnyomva
{
csat_ki=0;allapot.F1=0;allapot2.F1=1;allapot.F2=0;allapot2.F2=0;allapot.F6=0;
}
} //eddig tart a csatorna léptetés
} //eddig tart a locsolásból kivett csatornák
Vagyis ha kimarad az 5. sortól a 21. sorig és az 59. sortól a 61. sorig a program rész, akkor a program fut, ha ezek bent vannak akkor a while(1) ciklusba be se lép. A hozzászólás módosítva: Dec 5, 2020
Sziasztok!
Szeretnék kérni egy kis segítséget, ez az első PICes projektem.
Megépítettem az ebben a cikkben található áramkör. Bővebben: Link
Annyi a változtatás, hogy a nyákot újraterveztem. Szeretném felprogramozni a picet, de egyenlőre azt sem tudom hogy álljak neki. Pickitem nincs, ezért megépítettem a cikkben található programozót is. Milyen úton-módon tudom a programot beleégetni a PICbe?
Előre is köszönöm!
Szia!
Amit építettél, az egy JDM programozó?
Ha igen, keress egy jó régi számítógépet, amiben még bővítőkártyán van a soros port és ki tudja adni a 9V környéki feszültséget a modem vezérlő vonalaira. Töltsd le a PICprgm programot, telepítsd. Hasonlítsd össze a Hardware oldalon szereplő kapcsolásokat a megépítettel. Ennek megfelelően konfiguráld a programot. Töltsd be vele a .hex állományt, csatlakoztasd a PIC -et, programozd fel.
Sajnos ez a programozó már jó régi, a siker nem garantált. A hozzászólás módosítva: Dec 7, 2020
Ez lett megépítve. Akkor USB-Soros konverterrel neki se álljak?
Ez még jó is lehet, mert külső 12V -os tápot használ.
Megpróbáltam. A programozó szerint feltötltötte a programot. A programozón a led nem csinált semmit. Nem tudom, hogy igényel-e valamilyen beállítást a programozó. Kipróbálni egyenlőre nem tudom hogy tudnám, mivel a "kijelzőjét" még nem raktam össze. Bővebben: Link
Mivel nem volt hibaüzenet, a programozás szerintem sikeres. A programozás oda-vissza kommunikációt igényel.
Köszönöm a segítségeteket! A napokban elkészítem a kijelző részét és jövök a fejleményekkel!
Sziasztok!
A 18F27K40 adatlapján nem találom sehol hogy mekkora kondikat kell rakni a kristályhoz. Lehet akkorát mint más PIC -ekhez? PL. 4MHz - 27pF vagy 8MHz 22pF?
Előre is köszi a segítéget!
Megoszlanak a vélemények, én a melléklet táblázat szerint szoktam a kondenzátorokat pakolgatni.
Értem, köszi, mentettem.
Még egy gyors kérdés. A MCLR felett mit jelent a vonal?
_____
MCLR
Azt, hogy negált a bemenet (azaz az alacsony logikai szint az aktív, ekkor történik a reset)
Még egy kérdés.
A nem használt lábakat kimenetként vagy bemenetként érdemes / kell beállítani, és mi legyen a jelszintjük?
Nekem logikusnak tűnne kimenetnek és alacsony szintnek, de nem biztos hogy jól gondolom.
Jól gondolod, kimenetként és alacsony szinten.
Sziasztok!
Nekem ezzel a megszakításokkal sok bajom van. Sehogy se azt csinálja amit én szeretnék. Szóval ha egy gombot megnyomok akkor egy megszakításnak kéne történnie, aminek az eredményét, majd feldolgozza a program. A regiszterek beállítása ez:
allapot2=0;
allapot =0;
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
InitTimer0();
//megszakítások
szamlal=0; figyel=0;
TRISA=0b00111110;
TRISB=1;
TRISC=0b00001100; //kimenetek
TRISD=0b00000000;
// TRISE=0;
TRISE.RE2=0;
PORTE.RE2=0;
//////////////////////
INTCON.GIE = 1;
INTCON.PEIE=1;
INTCON.INTE=1;
INTCON.INTF=0;
INTCON.RBIE=1;
INTCON.RBIF=0;
IOCB=0b01110011;
a megszakítások pedig ez
void Interrupt()
{
if (TMR0IF_bit)
{
TMR0IF_bit = 0;
TMR0 = 6;
szamlal++; figyel++;
if (szamlal==500) //0,5 sekundum
{
szamlal=0;
PORTA.RA0=~PORTA.RA0;
}
if(figyel==200)
{
figyel=0;
if (PORTA.RA1==1 && PORTA.RA2==1) PORTD.RD0=0;
if (PORTA.RA1==0 && PORTA.RA2==0) PORTD.RD0=1;
}
}
if(INTCON.RBIE) //megszakítás a b porton
{
if(!PORTB.RB0) allapot.F0=0; //stop ; PORTE.F2=1
if(!PORTB.RB1) allapot.F6=1; //start PORTE.F2=0;
if (!PORTB.RB4) allapot2.F0=1; //ha 0 akkor a locsoló motor indul
if(!PORTB.RB5) allapot2.F0=0; //ha 0 akkor a locsoló motor leáll
if(!PORTB.RB6)
{
allapot2.F2=1; //locsolásból kivett csatornák
allapot2.F3=1;
}
INTCON.RBIF=0;
} /* */
}
A while cilusban
while(1)
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(2,1,"itt vagyok");
delay_ms(1000);
if(!allapot.F0 )
{
Lcd_Cmd(_LCD_CLEAR);
LCD_Out(1,2,"Menu Csatornaszam");
// 12345678901234567890
LCD_Out(2,2,"Locsolasi ido:0.00 perc");
delay_ms(1000);allapot.F0=1;
}
if(allapot.F6 )
{
Lcd_Cmd(_LCD_CLEAR);
// 123456789012345678901234
Lcd_Out(1,2,"Csatorna-> s");
Lcd_Out(2,2,"Locsolasi ido: . perc");
delay_ms(1000);allapot.F6=0;
}
if(allapot2.F2)
{
Lcd_Cmd(_LCD_CLEAR);
//123456789012345678901234
Lcd_Out(1,2,"Kihagyott csatornak");
Lcd_Out(2,2,"Csatorna-> " );
delay_ms(1000);allapot2.F2=0;
}
}
Az eredmény: "itt vagyok" felirat marad állandóan
a gombok megnyomása semmin nem változtat
Az GIE legyen a legutolsó lépés a megszakítás kezelés beállításakor.
Az PORTB megszakítás kezelésekor a PORTB értékét csak egyszer olvasd be, tedd segédváltozóba, annak teszteld a bitjeit.
Ha mikoC -ben programozol, a programod elindítható nyomkövetéssel is. Ekkor lehetőséged van töréspontot elhelyezni pl. a megszakítási rutin belépési pontjára. Ha a program egy törésponhoz ér, megáll, vizsgálható a regiszterek értéke, a memória tartalma. Tovább indítható akár lépésenként is. Sajnos ebben az esetben a PORTB megszakítás nem működik. Ezen úgy szoktam segíteni, hogy a PORTB regisztert nem másolom át a segédváltozójába, hanem abban kézzel állítom be az értéket. Az INTCON regiszter bitjei átírhatók a nyomkövetés során.
Szia!
Köszönöm! Így fogok tenni.
Nem tudom jól értettem e? De ezt csináltam:
void main()
{
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
InitTimer0();
//megszakítások
szamlal=0; figyel=0;
TRISA=0b00111110;
TRISB=1;
TRISC=0b00001100; //kimenetek
TRISD=0b00000000;
// TRISE=0;
TRISE.RE2=0;
PORTE.RE2=0;
//////////////////////
INTCON.PEIE=1;
INTCON.INTE=1;
INTCON.INTF=0;
INTCON.RBIE=1;
INTCON.RBIF=0;
IOCB=0b01110011;
INTCON.GIE = 1;
// PORTD=0;
// PORTB=0;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
allapot=1;
kimenetek=0;
b=0;
csat = 1;
INH1 = 1;
INH2 = 1;
void Interrupt()
{
if (TMR0IF_bit)
{
TMR0IF_bit = 0;
TMR0 = 6;
szamlal++; figyel++;
if (szamlal==500) //0,5 sekundum
{
szamlal=0;
PORTA.RA0=~PORTA.RA0;
}
if(figyel==200)
{
figyel=0;
if (PORTA.RA1==1 && PORTA.RA2==1) PORTD.RD0=0;
if (PORTA.RA1==0 && PORTA.RA2==0) PORTD.RD0=1;
}
}
if(INTCON.RBIE) //megszakítás a b porton
{
figyelb=PORTB;
allapot=figyelb;
figyelb=1;
/* if(!PORTB.RB0) allapot.F0=0; //stop PORTE.F2=1; ;
if(!PORTB.RB1) allapot.F6=1; //start PORTE.F2=0;
if (!PORTB.RB4) allapot2.F0=1; //ha 0 akkor a locsoló motor indul
if(!PORTB.RB5) allapot2.F0=0; //ha 0 akkor a locsoló motor leáll
if(!PORTB.RB6)
{
allapot2.F2=1; //locsolásból kivett csatornák
allapot2.F3=1;
} */
INTCON.RBIF=0;
}
Továbbra se működik.
Most működik! Bár lassú!
Annyi változott, hogy az INTCON regiszter beállításánál csak az RBIE az RBIF és a GIE bitek lettek beállítva valamint az IOCB regiszter.
A lassúság azt jelenti, hogy nem elég csak megnyomni valamelyik RB gombot, hanem lenyomva kell tartani, mindaddig amíg a while ciklusban az if() szerkezet megvizsgálja az allapot bitjeit.
Elkészült a kijelző! Viszont sajnos a programozás nem sikerült. Próbáltam több szoftverrel is, de semmi... Rendeltem közben egy PICkit 3 at kínából, csak kérdés, hogy mikor ér ide.
Lehet esélyem felprogramozni ezzel az usb-soros átalakítóval?
Van valami ötletetek?
Sziasztok!
Ha van valakinek kedve átnézné a kódomat? Mert egyszerűen nem értem miért nem okoz a TMR2 megszakítást.
Már mindenfélét kipróbáltam, meg be van állítva minden ami kell és egyszerűen abszolút nem működik.
A megszakításhoz tartozó isr() függvény egyáltalán le sem fut, pedig minden engedélyezve van.
Előre is köszi a segítséget!!!
#include <xc.h>
#include <pic18f27k40.h>
#include "config_bits.h"
/****** Függvény deklarációk ******/
void init(void);
void init_tmr2(void);
void init_interrupt(void);
void __interrupt(high_priority) isr(void);
/****** Globális változók ******/
unsigned char cnt_1 = 0;
volatile char tmr2_flag = 0;
void main(void) {
init();
init_tmr2();
init_interrupt();
LATCbits.LATC3 = 1;
while(1){
if(tmr2_flag){ // eltelt 20ms
tmr2_flag = 0; // Megszakítást jelző változó törlése
PIR4bits.TMR2IF = 0; // Megszakítást jelző bit törlése
cnt_1++; // Megszakítás számláló léptetése
if(cnt_1 == 50){ // eltelt 1 sec
LATCbits.LATC3 = ~PORTCbits.RC3;
cnt_1 = 0;
}
}
}
return;
}
/****************** Alapbeállítások ****************/
void init(void){
// Az összes port összes lába digitálisra állítva. Analóg funkció letiltva.
ANSELA = 0b00000000;
ANSELB = 0b00000000;
ANSELC = 0b00000000;
// Minden lábat kimenetnek állítok be. A nem használt lábak jó ha így maradnak.
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00000000;
// Beállítom az összes láb jelszintjét. A nem használt lábak jó ha így maradnak.
LATA = 0b00000000;
LATB = 0b00000000;
LATC = 0b00000000;
}
/******************* Timer 2 *****************/
void init_tmr2(void){
// 20ms -onként fog a túlcsordulás bit bebillenni. Ez a PIR4 regiszter TMR2IF bitje!
T2CON = 0b10111001; // előosztó 1:8 utoósztó 1:10
T2PR = 250;
PIE4bits.TMR2IE = 1; // Timer 2 megszakítás engedélyezve
}
/***************** Interrupt ****************/
void init_interrupt(void){
INTCONbits.GIE_GIEH = 1; // Globális megszakítás engedélyezve
INTCONbits.PEIE_GIEL = 1; // Perifériás megszakítás engedélyezve
INTCONbits.IPEN = 1; // Megszakítás prioritás engedélyezve
}
/************* Megszakításkor lefutó függvény **************/
void isr(void){
// Ha Timer2 megszakítás érkezett
if(PIR4bits.TMR2IF){
tmr2_flag = 1; // eltelt 20ms
}
}
Szia!
Ez talán segít ....Bár nem toltam még 8 biteseket,csak 16-osokat.
A szimulátorom szerint így már megy a Timer2.
void init_tmr2(void){
// 20ms -onként fog a túlcsordulás bit bebillenni. Ez a PIR4 regiszter TMR2IF bitje!
T2CONbits.ON = 0;
T2CON = 0b10111001; // előosztó 1:8 utoósztó 1:10
T2CLKCONbits.T2CS = 2; // 2 = Fosc
// 6 = Sosc
// 1 = Fosc/4
T2PR = 250;
PIR4bits.TMR2IF = 0;
PIE4bits.TMR2IE = 1; // Timer 2 megszakítás engedélyezve
T2CONbits.ON = 1;
}
void isr(void){
// Ha Timer2 megszakítás érkezett
if(PIR4bits.TMR2IF){
tmr2_flag = 1; // eltelt 20ms
PIR4bits.TMR2IF = 0;
}
}
A hozzászólás módosítva: Dec 10, 2020
Működik, köszi csak nem értem miért.
A 3. sorban kikapcsolod a Timer2 -t, de a 4. sorba visszakapcsolja a bináris beállítás 0b1....
A T2CLKON regiszterrel még nem találkoztam, de szerintem itt lesz a bibi. Utána olvasgatok.
Itt a 2 gondolom decimálisan értendő, vagyis akkor 0010 a valós érték? Ha igen akkor nekem itt a táblázat szerint fosc -van. Vagyis nem értem amiket kommentben oda írtál mellé. Írsz erről egy pár mondatot?
Köszi mégegyszer. A hozzászólás módosítva: Dec 10, 2020
Elvileg szabály,hogy ha valamit configolsz,akkor előbb kikapcsolod,utána configolod,majd indíthatod.Volt olyan PIC aminél ment az állítgatás menet közben is,valamelyiknél nem,de fő a biztonság
a T2CON-t nem is néztem,ment anélkül is.
Amiket odaírtam az a datában van leírva,hogy honnan menjen a timer clock-ja,van még ott 4-5 dolog is amiről mehet,de csak azokat írtam be,amik az alapok.
Igen decimálisat írtam,bár az adatlapon bin van,csak ritkán használok bint,jobb a dec,hex,nem kell annyit gépelni .
|
|