Fórum témák
» Több friss téma |
Pic32-nél sem kell törölni az interrupt flag-elet?
Én most törlöm, még nem próbáltam ki mit csinál ha nem.
Sziasztok!
Egy PIC18F87k22-vel dolgozom épp. Az AN5-ös lábon (PORTF.7) feszültséget szeretnék mérni belső ADC-vel, viszont állandóan tápfeszt mérek, multiméterrel is látszik, hogy ott az 5V. A többi lábon megfelelően tudok mérni. A PORTF be van állítva analóg bemenetnek. Első tippem az lenne, hogy megsütöttem a PIC-et forrasztáskor, és tönkrement. Valakinek van esetleg ötlete, hogy mi okozhatja ezt?
Zárlat esetleg? Próbáld meg, hogy csak egy olyan programot töltesz bele, amiben kimenet az összes láb és alacsony szinten van. Ha ilyenkor is ott az feszültség akkor vagy tényleg tönkrement vagy zárlat, folyasztószer maradék, forrasztási hiba van a panelon.
Szia!
Reset-eld a PIC-et folyamatosan, így nem fut benne a programod, ha így is ott az 5V, akkor vagy zárlat a NYÁK-on vagy a PIC belsejében!
Pali79 és kissi:
Köszönöm a gyors válaszokat. Testre kötött MCLR esetén is tápfesz van a lábon. Ez esetben -ha jól gondolom- ez a PIC valóban kuka. ![]()
Ellenállással (pl. 330 ohm ) testre kötve nem csökken a feszültség számottevően ( nehogy valami bemenetnek állított láb szintje megtévesszen, mert a RESET-nél ez van !), ugyanazt az értéket méred, mint egyébként ( RESET közben!) ?
Mielőtt kidobod, csak azt az egy lábát emeld fel a panelről és próbáld ki még egyszer. Ha a ládon mincs 5V, akkor a panelen van a hiba...
A PIC cseréje bár eltartott 1 óráig, de megoldott a problémát.
![]() kissi: RESET-kor ugyanazt a feszültséget mértem, mint alap esetben. Egy 4k7-ellenállással a földre volt alapból húzva, ami picit melegedett is. 330ohm-mal már nem próbáltam ki. Hp41C: Ez esetben is ott volt az 5V, így maradt a csere. Köszönöm mindenkinem a segítséget. ![]()
Bocs, hogy csak most tudok írni, de melóztam. Köszönöm a jobbnál jobb ötleteket.
Hp41C: nekem ez így még sok (ennyire nem vágom a PIC lelki világát), de az adatlapja alapján utána olvasok azoknak a biteknek amiről még nem hallottam. Legalább tudom mi az amit tudnom kellene... sonajkniz: sajnos nekem az assembly nyelv nem mond sokat. Lehetséges hogy a byte-onként küldés után kellene egy kis szünet? Mit értesz szinkron jel alatt?
Onnan hogy én azzal is foglalkozok és véletlenül beleolvastam abba amit írtál. De bocsánat hogy meg mertem kérdezni...
Szia!
A beérkező jeleket egy timer megszakításai olvassák be. Ezt a timert szinkronizálom egy kilencedik bittel minden 8 beérkezett bit után.
Szia! Bocs, ha hülyének tűnök, de csak a pontosság kedvért. A vevő oldalon nem használod a USART modult, hanem létrehozol egy timert, amely megszakítási ideje az átviteli sebességből számolt egy bit átvételére szükséges idő. Ezen idő letelte után folyamatosan megszakítást generál, ami leolvassa a bemeneti jelszintet, melyet egy változóba (bufferbe) ment, majd ha kész a bájt, menti, vagy eldobja... Eddig azt hiszem talán értem is, de a szinkron jel kicsit nem világos. Értem, hogy a 9 bit a szinkronjel, de hogyan működik ez valójában? Tételezzük fel, hogy 9. bit értéke 0. A nyolc bit beolvasása után a bemenet 1-re megy (a szabványos RS232 kommunikáció miatt), majd ezt "huzza le" 0-ra a 9 bit, és mikor ez ismét 1 lesz, nullázza a timert (ezzel szinkronizálja az időt) . Így gondoltad? Ha nem kérlek írd meg pontosan, te hogyan oldottad meg.
Kinyomtattam a hozzászólásod, hogy az PIC leírásának olvasgatása közben jobban átlássam, mit is keresek (regiszterek bitjeinek nevei). Nos amit észrevettem: Nekem, nem csak a vételi hibák ellenőrzései maradtak ki, hanem maga a soros port bekapcsolása, amit RCSTA regiszter SPEN bit 1-re állítása kellene, hogy bekapcsoljon. Szerintem ez is kellene. Viszont azt meg tudnád mondani, hogy a fenti error bitek mikor lesznek 1 állapotba. FERR és OERR . Látom a leírását, de nem értem. Köszi a helpet. Bocsi a dupla bejegyzésért, de az előzőt nem engedte szerkeszteni.
A hozzászólás módosítva: Okt 30, 2015
Az SPEN jól gondolod, hogy be kell kapcsolni.
Az OERR akkor áll 1-be ha az UART belső FIFO regisztere megtelt, több adat érkezett mint ami ki lett olvasva. A FERR bit meg a framing error, ezt pontosan nem tudom, de ha jól értelmezem akkor áll 1-be ha nem érkezett stop bit a várható időben.
FERR - Framing error - Keretezési hiba. A start bit túl rövid, vagy a startbit és a 8 (ill. 9) adat bit vétele után a vonal nem megy magas szintre a stop bit idejére.
OERR - Overrun error - Ráfutás hiba. A vevő átmeneti tárolójából az előző adat (RCREG) az előző adatot nem olvastuk ki, amikor a következő vétele befejeződik. A hozzászólás módosítva: Okt 30, 2015
Bufferrel rendelkező típusoknál:
OERR - Nincs már üres hely a bufferben a vett adatnak. A vételi státusz regiszter ezeknél a típusoknál egy buffer, az adatregiszter (RCREG) kiolvasása lépteti a státusz bufferét is. Figyelni kell arra, hogy az RCSTA regiszterben található biteket (pl. a 9. adatbitet) előbb olvassuk ki, mint a RCREG regisztert.
Szia!
Gyanítom, hogy kissé egyedi a megoldásom, de működik. Az adó először kiküld 5 rövid jelet. Gyakorlatilag 5 1-es bitet. Majd 3x kiküldi a szinkronjelet, ami 400usec magas és 300usec szünetből áll. Ezután jön a 8 bit, maj 1 szinkron. Ez 32x. Az adást csak egyszer küldöm ki. Ez egy szövegkűldés 2x16-os LCD-nek. A vevő a 400usec hosszú magas jelre vár. Hármat kell kapjon egymás után. Ellenkező esetben nem lép adatfogadásra. Be sem kapcsolja a timert. Ha már veszi az adatokat, a 8. után eltárolja az érkezett byteot, majd vár a szinkronjelre. A közben beérkező újabb megszakítást nem veszi figyelembe. Valamit számolja a beérkezett byteokat, és ha megvan a 32, kikapcsolja a timert és kiírja a kéjelzőre az üzenetet. Majd kezdi előről.
Mindenkinek köszönöm a sok-sok infót, emésztem egy kicsit, remélem ez már megoldja a problémám. Sokkal jobban átlátom a regiszterek funkcióit,működéseit. Így könnyebb megérteni sok mindent.
sonajkniz: Hu, nem egyszerű (nekem), a te ötleted. Még nem csináltam hasonlót, de hiszem, hogy sikerülhet megvalósítani a te ötleted is a saját nyelvemen(mikroC), csak tanulni kell, próbálkozni kell. Köszi mégegyszer.
Sziasztok!
Akadt egy kis gondom a hardveres osztással. PIC24-es pic-et használok, assmeblyben szeretnék osztani a következőképpen:
Itt a W4 az osztandó, a W2 az osztó és ha jól olvastam akkor a hányados a W0 lesz és a maradék a W1-be kéne hogy kerüljön. De valamiért az osztás után a W0 értéke 1 lesz a maradéké pedig nem változik. A másik gondom a W7-el van mégpedig az, hogy mozgatnék bele egy 8 bites adatot, de egy teljesen másik értéket másol a program a W7-be. Mind a két problémát csak a szimulátorban néztem meg egyenlőre. Ha valaki tudna segíteni azt nagyon megköszönném!
Közben kicsit utánajártam a reference manualban és az osztásnál kell használni a repeat parancsot. Így az osztás már működik. Viszont a másik probléma még mindig megvan. Kipróbáltam már munkaregiszterrel is de mindegyikkel ugyan azt csinálja.
Lényeg hogy van egy 16 bites változóm amiben az alsó 8 bitet használom. És ezt az alsó nyolc bitet kéne áthelyeznem egy munkaregiszterbe ami nagyon nem akar sikerülni. De az érdekes, hogy az össze többi helyen tökéletesen működik az áthelyezés. Nem találkoztam még hasonlóval.
"A másik gondom a W7-el van mégpedig az, hogy mozgatnék bele egy 8 bites adatot..."
Milyen utasítással próbálkoztál? MOV f, Wnd (Opcode: 1000 0fff ffff ffff ffff dddd) Ez csak 16 bites adatot mozgat. MOV f, {WREG} (Opcode: 1011 1111 1BDf ffff ffff ffff) Ez csak WREG-be másol (vagy f-ben hagy)
A következőt használom:
Sziasztok!
A 16f628 -as PIC melyik lábán tudom fogadni a DS18** hőmérő-szenzor adatait. A PORTA-0 lábon tökéletesen működik, de más lábakra is rá tudom kötni?, mert példaprogramokban csak ezen a lábon látom és nem próbáltam még egyéb bemenetre rákötni! Üdv.
A 4-es lábon biztosan nem működik, a többin igen.
Bármelyik lábbal működik amit be lehet állítani ki és bemenetnek is.
MOV.B #lit8, Wnd (Opcode: 1011 0011 1100 kkkk kkkk dddd)
Ennek működnie kell. Ugye, odaírtad a "#" jelet is? Például:
Megvan mi volt a hiba. Az hogy én a változót számként akartam használni pedig regiszterként kell. A kereszt nélkül tökéletesen működik a dolog. Nem tudom hogy siklottam el efelett.
![]()
Sziasztok!
Meg tudnátok mondani, hogy egy 24-es sorozatú PIC bármelyik PGED és PGEC lábain programozható, ha három is van ezekből? Csak simán rá kell az egyikekre tenni a programozót? Valamint mekkora különbség van a programozás nehézségében a 18-as szériához képest? Például 10-szer több regiszter kell konfigurálni indításkor, vagy az SPI-t sokkal nehezebb megoldani C-ben, több buktató? Köszönöm! |
Bejelentkezés
Hirdetés |