Fórum témák

» Több friss téma
Fórum » PIC programozás assemblyben
 
Témaindító: sonajkniz, idő: Máj 30, 2015
Témakörök:
Lapozás: OK   4 / 32
(#) Pali79 válasza sonajkniz hozzászólására (») Okt 3, 2015 /
 
Szia!
Az adó-vevő adatlapjának 18. oldalán van az ábra, hogy miként kell felépíteni az adatforgalmat. De szerintem kevésbé szívatnád meg magad, ha olyan adó-vevőt választanál ami SPI interfészt használ a kommunikációhoz. Az pofon egyszerű az általad választott PIC-ben is van SPI modul.
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 3, 2015 /
 
Szia!
Ha még nem vetted meg, akkor javasolnék olyan adó vevőt, ahol nem kell saját kódolást kiagyalni, csak betolni az adatot , ráadásul a vevő inteligens és csak akkor kezdi venni az adatot, amikor neki szól.
Esetleg nézz be az RFM12bs topicba. ( Ez a modul adó és vevő is egyben)
Assembly programozásban az adott modulhoz tudok segítséget adni.
üdv.: Foxi
(#) sonajkniz válasza foxi63 hozzászólására (») Okt 3, 2015 /
 
Szia!
Azért tetszett meg ez az adó-vevő pár, mert mindenképpen a PIC12F1840-el szeretném a rendszert felépíteni, és az adatlap szerint ez az egység csak egy lábat használ. Nem mellékesen nagyon olcsó. Ami nem stimmel nekem, hogy az ábrán jelzett PIC adatlapja szerint ahová kötve van az nem kommunikációs láb. Valamint az sem tiszta, hogy ha ennyi kell a rádióhoz, akkor minek bele SDA, meg CLK.
(#) zenetom válasza sonajkniz hozzászólására (») Okt 3, 2015 /
 
Ha elolvasod az adatlapot, vagy legalább a 11. oldalt, akkor kiderül, hogy az SDA és CLK lábak az RF modul programozásához kell. Ezt pedig csak akkor kell használni, ha a default beállításoktól eltérőt szeretnél beállítani (12-13. oldal).
A hozzászólás módosítva: Okt 3, 2015
(#) Pali79 válasza sonajkniz hozzászólására (») Okt 3, 2015 /
 
Valóban csak 1 lábat használ a kommunikációhoz. Az órajelet a modul saját kvarca adja, ami ha jól látom 26 MHz-es. Ehhez kell igazítanod az adatküldést. Pl. egy soft resetet úgy kell csinálni, hogy 16 órajel ciklus alatt kell kiadnod a 0xBD01 értéket azon az egy lábon.
(#) sonajkniz válasza zenetom hozzászólására (») Okt 3, 2015 /
 
Ne haragudj a tudatlan kérdéseimért, de adó-vevő terén leragadtam azon primitív szerkezeteknél, ahol addig van jel a vevő kimenetén, amíg az adón nyomom a gombot. Igazából ennél is úgy képzeltem el, hogy a PIC kiad magából valami azonosítót, azután azokat az információkat, amiket továbbítani szeretnék, a vevö ezt adja a másik PIC- nek, az meg a programom azerint feldolgozza. Vagy ez nem ilyen egyszerű?
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 4, 2015 /
 
Szia!
Hát sajnos nem egyszerű. A vevő állandóan vesz valamit, ha mást nem zavarjeleket. nézzük az átküldendő adatokat. Egy szám 8 bitből áll, azonban a vevő nem birkózik meg az adattal, ha egymás után több 0 bit van. Ezért az átküldendő adatokat kódolni kell. Elég elterjedt a manchester kódolás.(Lásd Wikipédia) .Aztán amikor az adó adni kezd, nem biztos, hogy mindjárt veszi az első bitet is,tehát kéne valamilyen szinkronizáló jel ,majd az adathalmaz, a végén egy ellenörző összeget is ki kell adni. A vevő veszi az adatokat, előállítja a saját ellenörző összegét és a legvégén összehasonítja a vett ellenőrző összeggel. Ha stimmelnek, az adat felhasználható, egyébként el kell dobni.
kb. ezt kell leprogramoznod.
üdv.: Foxi
(#) sonajkniz válasza foxi63 hozzászólására (») Okt 4, 2015 /
 
Szia!

Ez így tényleg eléggé macerás. Főleg, hogy vezetékesen már próbáltam egy vezetéken adatot küldeni, de valamiért sehogy sem került szinkronba a két PIC órajele.
A kódolás ezen segítene?
(#) bbalazs_ válasza sonajkniz hozzászólására (») Okt 4, 2015 /
 
Nem, a kodolas abban segit, hogy eldonthesd, a jo adat ment-e at, amit te szerettel volna.
Miert kell egy vezetek? Soros vonali kuldes nem jo? Mindket PIC TX es RX vonalakkal rendelkezik, ezeket osszekotve hardware-bol megy, ha a soros beallitasok jok.

Ha oda-vissza akarsz kommunikalni 1 vezeteken, akkor a 1-Wire technologianak kellene utananezned, pl. a DS1821 homero igy mukodik. Ez egy hosszu impulzust hasznal szinkronizalasra es idoalapu a kodolasa.
(#) sonajkniz válasza bbalazs_ hozzászólására (») Okt 4, 2015 /
 
Csak egyirányba akarok adatot küldeni, mindössze néhány byte-ot, és rádióval.
(#) Hp41C válasza sonajkniz hozzászólására (») Okt 4, 2015 /
 
A Manchester kódolás lényege, hogy az adat és a szinkronizáló információ egy jelben továbbítható. Mágneses adattárolásra fejlesztetté ki. Szalaghoz, dobhoz, lemezhez, stb, ahol csak egy fej áll rendelkezésre.
(#) sonajkniz válasza Hp41C hozzászólására (») Okt 4, 2015 /
 
Ezt még úgy-ahogy értem. A kód létrehozásában sem látok problémát. Csak arról nincs elképzelésem, miként fogadjam és felytsem vissza.
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 4, 2015 /
 
Szia!
Nos ha assembly programozás, akkor egy bit kivitele:
Az adatlap szerint 0.1 -40kbps sebesség lehetséges. Legyen hasra 9.6k 1/9,6*1024= 0,101ms azaz kb 100us egy bit ideje. ezt osszuk négy felé =50us . A 0 bit felépítése 150us magas és 50us alacsony az 1 bit 50us magas és 150us alacsony szint. Ezzel a megoldással már ki lehet küldeni a biteket.
Adás megkezdésekor kiküldesz 3db 0x55 számot, ezután egy 0xAA t azután az adatokat, és végül az ellenörző számot.
A vétel:
Megérkezik egy bit , ha ez 1 akkor várunk a 0 bitre. 0 bitnél elkezdjük körbeforgatni a vevőpuffert, minden beérkező bitnél forgatunk egyet rajta és megvizsgáljuk, hogy a puffer értéke 0xAA lett-e ha nem forgatunk tovább. Ha 0xAA akkor a szinkron megvan utána jönnek az adatok stb....
Bár én ilyet sosem használtam, valami ilyesmit készítenék.
(#) foxi63 hozzászólása Okt 4, 2015 /
 
kimaradt, hogy minden második beérkező bit után vizsgálunk 0xAA -ra.
(#) foxi63 hozzászólása Okt 4, 2015 /
 
Vételkor az adatláb felfutó élére megszakítás generálódik, és 100us múlva ott van a bit ami vagy 0 vagy 1.
A továbbiakban is szinkronizálhat a bejövő jel,vagy kvarc esetén pontos időzítés néhány byte átvitele esetén.
(#) sonajkniz válasza foxi63 hozzászólására (») Okt 4, 2015 /
 
Én most azzal kezdtem el kisérletezni, hogy először kiadok egy magas jelszintet 1ms hosszan. Utána 0,5ms szünet. Majd 0,2ms magas, 0,5ms szünet. Ezt a vevőoldal úgy értelmezi, hogy az első jel kivált egy megszakítást. A megszakításon belűl egy számláló beméri az első jel hosszát. Ez az érték lessz a sablon a magas jelszinthez. Az ezután beérkező jel már adat. Minden beérkező jelet a sablonhoz hasonlít. Az ennek a jelnek a 2/3-át meghaladó jelet 1-nek fogadja el, ami ennél rövidebb, az a 0. Így elvileg nem zavar be az esetleges órajel eltérés.
Mi a véleményed?
(#) sonajkniz válasza sonajkniz hozzászólására (») Okt 6, 2015 /
 
Feltaláltam a tyúksz**ban az ütőeret. Gyakorlatilag amivel elketdtem kisérletezni, az a bbalazs álltal javasolt 1-Wire technológia. Miután utánaolvastam, és aszerint állítottam be az időzítéseket, sikerrel küldtem át adatot. Most még egy dologgal vagyok megakadva.
Bár az adat (jelen esetben mindössze 1 byte) 300qsec alatt átmegy, a frissítési gyakoriságot nem bírom 30Hz fölé emelni. Az fölött egyszerűen nem megy át adat. De már az első sem.
Mit rontok el?
(#) zenetom válasza sonajkniz hozzászólására (») Okt 6, 2015 /
 
300qsec? Gondolom az 300usec lenne.
Forráskód nélkül nehéz bármit is segíteni.
(#) bbalazs_ válasza sonajkniz hozzászólására (») Okt 6, 2015 /
 
Milyen PIC-et, mekkora frekvenciaval hajtasz?
Probaltal-e PLL-el orajelet emelni? Be van-e kapcsolva valamilyen elooszto a szamlalokhoz, timerekhez?
(#) sonajkniz válasza bbalazs_ hozzászólására (») Okt 6, 2015 /
 
Szia!

PIC18F14K22 4MHz órajelen. Időközben találtam egy hibát, Timer0 8 bites üzemmód helyett 16 bitesen van. Kijavítom, meg nézem, úgy mit csinál, utána feltöltöm a programrészleteket.
(#) sonajkniz hozzászólása Okt 6, 2015 /
 
Na most fejelem meg a falat!
Végre minden jónak tűnik. Gyors, pontos átvitel, 2 másodpercig, utána a vevő elektronika lefagy. De legalábbis az LCD-ről eltűnik minden.
Jelenleg a tesztáramkör áll adóoldalon egy potiból, egy PIC-ből, és egy ledes 3 karakteres kijelzőből, ami a poti értékét mutatja. Ezt az értéket küldöm át. Vevőoldalon meg egy PIC és egy 2x16 LCD van. Egy darab 3 számjegyű számot jelenít meg.
Ez lenne az adásért feleős program:
  1. ;-------------------------------------------------------------------------------
  2. KULDES  
  3.     BSF     LATA,5               ;Kimeneti csatorna
  4.     MOVLW   D'24'
  5.     MOVWF   SZAMLALO;            ;Indító jel. 200 órajel
  6.     DECFSZ  SZAMLALO
  7.     GOTO    $-2
  8.     BCF     LATA,5              
  9.     MOVLW   D'12'
  10.     MOVWF   SZAMLALO             ;Szünet 104 órajel
  11.     DECFSZ  SZAMLALO
  12.     GOTO    $-2
  13.     MOVLW   D'8'                 ; 1 byte adat küldési ciklusa
  14.     MOVWF   CIKLUS
  15. ADATOK
  16.     BTFSS   ADAT,7               ; Adat 7. bitjének vizsgálata. Ha 1 akkor az
  17.     GOTO    ALACSONY             ; impulzus hossza 48, ha 0, akkor 16 órajel.
  18.     MOVLW   D'6'
  19.     MOVWF   SZAMLALO
  20.     GOTO    INDUL
  21. ALACSONY    
  22.     MOVLW   D'2'
  23.     MOVWF   SZAMLALO
  24. INDUL  
  25.     BSF     LATA,5
  26.     DECFSZ  SZAMLALO
  27.     GOTO    $-2
  28.     BCF     LATA,5
  29.     RLNCF   ADAT                 ; Adat léptetése 1-el balra
  30.     MOVLW   D'3'
  31.     MOVWF   SZAMLALO             ; Szünet beállítása. Ha jól számoltam, a
  32.     DECFSZ  SZAMLALO             ;szünet teljes hossza 64-68 órajel
  33.     GOTO    $-2
  34.     DECFSZ  CIKLUS
  35.     GOTO    ADATOK
  36.     RETURN
  37. ;--------------------------------------------------------------------------


Ez pedig a vételé:
Timer0 beállítása 8 bit 1:2 előosztó
Timer1 beállítása 8 bit 1:1 előosztó

  1. ;-------------------------------------------------------------------------------
  2. MEGSZAKITAS
  3.     BCF     INTCON,7            ;Megszakítás ki.
  4.     BTFSC   PORTA,0             ;Amíg magas, nem lép tovább.
  5.     GOTO    $-2
  6.     MOVLW   D'205'              ;Timer0 időzítő kezdőértékre töltése.
  7.     MOVWF   TMR0L              
  8.     BCF     INTCON,2  
  9.     ;Ha az utolsó jeltől számítva az időzítő lejártáig nem jön jel, akkor kilép
  10.     ;a megszakításból. A beállítások alapján számításaim szerint 245-re kellene
  11.     ;állítani, de ott egyáltalán nem működik.
  12.     GOTO    VARAKOZAS
  13. MERES
  14.     CLRF    TMR1L              ;Timer1 törlése
  15.     MOVLW   D'205'             ;Timer0 ciklusonkénti kezdőértékre töltése.
  16.     MOVWF   TMR0L
  17.     BTFSC   PORTA,0            ;Amíg magas, nem lép tovább. Közben Timer1, méri
  18.     GOTO    $-2                ;az időt.
  19.     MOVFF   TMR1L,MEROIDO
  20.     MOVLW   D'8'
  21.     CPFSGT  MEROIDO            ;Ha a mért idő kisebb mint 8 (32 órajel) a
  22.     GOTO    ALACSONY           ;beérkező jelet 0-nak értelmezi.
  23.     RLNCF   VETEL
  24.     BSF     VETEL,0
  25.     GOTO    VARAKOZAS
  26. ALACSONY
  27.     RLNCF   VETEL
  28.     BCF     VETEL,0
  29. VARAKOZAS
  30.     BTFSC   PORTA,0
  31.     GOTO    MERES
  32.     BTFSS   INTCON,2
  33.     GOTO    VARAKOZAS
  34.     BCF     INTCON,1            ;Megszakítás kiváltó ok törlése
  35.     BSF     INTCON,7            ;Megszakítás be.
  36.     BSF     MB1,0               ;A főprogramban engedélyezi az adatátírást
  37.     RETFIE
(#) Hp41C válasza sonajkniz hozzászólására (») Okt 6, 2015 / 1
 
A vevő rutinban a 3 és főképen a 35. sor okozhatja a hibát. A kontroller maga (hardware) tiltja a megszakítást, ha már egyet elfogadott. A 35. sor azt okozhatja, hogy a visszatérési cím rajta marad a stack -en. A 8 szintű stack elég hamar betelhet.
(#) sonajkniz válasza Hp41C hozzászólására (») Okt 6, 2015 /
 
Szia!
Bár azt nem tudom, mi az a "stack", de abban teljesen biztos vagyok, hogy igazad van!
Ugyanis megszüntettem a megszakítást, a program egy pontjárol ugrok el adatot lekérni.
Ott előszőr várok a szinkronjelre, majd ha az megvan, fogadom az adatot. Plussz megfejeltem az egészet egy WDT-vel, hogy ha nem jön jel, kerüljön a cucc alaphelyzetbe. Erre vonatkozna a következő kérdésem:
A túl gyakori reset, amit a WDT válthat ki, ha nem jön adás, nem árt a PIC-nek?
Amúgy így néz ki a módosítás. Most jó minden.
  1. CALL    ADATKERES
  2.     CLRWDT
  3.     MOVFF   VETEL,KIIRANDO
  4.     GOTO    MAIN
  5. ;-------------------------------------------------------------------------------
  6. ADATKERES
  7.     CLRF    TMR1L              ;Timer1 törlése
  8.     BTFSC   PORTA,0             ;Amíg magas, nem lép tovább.
  9.     GOTO    $-2
  10.     MOVFF   TMR1L,MEROIDO
  11.     MOVLW   D'18'
  12.     CPFSGT  MEROIDO            ;Ha a mért idő kisebb mint 18 (112 órajel) a
  13.     GOTO    ADATKERES          ;visszaugrik adatkérésre.
  14.     MOVLW   D'215'              ;Timer0 időzítő kezdőértékre töltése.
  15.     MOVWF   TMR0L              
  16.     BCF     INTCON,2  
  17.     GOTO    VARAKOZAS
  18. MERES
  19.     CLRF    TMR1L              ;Timer1 törlése
  20.     MOVLW   D'215'             ;Timer0 ciklusonkénti kezdőértékre töltése.
  21.     MOVWF   TMR0L
  22.     BTFSC   PORTA,0            ;Amíg magas, nem lép tovább. Közben Timer1, méri
  23.     GOTO    $-2                ;az időt.
  24.     MOVFF   TMR1L,MEROIDO
  25.     MOVLW   D'8'
  26.     CPFSGT  MEROIDO            ;Ha a mért idő kisebb mint 8 (32 órajel) a
  27.     GOTO    ALACSONY           ;beérkező jelet 0-nak értelmezi.
  28.     RLNCF   VETEL
  29.     BSF     VETEL,0
  30.     GOTO    VARAKOZAS
  31. ALACSONY
  32.     RLNCF   VETEL
  33.     BCF     VETEL,0
  34. VARAKOZAS
  35.     BTFSC   PORTA,0
  36.     GOTO    MERES
  37.     BTFSS   INTCON,2
  38.     GOTO    VARAKOZAS
  39.     RETURN
(#) Hp41C válasza sonajkniz hozzászólására (») Okt 6, 2015 /
 
A stack tárolja a visszatérési címeket. Annak az utasításnak a címét, amit a call -lal hívott ill. a megszakítás kiszolgáló rutin lefutása után végre kell hajtani.

Stack.JPG
    
(#) sonajkniz válasza Hp41C hozzászólására (») Okt 6, 2015 /
 
Köszönöm az infót!
Most már csak a másik kérdésemre szeretnék választ kapni, a reszettel kapcsolatban.
(#) Hp41C válasza sonajkniz hozzászólására (») Okt 6, 2015 /
 
A sok reset (watchdog, brown-out és egyéb) nem árt a kontrollernek. Ha valamilyen értéket a belső EEPRom -jába elment, akkor kell az írhatósági számra figyelni.
A hozzászólás módosítva: Okt 6, 2015
(#) sonajkniz válasza Hp41C hozzászólására (») Okt 6, 2015 /
 
Nagyon köszönöm mindenkinek a segítsséget!
(#) bbalazs_ válasza sonajkniz hozzászólására (») Okt 6, 2015 /
 
A 18F-esekben mar joval nagyobb a verem. Akkor lehet gond, ha rekurzio tortenik.
A megszakitasban nem szabad annyit varni (sot, egyaltalan nem szabad varni), hanem amilyen gyorsan csak lehet, visszaadni a vezerlest a foprogramnak.
A 18-as csalad K sorozatanal figyelni kell a regiszterekre, mert van, amelyik kimaszik a tartomanybol ezert assemblyben a BSR-t allitani kell hozza, utana meg vissza a tobbihez.
A hozzászólás módosítva: Okt 6, 2015
(#) Hp41C válasza bbalazs_ hozzászólására (») Okt 6, 2015 /
 
Nem az a lényeg, hogy mekkora a verem, hanem az, hogy a kontroller áramkörei (HW) gondoskodnak arról, hogy ne fogadjanak el egy (ugyanolyan szintű) megszakítást. aminek a kiszolgálása épen zajlik. (Magasabb szintűt elfogadhatják.) Minden mikroprocesszorban gondot okoz, hogy a megszakításból való visszatérés alatt se fogadjon el kérést, de különböző gyártók és típusok más-más megoldást valósítanak meg. Van ahol a megszakítás engedélyezése 1 utasítást (a rutin végén levő return) késleltetik (I8080), van ahol a hardware végzi a sátus szó visszaállítását (benne van a megszakítás engedélyező bit) és van ahol külön utasítás van rá. (Z80: reti, retn, PIC: retfie). Bízzuk a kontrollerre a tiltást.
(#) bbalazs_ válasza Hp41C hozzászólására (») Okt 7, 2015 /
 
Az rendben van, hogy nem fogadnak el, de azonnal utana viszont lehet, igy ha a megszakitas hosszan vacakol es kozben beut a kovetkezo megszakitas, akkor a foprogi nem kap idot.
Ezert javasoltam reszben az orajel emelest, a kod ismerete nelkul.
Következő: »»   4 / 32
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