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   876 / 1210
(#) don_peter válasza n_yálastrubadúr hozzászólására (») Nov 19, 2016 /
 
Meg kell nézni amit írtam, hogy mit is csinál ez a függvény: i2c_lcd_write();
Nem is fordul neked le, ezért nem megy
Egyébként írja is a fordító, hogy típusokkal is van gondod.
A hozzászólás módosítva: Nov 19, 2016
(#) n_yálastrubadúr válasza don_peter hozzászólására (») Nov 19, 2016 /
 
Ez megy:
  1. while (1)
  2.     {  
  3.    i2c_lcd_goto(0x00);    
  4.    
  5.    i2c_lcd_write(' ');
  6.    i2c_lcd_write('e');
  7.    i2c_lcd_write('z');
  8.    i2c_lcd_write(' ');
  9.    i2c_lcd_write('m');
  10.    i2c_lcd_write('e');
  11.    i2c_lcd_write('g');
  12.    i2c_lcd_write('y');
  13.    i2c_lcd_write(' ');


  1. void i2c_lcd_write(unsigned char _data){
  2.    i2c_lcd_4bit_strobe_write((_data >> 4), 1, 0, i2c_lcd_bl);
  3.    i2c_lcd_4bit_strobe_write((_data & 0x0f), 1, 0, i2c_lcd_bl);
  4. }
(#) don_peter válasza n_yálastrubadúr hozzászólására (») Nov 19, 2016 /
 
Akkor próbáld így:

  1. void i2c_lcd_puts(char *s) {
  2.         while(*s){
  3.             i2c_lcd_write(*s++);
  4.         }
  5.     }
  6. s[] = "valami";
  7. i2c_lcd_goto(0x00);
  8. i2c_lcd_puts(s);


Azt látom, hogy nem fordul le a cucc, nem hiányzik valami?
A hozzászólás módosítva: Nov 19, 2016
(#) n_yálastrubadúr válasza don_peter hozzászólására (») Nov 19, 2016 /
 
Ez megy egy ideje.De semmi
(#) patrik81 hozzászólása Nov 19, 2016 /
 
Volna egy kérdésem.
A Jelenlet függvénnyel akarom feltölteni a jelen nevű változót,és a KiirJ függvénnyel szeretném kiíratni,de nem ismeri fel a változót.Ez miért van?
Idézet:
„void KiirJ(char x);
void Jelenlet();

void main()
{
TRISB=0;
TRISC=0;

Jelenlet();
KiirJ(jelen);
}
void KiirJ(char x)
{
PORTB=0x20;
PORTC=szamok[x];
Delay(ido);
}
void Jelenlet()
{
char jelen;
TRISA0 = 0;
RA0 = 1;
RA0 = 0;
Delay(47);//proteus szerint min 537us
TRISA0 = 1;
Delay(2);//23us,ezutan johet a mintavetel
if (RA0)//a proteus szerint max 150us-ra huzza le a ds18b20 a vonalat
jelen = 6;//a delay 2-tol 13-ig jo,az idoben 23-150us
else
jelen = 1;
Delay(14);//varunk,hogy a vegere erjunk a jelenletnek
}”
(#) don_peter válasza patrik81 hozzászólására (») Nov 19, 2016 /
 
Tedd globálisba a jelen változót.
pl:
  1. volatile char jelen;
(#) patrik81 válasza don_peter hozzászólására (») Nov 19, 2016 /
 
Nagyon köszönöm,így már működik
(#) n_yálastrubadúr hozzászólása Nov 19, 2016 /
 
Azóta is próbálgatom. Valaki tudja, ha van akkor mi a különbség a 16F és a 18F es kontrollerek között. Így pointer szinten? Mert visszatettem a 16f18323 kontrollerre a kijelzőt és azon teljesen jól megy. Ugyanúgy az Mplab code configuratorral be vannak állítva a dolgok. De nem hiszem hogy ott lenne a baj, mert gondolom akkor semennyire nem menne az egész...
(#) don_peter válasza n_yálastrubadúr hozzászólására (») Nov 19, 2016 /
 
De neked, le sem fordul a kód nem?
Legalább is a fentebb képen az látszik, hogy nem fordul le.
Ott valami szerintem hiányzik..

Mutasd a main.c fájlodat..
(#) n_yálastrubadúr válasza don_peter hozzászólására (») Nov 19, 2016 /
 
  1. #include "mcc_generated_files/mcc.h"
  2. #include <xc.h>
  3. #include "i2c.h"
  4. #include "i2c_lcd_PCF8574.h"
  5. #include <string.h>
  6.  
  7. unsigned char x;
  8.  
  9. void main(void)
  10. {
  11.     // Initialize the device
  12.     SYSTEM_Initialize();
  13.     i2c_init();
  14.     i2c_lcd_init();
  15.    
  16.     TRISD = 0;
  17.  
  18.  
  19.  
  20.    
  21.     while (1)
  22.     {  
  23.    i2c_lcd_goto(0x00);    
  24.    
  25.    i2c_lcd_write(' ');
  26.    i2c_lcd_write('e');
  27.    i2c_lcd_write('z');
  28.    i2c_lcd_write(' ');
  29.    i2c_lcd_write('m');
  30.    i2c_lcd_write('e');
  31.    i2c_lcd_write('g');
  32.    i2c_lcd_write('y');
  33.    i2c_lcd_write(' ');          
  34.    
  35.    
  36.    
  37.    i2c_lcd_write(x);  
  38.    x++;
  39.    __delay_ms(50);
  40.    __delay_ms(50);
  41.  
  42.    
  43.    LATD ^= 0xff;
  44.  
  45.    char s[] = "Valami";
  46.    i2c_lcd_goto(0x40);  // 2. sor
  47.    i2c_lcd_puts(s);  
  48.  
  49.    
  50.  
  51.  
  52.    }        // end of "while 1"


De lefordul.. Csak amit írtál azzal nem.
A hozzászólás módosítva: Nov 19, 2016
(#) don_peter válasza n_yálastrubadúr hozzászólására (») Nov 19, 2016 /
 
Ja értem..
Próbálj már ki egy ilyet:
  1. unsigned char array[6] = {'a','b','c','d','e'};
  2. i2c_lcd_goto(0x00);  
  3. for(i=0; i<6; i++){
  4. i2c_lcd_write(array[i]);
  5. }

Ennek le kéne fordulnia.

illetve arra figyelj, hogy nem mindegy hol deklarálód a változókat.
  1. void main(void){
  2.     //ide jönnek elsőnek a változók
  3.     unsigned char array[6] = {'a','b','c','d','e'};
  4.     // aztán az összes többi
  5. }
A hozzászólás módosítva: Nov 19, 2016
(#) n_yálastrubadúr válasza don_peter hozzászólására (») Nov 19, 2016 /
 
Ez esetben vannak karakterek, 1 el több mint ami a tömbben van. De teljesen értelmetlenek és mind ugyanolyan.
(#) n_yálastrubadúr válasza n_yálastrubadúr hozzászólására (») Nov 19, 2016 /
 
Tehát semmit nem tud eltárolni a kontroller. Nemértem. Rossz lenne maga a pic, úgyértem konstrukció hibás?
(#) don_peter válasza n_yálastrubadúr hozzászólására (») Nov 19, 2016 /
 
Az a baj nem kimondottan vagyok XC-s, de szerintem nem a PIC.el van gond.
Típusokkal kellene variálnod, szerintem ilyesmi hiba van.
(#) patrik81 hozzászólása Nov 19, 2016 /
 
A következő hibába estem,ha nulla RA0,ha egyes,akkor is 7-et vesz fel a jelen.Legalább is hetest ír ki.Ha meg kitörlöm az else jelen = 7; részt,akkor meg nullát ír ki,a hatost sehogysem.
  1. void Jelenlet();
  2. void KiirJ(char x);
  3.  
  4. volatile char jelen;
  5.    
  6. void main()
  7. {
  8.     TRISB=0;
  9.     TRISC=0;
  10.    
  11.     Jelenlet();
  12.     KiirJ(jelen);
  13.     while(1);
  14. }
  15. void Jelenlet()
  16. {
  17.     TRISA0 = 0;
  18.     RA0 = 0;
  19.     if (RA0)
  20.         jelen = 6;
  21.     else
  22.         jelen = 7;
  23.     Delay(14);
  24. }  
  25. void KiirJ(char x)
  26. {
  27.     PORTB=0x20;
  28.     PORTC=szamok[x];
  29. }
A hozzászólás módosítva: Nov 20, 2016
(#) gyoran válasza don_peter hozzászólására (») Nov 19, 2016 /
 
Szia

akkor megállt a tudományom. Ennek működnie kell(ene)
Az áramkorlátozás csak annyiban segít, ha valahonnan mégis kapna valami durva +3 Voltot vagy GND-t akkor 1: védi az IC-t 2: műszerrel, szkóppal rá tudsz mérni, látod esetleg mi a helyzet.
De ugye ehhez tudnod kell, hogy mikor van az a speciális szituáció. Az ellenállás meg a parazita kapacitások miatt viszont ez a vonal nem lesz olyan gyors, lehet, hogy a 68k-buszvezérléséhez már túl lassú is. Mindenesetre egy próbát megér.
Van valami tapasztalat, hogy mikor hal le? És mindig ugyanaz a kimenet?
A hozzászólás módosítva: Nov 19, 2016
(#) Tasznka válasza n_yálastrubadúr hozzászólására (») Nov 19, 2016 /
 
Az itteni képek alapján valamit szerintemtem elnéztél. Karaktert vár a függvényed,és a karakteren szeretnél tömbként lépkedni? ,Vagy csak nekem furi?
Don_peter itt az elsőbe amit beírt,annak mennie kellene,mert ott pointert vár,és azt lépteti.Bocsika ,ha valami elkerülte a figyelmemet,csak már kezdek fárdni,de nagyon
(#) don_peter válasza gyoran hozzászólására (») Nov 19, 2016 /
 
Most sokkal hamarább pukkant el.
Nem tudom mitől szál, el, de most a 4csatornából 3 szált el.
1 nem ad a kimeneten semmit, 2 csatorna csak 1.5v-ot ad ki, és 1 csatorna működik.
Érdekesség még az, hogy az a csatorna ami nincs is bekötve az nem ad ki semmit a kimenetén.
(#) Tasznka válasza don_peter hozzászólására (») Nov 19, 2016 /
 
Tegyél be minden kimenetre 2k-10k ellenállást korlátozásnak,mert szerintem a pic lehúzza testre,amikor ott kijön a 3V.Azt még a pic elviseli .Ilyen közösítésekkor mindig tegyél be korlátozást,mert bár tény,hogy a mem. csak bemenet,de a picbe te írod a progit,és néha nem jó valami.
Az hogy egyszer csak az egyik,máskor több kimenet is elszáll,az random. Egy kimenet meghal,és néha viszi magával a többit.
(#) gyoran válasza don_peter hozzászólására (») Nov 19, 2016 /
 
Húha, ez meredek.
Szerintem kezdjük az alapról.
1) Biztos rossz az IC? Kivéve, lemodellezve a bemeneti állapotokat is rossz a kimenete?
2) az 1,5 volt az DC vagy 50% négyszög (vagy hasonló)
3) A semmi az nagyimpedancia vagy 0V
4) mivel mérsz? Ehhez szkóp jó lenne.
5) ami "nincs bekötve" annak melyik lába (be vagy kimenet) nincs bekötve? Egy CMOS bemenet annyira nagy ellenállású, hogy bármilyen állapotot felvehet. Ha mondjuk mindkettő éppen 0-n van akkor a kimeneten 0 (értsd semmi?) van.
És elnézést, ha olyanokat kérdezek, amin túl vagy, nem ismerem a tudásodat, nem akarlak lebecsülni.
(#) Zsora válasza don_peter hozzászólására (») Nov 19, 2016 /
 
Idézet:
„adott egy 74LVC86-os OR GATE IC”
Ez nem OR kapu (megengedő vagy), hanem XOR kapu (kizáró vagy), úgyhogy ennek fényében vizsgáld a működését!
(A 74LVC32 az OR kapu.)
(#) don_peter válasza Tasznka hozzászólására (») Nov 20, 2016 /
 
Tasznka: Ezt a korlátozó ellenállást kipróbálom holnap, vagy is ma

gyoran: Igen rossz, most külön teszteltem ki és bemeneteit.
Cseréltem, megint tönkre ment egy, most tettem fel egy újat és nem kötöttem be a címbiteket, így tesztelem és működik rendesen.
Ha jó akkor meg van a 3v minden kimeneten, ha megdöglik, akkor 1.5v vagy 0v vagy még egyszer mértem 0.6v-ot is.
Nincs szkóp-om sajna, sima műszerrel mérek.
Idézet:
„ami "nincs bekötve" annak melyik lába (be vagy kimenet) nincs bekötve? Egy CMOS bemenet annyira nagy ellenállású, hogy bármilyen állapotot felvehet. Ha mondjuk mindkettő éppen 0-n van akkor a kimeneten 0 (értsd semmi?) van”

Igen ez így vagy is jól működik.
Tesztelgetem amit lehet, hogy kizárjam a hibát, de egyelőre nincs meg.

Zsora: Igen tudom. Nekem pont ez a logika kell.
Bemenet1 - Bemenet2 = kimenet
INPUTS OUTPUTS
nA nB nY
L L L
L H H
H L H
H H L
Egyébként olyan eset nem fordulhat elő, hogy mind kettő magas.
(#) n_yálastrubadúr válasza Tasznka hozzászólására (») Nov 20, 2016 /
 
  1. #include "mcc_generated_files/mcc.h"
  2. #include <xc.h>
  3. #include "i2c.h"
  4. #include "i2c_lcd_PCF8574.h"
  5. #include <string.h>
  6. #include <stdbool.h>
  7.  
  8. unsigned char x;
  9.  
  10. void main(void)
  11. {
  12.     // Initialize the device
  13.     SYSTEM_Initialize();
  14.     i2c_init();
  15.     i2c_lcd_init();  
  16.     TRISD = 0;
  17.  
  18. //************************************************************************
  19.    
  20.     while (1)
  21.     {
  22. //*********** Ez megy ........................      
  23.    i2c_lcd_goto(0x00);       // 1. sor LCD
  24.    i2c_lcd_write('O');
  25.    i2c_lcd_write('K');  
  26.    i2c_lcd_write(' ');          
  27.    i2c_lcd_write(x);       // változó befagyott vagy sem
  28.    x++;
  29.    __delay_ms(50);
  30.    __delay_ms(50);
  31.  
  32.   //**********  Ez nem megy !! 5 ugyanolyan értelmetlen karaktert ír *********
  33.     unsigned char array[6] = {'a','b','c','d','e'};
  34.     i2c_lcd_goto(0x54);                                // 4.sor LCD
  35.     for(unsigned char i=0; i!=5; i++){
  36.     i2c_lcd_write(array[i]);
  37.     }
  38.  
  39.    }        // end of "while 1"
  40.  
  41.  }   //end of main
(#) Bakman válasza don_peter hozzászólására (») Nov 20, 2016 /
 
Ugye a nem használt csatorna bemenetei nem lebegnek?
(#) don_peter válasza Bakman hozzászólására (») Nov 20, 2016 /
 
Nem!
Amelyik csatorna nincs használatban az nulla szintet kap.

Tasznka : Be tettem az ellenállásokat, nem változott a helyzet.

Kinyírtam egy újabb IC-t, ezzel már összesen 3mat.
Most már PIC nem csatlakozik közvetlen a 74LVC86-al meghajtott memória címbitekhez.
Elvágtam a vezetékeket, de sajnos a 3. 74LVC86-on ez nem segített.
(#) don_peter hozzászólása Nov 20, 2016 /
 
Pillantyú....
Uraim, teszem azt, ha szint illesztőt magas impedanciába állítóm de a magas impedanciában adhat ki valamennyi feszültséget?
Mert most mérem, a bemenetet és magas impedanciába állítva a szintillesztőt van az egyik nem használt bemeneten 0.06v.
Ez befolyásolhatja 74LVC86 logikáját?
(#) ktamas66 válasza don_peter hozzászólására (») Nov 20, 2016 /
 
Szerintem nem is a 3V-os rendszer felé kellene nézelődni, hanem az 5V-os felől. Nem tudom milyen a szintillesztőd, esetleg a tranzisztor B-C diódáján juthat vissza magasabb feszültség, aminek nincs az árama korlátozva.
(#) pajti2 válasza don_peter hozzászólására (») Nov 20, 2016 /
 
A logika egy olyan kíméletlen dolog, hogy a képletbe ha belevetted mindazt, ami bele tartozik, nem hagy neked más választást, mint megfontolni az összes lehetőséget.

Jelen esetben van egy xor kapud, ami úgy megy tönkre, hogy az elektronikailag kimeneti túlterhelésre utal. Ha jól értettem, az áramkör bemenete elektronikailag olyan környezetben van, ami ott semmi módon nem tud túlfeszültséget kapni. Akkor kizárásos alapon nem ott van a baj. A kimenete olyan ponton van, ahol elektronikailag nem lehetetlen vele szemben ellenmeghajtást létrehozni. Hiszed, vagy sem, a fenti képlet alapján az történik, hogy a pic nem használt bemenetei kimenetre kapcsolnak, és tönkrevágják a kapuidat.

Amit a tapasztalat jelez, hogy amelyik projectről kapcsrajz sem készül előzetesen, ott olyan ad-hoc habitus építi az áramkört, aminek jellemző tulajdonsága utólag megfeledkezni valamiről. Azért is van, hogy én, és itt az összes idősebb / körültekintőbb fórumozó mind leszokott róla, és mindig megcsináljuk a fúj-de-nem-szeretem részét is a fejlesztésnek. Jelenleg reménykedünk benne, hogy amiről áramkörileg azt mondod, hogy úgy van, az csakugyan úgy van, és nincsen a halmaz egészében néhány elfeledett áramköri részlet, amit alapértelmezetten á-az-úgysem-csinál-ott-már-semmit gondolattal kezelsz, és ami jelen esetben beteljesíti a lim-lomok bosszúját. Ha legalább olyasmiről nincsen szó, akkor a hibád biztosan szoftveres oldalon van jelen, egyébként pedig további áramköri tényezők is mind átgondolást igényelnek. Lévén semmi biztosat nem tudunk a projectedről, nem tudjuk megítélni, melyikről lehet szó. Kissé talán aggódunk miatta, hogy lesznek ott még áramköri lim-lomok is. És ezt a hibát mind te követted el azzal, hogy nem csináltad meg a "házi feladatodat".
(#) don_peter válasza ktamas66 hozzászólására (») Nov 20, 2016 /
 
De nem értem milyen 5v-ot nézzek?
5v csak addig van ameddig, bemegy a stábkockába, ott leszűrve már 3v megy tovább.
Nem értem..

pajti2: egyet értek veled, de ezt a projektet már rajz nélkül futtatom ki.
A PIC kimenetre kapcsolásra én is gondoltam már, lehet amikor lapot váltok és kell a PIC akkor történik valami és kimenetre vált egy pillanatra a 74LVC86 bemeneti lábára csatlakozott PIC PIN.
Most elvágtam ezeket a lábakat, tehát nem lehetne ilyen hiba sem.
A hozzászólás módosítva: Nov 20, 2016
(#) ktamas66 válasza don_peter hozzászólására (») Nov 20, 2016 /
 
Ez nem a 68k-PIC-memória illesztés? Habár ott szintillesztő IC-ket használtál, ugye. A nagy impedanciás kimenet bemenetre kötése bármit eredményezhet, ha stabil bemenetet kell, fel vagy le kell húznod, de szerintem ettől nem lenne szabad tönkremennie.
Következő: »»   876 / 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