Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   809 / 1320
(#) Hp41C válasza binci hozzászólására (») Szept 30, 2010 /
 
Szia!

Az adó (tx.c) azt csinálja, amit szeretnél. Mindaddig, amig valamelyik gomb le van nyomva, küldi a hozzá tartozó üzenetet (azonos toggle értékkel). Ha felengeded abbahagyja a küldést. Ha újra lenyomod valamelyiket, újrakezdi a küldést negált toggle értékkel.

A vevőben a kiértékelés:
  1. while(get_data(RXREG));
  2.         if (RXREG[2]==(RXREG[0] ^ RXREG[1]))
  3.         {
  4.             if (RXREG[0]==Header)
  5.             {
  6.                 toggle = RXREG[1] & 0x80;
  7.                 if (toggle!=old_toggle)
  8.                 {
  9.                         old_toggle=toggle;
  10.                         RXREG[1]=RXREG[1] & 0x03;
  11.                         if (RXREG[1]==0x01) out1=!out1;
  12.                         if (RXREG[1]==0x02) out2=!out2;
  13.                         if (RXREG[1]==0x03) out3=!out3;
  14.                 }
  15.             }
  16.         }
  17.         //DelayMs(50);
  18.     }


Ezt a részt kellene átalakítani és kiegészíteni egy időtúllépés figyeléssel.
  1. while(get_data(RXREG));
  2.         if (RXREG[2]==(RXREG[0] ^ RXREG[1]))
  3.         {
  4.             if (RXREG[0]==Header)
  5.             {
  6.                 toggle = RXREG[1] & 0x80;
  7.                 if (toggle!=old_toggle)
  8.                 {
  9.                         out1 =0;
  10.                         out2 =0;
  11.                         out3 =0;
  12.                         RXREG[1]=RXREG[1] & 0x03;
  13.                         if (RXREG[1]==0x01) out1=1;
  14.                         if (RXREG[1]==0x02) out2=1;
  15.                         if (RXREG[1]==0x03) out3=1;
  16.                         old_toggle=toggle;
  17.                         offtimer=10;
  18.                 }
  19.                 else
  20.                 {
  21.                         offtimer=10;
  22.                 }
  23.             }
  24.         }
  25.         //DelayMs(50);
  26.         if (offtimer)
  27.         {
  28.           if (--offtimer)
  29.           {
  30.                     out1 =0;
  31.                     out2 =0;
  32.                     out3 =0;
  33.          }
  34.       }
  35.     }

Persze az offtimer változót deklarálni is kell...
(#) Poostmaster hozzászólása Szept 30, 2010 /
 
Sziasztok.
Meg tudná valaki mondani, hogy lehet-e a portokat lábanként programozni? Olyasmire gondolok, hogy pl. a PORTA-ra kötök nyolc ledet, és úgy kapcsolom be őket, hogy valamelyik csak világít, és van amelyik villog. Vagy az egyész portot kell minden villogásnál állítani, hogy a statikusak bitjei maradnak, a villogók pedig változnak?
Pascalban próbálok programozni, de ha asm-ben megoldható, az is jó.
(#) icserny válasza Poostmaster hozzászólására (») Szept 30, 2010 /
 
Ha ragaszkodsz a Pascal-hoz, akkor fel kell lapozni a kézikönyvét. Ilyen példákat látok benne:

  1. Clearbit(portc,2);
  2. Setbit(portc,0);


Természetesen bitenkénti műveletekkel és megfelelően választott maszkokkal bájtszélességű műveletekkel is megoldható a dolog...
(#) Poostmaster válasza icserny hozzászólására (») Szept 30, 2010 /
 
Köszönöm, pont ez volt amit kerestem. Elég vaskos ez a könyv, és ha az ember nem tudja mit keressen, akkor nehéz. Hamarosan átrágom magam az egészen.
(#) binci válasza Hp41C hozzászólására (») Szept 30, 2010 /
 
Köszönöm, holnap majd próbálkozok! (Meg én is nekifekszek a szakirodalomnak, mint Poostmaster kolléga )
(#) cassis hozzászólása Okt 1, 2010 /
 
Hát ez milyért van?

org 50
movlw h'aa'
movwf portd,0

A fentiekre ezt írja ki fordítási hibaként az MPLAB:
Symbol not previously defined (portd)
A PIC16 -os sorozatnál nem tapasztaltam ilyen jellegű problémát.
Vagy én nézek el valamit?
(#) spepe válasza cassis hozzászólására (») Okt 1, 2010 /
 
Nem inkább PORTD? Mondjuk ez csak tipp.
(#) cassis válasza spepe hozzászólására (») Okt 1, 2010 /
 
Ha jól látom csak átfordítottad nagybetűsre.
Az pedig elvileg nem számít.
(#) spepe válasza cassis hozzászólására (») Okt 1, 2010 /
 
És ha a címre írnál közvetlenül? Biztos le van írva a Datasheet-be.
(#) bbalazs_ válasza cassis hozzászólására (») Okt 1, 2010 / 1
 
De bizony szamit!
(#) cassis válasza bbalazs_ hozzászólására (») Okt 1, 2010 /
 
mennyire igazad van!
Eddig mindig nagybetűvel írtam, de most aztgondoltam áttérek kicsire. Az utasításokat így is elfogadta, de úgylátszik a regiszter megnevezéseket már nem.
Egyébként kipróbáltam címre tudtam írni.
(#) icserny válasza cassis hozzászólására (») Okt 2, 2010 /
 
Az MPLAB Project/Build Options/project menüben az opciók között van olyan beállítási lehetőség (az MPASM assembler fülön), hogy Disable case sensitivity. Ettől függ, hogy számít-e a kis/nagybetű különbsége.
(#) hzsolt77 hozzászólása Okt 2, 2010 /
 
Sziasztok!
Az lenne a kérdésem,hogy hogyan lehetne PIC-el összehozni egy olyan áramkört
aminek a bemenete 0 ról 24 voltra változna (és így is maradna egy bizonyos ideig)
aminek hatására a kimenet 4 szer vagy 5 ször megvezérelne egy tranzisztort,
amivel egy csipogót működtetnék.(Kb fél másodperces időközök a csipogások között)
Ha a bemenet újból 0 ról 24 re vált a folyamat újból lejátszódna.
Egy buszba kellene leszállásjelző visszajelzőként a sofőrnek.A bemeneti jelet
a műszerfalon lévő visszajelzőről vennénk.
Sajna nem értek a progizáshoz ezért kérném a segítségeteket.
Előre is köszi!
(#) cassis válasza hzsolt77 hozzászólására (») Okt 2, 2010 /
 
ha nem ismered a programozást nehéz lesz összehozni.
A feladat egyszerűségéből adódóan szerintem praktikusabb lenne időzítőben gondolkodni pl. 555 ben.
(#) bbalazs_ válasza hzsolt77 hozzászólására (») Okt 2, 2010 /
 
Egy szazforintos PIC megoldja. Ossze lehet persze legozni idozitobol meg szamlalokbol, de sokkal bonyolultabb lesz. Szerintem egy kicsit okosabb muszeresztanulo zsebpenzert megcsinalja.
(#) hzsolt77 válasza bbalazs_ hozzászólására (») Okt 2, 2010 /
 
Az 555 ös időzítős megoldásra én is gondoltam,a csipogó meghajtása pedig 4017 el történt volna , de itt jópáran csodákat művelnek a PIC el gondoltam hátha van megoldás,mert jóval egyszerűbb,kevesebb alkatrész stb.
(#) cassis válasza hzsolt77 hozzászólására (») Okt 2, 2010 /
 
Igazad van ilyen feladatokkal lehet elkezdeni PIC el foglakozni. De szerintem inverteres schmitt triggerekből kialakított oszcillátor egy rövidebb (a sípolásra) és hosszabb időzítő (a sípolási időre) logikai össze ÉS -vel egyszerű és minden igényt kielégít. De ugye így már messze járunk a PIC től.
(#) vicsys válasza hzsolt77 hozzászólására (») Okt 2, 2010 / 1
 
Csatoltam. A következő találkozón jössz egy sörrel.
(#) hzsolt77 válasza vicsys hozzászólására (») Okt 2, 2010 /
 
Vicsys leköteleztél! Nagyon szépen köszönöm!
Már nekiláttam az időzítős logikai kapus megoldáson törpölni. Ha eljutok a találkozóra fizetem a sört!!
(#) szaffo555 hozzászólása Okt 2, 2010 /
 
Sziasztok!

Most szeretnék átstartolni a PIC16F sorozat után a 18F típusokra. Azonban ellentmondásos nekem a memóriatérkép. Tanulmányoztam icserny által készített és nagyon hasznos weblapot, de még ebből sem világos a dolog.
amit eddig értek:
Alapvetően van 16 bank. Bankot váltani a BSR<3:0> val lehet. Eddig ok. Az Access bank címtartománya 0x00-0x5F és 0xF60-0xFFF között van. Ami ide van címezve alapértelmezés szerint megkapja az a=0 (ACCESS) értéket. Ami pedig nem, annak a 12 bites címéből lemarad a felső 4 bit, így a BSR -t kell használnunk, ha jó helyre akarjuk őket tenni.

Úgy tudom, hogy az ACCESS bank arra jó, hogy nem kell a regisztereket bankba szervezni, közvetlenül címezhetőek.
Az SFR regiszterek 0xF40 - 0xFFF között vannak. Tehát vannak olyan regiszterek (0xF40 - 0xF60), amelyeket csak a 15. bankban címezve lehet elérni?
Másik kérdés, hogy milyen regiszterek vannak a bank0 -ból 0x00 - 0x5F között az access bankba leképezve?
a fentiekbő adódóan ez hibás programrészlet?
  1. movlb   d'15'                   ; bank15
  2.         movlw   b'00000000'
  3.         movwf   TRISC,1


Ha valakinek van kedve megvilágítani hogy is van ez szívesen venném!
(#) Hp41C válasza szaffo555 hozzászólására (») Okt 2, 2010 /
 
Szia!

Az ACCESS bank minden bank kiválasztás melett közvetlenül elérhető memória tartomány, hagyományos utasítás módban a 0. bank 0x00- 0x7F általános célú és a 15. bank 0x80 - 0xFF FSR regisztrereit lehet elérni. Az utasításoknál érdemesebb a hivatkozást a következő módon írni:
  1. movf     Ram00,f,A

Példának a megszakítás rutin regiszter mentését lehetne felhozni: A WREG tartalmát el kell menteni, de a BSR tartalma nem ismert. A WREG tartalmát a ACCESS ram-ban foglalt rekeszbe mentjük (a BSR értéke mindegy)...
A funkció hasonlít a 16F típusok közös memóriaterületéhez (0x70..0x7F) - már amelyikben van ilyen terület...
A bankok kezelésében teljesen igazad van. A memóriacím felső négy bitjét (általában) a BSR regiszter 3..0 bitjei adják. A movff azonban a teljes 12 bites címet kezeli - segítségével bankok között (is) lehet adatot mozgatni.

A nagyobb kontrollerben sokkal több FSR van, így ezek egy része nem fér bele a ACCESS bank felső felébe, ezek csak a 15. bank kiválasztásával érhetők el direkten, vagy a movff utasítással. Indirekt címzésnél a teljes 12 bites cím az FSRxH:FSRxL regiszterpárban van.

A felhozott példád működik, de szebb lenne a
  1. movlb  d'15'      ; bank15
  2.   movlw  b'00000000'
  3.   movwf  TRISC,BANKED

fomában.
(#) Poostmaster hozzászólása Okt 2, 2010 /
 
Hali!

Írtam egy kis programocskát, csak úgy gyakorlás képpen a próbapanelomra. A nyolc ledből az utólsó villogva jelzi a másodpercek múlását, és minden percben kigyullad egy a másik végéről kezdve. 5 perc után nullázódik.
Amire magyarázatot szeretnék, az az, hogy a várakozásra használt delay_ms() függvényhez miért 250-es értéket kellett megadnom, hogy a másodpercem meglegyen egy világos-sötét ciklus alatt? nem 1000 egy másodperc?
(#) icserny válasza szaffo555 hozzászólására (») Okt 2, 2010 /
 
1. Az ACCESS BANK alsó része RAM terület (Bank 0 eleje). Ide célszerű tenni a leggyakrabban használt változókat.

2. Az nem minden PIC18F típusra igaz, hogy 0x5F-ig RAM az ACCESS BANK! Például a PIC18F4520-nál 0x7F a határvonal (tehát az Access terület fele RAM, fele SFR). A PIC18F14K50-re azonban tényleg az van, amit írtál...
Idézet:
„Tehát vannak olyan regiszterek (0xF40 - 0xF60), amelyeket csak a 15. bankban címezve lehet elérni?”
Mikrovezérlője válogatja. Konkrétan a PIC18F14K50-nél ez a helyzet, a PIC18F!550-nél viszont nem, mert annak kevesebb és kevésbé szétszórt regisztere van.

Az ACCESS BANK használata természetesen nem kötelező, tehát ugyanaz a regiszter többféleképpen is megcímezhető/elérhető.
(#) cNobody válasza Poostmaster hozzászólására (») Okt 2, 2010 /
 
Milyen panel? Miben programozol?
A parancsból ítélve mikroC. Szerintem nem megfelelő órajel van beállítva a programban.

Ahhoz hogy a delay_ms() függvény pontos legyen, ahhoz szüksége van a fejlesztő környezetnek a pontos órajelre.
(#) szaffo555 válasza icserny hozzászólására (») Okt 2, 2010 /
 
köszönöm mindkettőtök válaszát.
Mégy egy kicsit világosítsatok rajtam légyszíves!
1.
Idézet:
„Az ACCESS BANK használata természetesen nem kötelező, tehát ugyanaz a regiszter többféleképpen is megcímezhető/elérhető.”

Az access bankben értem, elérhető közvetlenül. De pl. a TRISC hogyan lenne érhető bankolt területen BSR segítségével? A memóriatérkép szerint a TRISC már a 16. bankban lenne, ha lenne ilyen, mert ennek címe 0xF94 és a 15. bank befejeződik 0xF5F nél.
Valószínűleg ezért nem világos Hp41C válasza sem, aki azt írja helyes a kód, és a bank 15 ben megtalálja TRISC -t.

A következőt kipróbáltam, ez látszólag működik is, hogy a PMMODEL -t (ami a 0xF48 on van, tehát a bank 15 ben ) így címeztem:

  1. movlb   d'15'                   ; bank15
  2. movlw   B'00000000'
  3. movwf   PMMODEL,banked


Engem az zavar még nagyon, hogy a bank 15. be belenyúló SFR - eket milyért nem egyértelműen BSR -el kell camezni, míg az access bankba leképzetteket meg access al?

Szóval hogy is van ez,
(#) Poostmaster válasza cNobody hozzászólására (») Okt 2, 2010 /
 
A 44-pin-es demo kártyára. 887-es van rajta. Nem C, hanem Pascal. amikor a PIC-et kiválasztottam, alapból a 8 MHz-et állította.
(#) watt válasza szaffo555 hozzászólására (») Okt 2, 2010 /
 
A funkció regiszterekhez sem kell bankolni, bárhol elérhetőek.
(#) Hp41C válasza szaffo555 hozzászólására (») Okt 2, 2010 /
 
Szia!

Mottó: Egy informatikus számolja a gyerekeit: Nulla, egy, kettő... Te jó Isten, hol a harmadik gyerekem !?!?

Hát ez az örök probléma:
Idézet:
„Valószínűleg ezért nem világos Hp41C válasza sem, aki azt írja helyes a kód, és a bank 15 ben megtalálja TRISC -t.”

A memóriában az első Bank címe 0, az utolsó Bank címe 15.
Az adatlapokban Bank0 ... Bank15 -öt emlegetnek.

A TRISA (0xF92), TRISC(0xF94) -vel is kipróbáltam 18F4620 -on... Működik!
(#) Hp41C válasza watt hozzászólására (») Okt 2, 2010 /
 
Épen arról beszélünk, hogy egy FSR, aminek a címe 0xF48 csak a 15. lapról érhető el...
(#) Hp41C válasza Hp41C hozzászólására (») Okt 2, 2010 /
 
A 18F2580 ban az FSR terület a 0xD60 .. 0xFFF közötti címeken van. A 0xD60 .. 0xDFF a 13. Bank (BSR = 0x0D), az 0xE00 .. 0xEFF a 14. Bank ((BSR = 0x0E), a 0xF00 .. 0xF7F a 15. Bank (BSR = 0x0F) mellett érhető el direkt címzéssel...
Következő: »»   809 / 1320
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