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   5 / 32
(#) Hp41C válasza bbalazs_ hozzászólására (») Okt 7, 2015 /
 
Nem segít a bádogtető lejtésének emelése, ha jó nagy lyuk van rajta. Ígyis-úgyis beesik az eső.
Még egyszer: Nem a sebességet, nem a program hosszát, stb kifogásoltam, hanem azt a rossz beidegzódést, hogy a GIE (ill. a GIEH, GIEL) biteket a megszakítási rutinban állítgatjuk. Mindenképen hibát okoz, főleg abban az esetben, amit felhoztál példának.
  1. Int:
  2.   bcf INTCON,GIE
  3.   nop ;;;; legyen itt egy jó hosszú kiszolgáló rutin...
  4.   bsf INTCON, GIE
  5.   retfie

Lássuk csak, mit csinál, ha elég gyorsan jönnek a kérések. Ha a kérés a bsf utasítás végrehajtásakor már aktív, a kontroller elfogadja. Leteszi a stack -re a retfie címét, elugrik a megszakítás belépési pontjára. Ha a kérés a bsf utasítás végrehajtásakor már aktív, a kontroller elfogadja. Leteszi a stack -re a retfie címét, elugrik a megszakítás belépési pontjára....
Egy 16F -en elég 7 -szer, egy 16F1xxx -en 15 -ször, egy 18F -en 31 -szer eljátszani és betelik a stack...
  1. Int:
  2.   nop ;;;; legyen itt egy jó hosszú kiszolgáló rutin...
  3.   retfie

Lássuk csak, mit csinál, ha elég gyorsan jönnek a kérések. Az első kérés elfogadásakor (mielőtt még a belépési pontra ugrana) a stack -ra menti a PC értékét és letiltja a kérések elfogadását. Végrehajtja a kiszolgálást (akár milyen hoszzú is legyen). A kiszolgáló törli a kiváltó okot, de más kérést is kiszolgálhat, ha a megszakítás kérő jelzőbitje 1. A kilépés előtt legyen egy új kérés, amit a kiszolgáló nem tud már lekezelni. A retfie a GIE -t 1 -re állítja az utasítás végrehajtása során. Azaz a stackról leszedi a mentett értéket és beteszi a PC -be (minden bitjét) és engedélyezi a megszakítást. A megszakítást csak a retfie utasítás végrehajtása után fogadhatja el. Így a stack -en nem tudnak felhalmozódni a visszatérési címek.

Bővebben: Link
(#) sonajkniz válasza Hp41C hozzászólására (») Okt 7, 2015 /
 
Szia!

Újab problémával fordulnék hozzád.
megvettem az adó-vevő párt.(Adó: RFM117-868S1, Vevő: RFM217-868S1)
Beiktattam az áramkörbe, hogy ezen vigyem a jeleket. Csakhogy hülyeségeket csinál.
Ha a PIC-ek az eredeti 4MHz-n pörögnek, amint adni kezd az adóoldal, fél másodpercenként változnak véletlenszerű számok a kijelzőn, függetlenül attól, én mit akarok küldeni. Ha folyamatos négyszögjelet küldök, akkor is. Ha leveszem a PIC-ek frekvenciáját 2MH-re, a vevő folyamatos 255-öt ír ki beadott jeltől függetlenül, ha felemelem 8MHz-re, akkor meg 66-ot. Stabil 0, vagy stabil1 esetén nem ír ki semmit. Az RF adatlapján semmit nem találok arra vonatkozóan, hogy modulálná az álltalam küldött jeleket, vagy egyébb jelet is elküldene.
Kérlek, ha tudsz valami bővebb infót az adó-vevőről, esetleg a bekötéséről, segíts!
(#) Hp41C válasza sonajkniz hozzászólására (») Okt 7, 2015 /
 
Sajnos nincs tapasztalatom ezekkel a modulokkal kapcsolaban.
A hozzászólás módosítva: Okt 7, 2015
(#) bbalazs_ válasza Hp41C hozzászólására (») Okt 7, 2015 /
 
Teljesen ket malomban orlunk.
Az altalad leirtak teljesen igazak.

En ket dologra mutattam volna ra:
1. a 16F sorozathoz kepest nagyobb a verem, igen kifacsart kodot kell irni (jellemzoen magasszintu nyelv forditoja altal generalt valami ize), hogy beteljen a verem NORMAL mukodes kozben.
2. Ha a megszakitasok tul gyorsan jonnek, nem marad ido a foprogramra EGYALTALAN.

Ennyit es nem tobbet szerettem volna a te KIEGESZITESEDKENT leirni, mintegy jotanacskent sonajkriz-nek. Sapienti sat.
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 7, 2015 / 1
 
Szia!
Próbáld meg úgy csinálni,hogy amikor a vevő adatlába magas szintű lesz, akkor megszakítást generál és elindít egy számlálót. pl. 100us annak leteltekor megnézed szintén az adatlábat, ha még magas akkor nulla az érték, ha alacsony akkor 1. persze a nulla ekkor 150us magasból és 50us alacsonyból áll. az 1 pedig 50us magasból és 150us alacsonyból.(ezután már 200us időnként kell megnézni. )Ekkor maga az adó szinkronizálja a vevőt.
Az adatátvitel 200us /bit.
üdv.: Foxi
A hozzászólás módosítva: Okt 7, 2015
(#) sonajkniz válasza foxi63 hozzászólására (») Okt 7, 2015 /
 
Köszi szépen!
Kipróbálom!
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 7, 2015 /
 
Most olvastam,hogy a vevő alapból 2,4kbit/sec átvitelre van állítva.
azaz 1 bit 1/2,4*1024=400usec.
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 7, 2015 /
 
Szia!
Közben megírtam az adó rutint 400us egy bit kivitele. 4MHz kristály esetén
  1. #include "P12LF1840.inc"
  2. radix dec
  3. ERRORLEVEL 2
  4. #define outbit PORTA,2
  5. ;
  6. cblock 0x20
  7. outpuffer:1
  8. endc
  9.  
  10. org 0
  11. goto start
  12.  
  13. org 0x04
  14. retfie
  15. ;*******************
  16. outbit1
  17. cblock
  18. cnt1:1
  19. cnt2:1
  20. endc
  21.         bsf outbit
  22.         movlw 33
  23.         decfsz WREG
  24.         bra     $-1
  25.         bcf     outbit
  26.         movlw 98
  27.         decfsz  WREG
  28.         bra     $-1
  29.         nop
  30.         return 
  31.                
  32. outbit0
  33.         bsf outbit
  34.         movlw 99
  35.         decfsz WREG
  36.         bra     $-1
  37.         nop
  38.         nop
  39.         bcf     outbit
  40.         movlw 31
  41.         decfsz  WREG
  42.         bra     $-1
  43.         nop
  44.         nop
  45.         return
  46. byteout
  47.         bsf     cnt2,3  ;8 bit
  48. a01     rlf     outpuffer,f
  49.         call    a00
  50.         decfsz  cnt2,f
  51.         bra             a01
  52.         return
  53. a00     btfss STATUS,C
  54.         goto    outbit0
  55.         goto    outbit1
  56. ;*******************
  57. start
  58.         movlw   0xaa
  59.         movwf   outpuffer
  60.         call    byteout
  61.          
  62.         goto start
  63.  
  64.  
  65.  
  66. end
A hozzászólás módosítva: Okt 7, 2015
(#) sonajkniz válasza foxi63 hozzászólására (») Okt 7, 2015 /
 
Szia!
Az adó értéke azt jelenti, hogy ettől eltérő bitrátát nem sugároz ki?
A programodból nem minden világos a számomra.
Például, hogy jöttek ki ezek az értékek? Illetve nem sikerült rájönnöm, hogyan választod ki, melyiket küldöd. Nagyon megköszönném, ha kikommentelnéd!
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 7, 2015 / 1
 
Mivel 4MHz hristálynál 1 utasítás ciklus 1us, ebből adódik hogy 100 ciklus hoz 33 decfsz /bra páros kell.A rutin pontos időzítését ellenőrizheted az MPlab ->debugger->stopwatch ablakban és a lerakott break jelzőkkel. A komment:
  1. #include "P12LF1840.inc"
  2. radix dec
  3. ERRORLEVEL 2
  4. #define outbit PORTA,2
  5. ;
  6. cblock 0x20
  7. outpuffer:1 ;az ide kerülő adat megy ki
  8. endc
  9.  
  10. org 0
  11. goto start
  12.  
  13. org 0x04
  14. retfie
  15. ;*******************
  16. outbit1
  17. cblock
  18. cnt1:1  ;bocsi ez nem is kell
  19. cnt2:1  ;a 8bit kivitelhez számláló
  20. endc
  21.         bsf outbit      ;a definiált portláb magas lesz
  22.         movlw 33        ;33x3 utasításciklus a Wregbe
  23.         decfsz WREG
  24.         bra     $-1             ;ha még nem nulla vissza
  25.         bcf     outbit  ;kimeneti bit alacsony
  26.         movlw 98        ;98x3 utasítás ciklus a Wregbe
  27.         decfsz  WREG
  28.         bra     $-1             ;még nem nulla (goto -1)
  29.         nop                     ;a pontos időhöz még kell 1 nop
  30.         return 
  31.                
  32. outbit0
  33.         bsf outbit
  34.         movlw 99
  35.         decfsz WREG
  36.         bra     $-1
  37.         nop
  38.         nop
  39.         bcf     outbit
  40.         movlw 31
  41.         decfsz  WREG
  42.         bra     $-1
  43.         nop
  44.         nop
  45.         return
  46. byteout
  47.         bsf     cnt2,3          ;8 ra állítja a számlálót 8bitet kell kivinni
  48. a01     rlf     outpuffer,f; a puffert egy bittel eltolja a kikerülő adat
  49.         call    a00             ;a CARRY -ba kerül (0 vagy 1) meghívődik a kiviteli rutin: a00
  50.         decfsz  cnt2,f  ;számláló -
  51.         bra             a01             ;még nem nulla vissza a01-re
  52.         return                  ;vége
  53. a00     btfss STATUS,C  ;megvizsgáljuk hogy az előzőleg kitolt bit
  54.         goto    outbit0 ;nulla vagy egy és oda ugrunk végrehajtani mivel egy call rutinban vagyunk,
  55.         goto    outbit1 ;itt kétfelé ágazik a program, és mindegy melyik fut le a
  56.                                         ; végén a return visszatér a progi.
  57. ;*******************
  58. start
  59.         movlw   0xaa
  60.         movwf   outpuffer
  61.         call    byteout
  62.          
  63.         goto start
  64.  
  65.  
  66.  
  67. end


Azért különböznek az idők, mert a magas szintek pontosan 100 és 300usec idők, viszont a rutin hívás is idő meg a visszatérés is és ez korrigálva van a "nulla" idejében.
A hozzászólás módosítva: Okt 7, 2015
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 8, 2015 /
 
Nem az adó, hanem a vevő van alapból 2,4Kbit/sec-re állítva, tehát adni is ennyivel kéne...
(#) sonajkniz válasza foxi63 hozzászólására (») Okt 8, 2015 /
 
Szia!

Így már értem a gondolatmenetedet. Nagyon ügyess! Még annál is jobban leegyszerűsítetted, mint ahogy én szoktam.
Viszont valószínűleg más fordítót használsz mint én, mert az MPLab X a ciklust nem úgy fordítja, mint ahogy a leírásod alapján kellene.

A "movlw 99"-et " nem decimálisnak, hanem hex-nek fordítja, ami így 153.
Valamint a ciklust nem 3, csak 2 utasításciklusba rendezi.
Ezért nem stimmeltek nekem a számok.
Mégegyszer köszönet.
(#) Pali79 válasza sonajkniz hozzászólására (») Okt 8, 2015 / 1
 
Pedig ott van a RADIX DEC a program elején. Így decimálisnak kellene lennie.
(#) sonajkniz válasza Pali79 hozzászólására (») Okt 8, 2015 /
 
Ott a pont. Én automatikusan RADIX HEX-et írtam. Így tanultam.
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 8, 2015 / 1
 
Szia!
Nem fordíthatja máshogy, mert a decfsz utasítás 1 ciklus, a bra pedig 2.
(#) sonajkniz válasza foxi63 hozzászólására (») Okt 8, 2015 /
 

Ezért nem akart nekem sehogy sem szinkronba kerülni az adó és a vevő oldal!
A vevő oldalon timerrel mértem a jelhosszakat, adó oldakon decfsz-goto ciklussal küldtem.
Csak én a goto-t mindig 1 ciklusnak számoltam. Most, hogy írtad, megnéztem az adatlapot.
Eddig csak azért nem szívtam ezt meg, mert nem használtam kritikus időzítésre. Újfent köszönet.
(#) sonajkniz hozzászólása Okt 9, 2015 /
 
Sziasztok!
Az lenne a kérdésem, hogy a megszakítás során van-e arra mód, hogy a program visszatérési címét megváltoztassuk? Arra gondolok, hogy ha van egy olyan ciklusom, amelyik beragadhat, akkor a ciklus elején elindítanék egy timert, ami ha lejár, megszakítást indít, ahol a visszatérő címet átírnám a ciklus kilépési pontjára.
(#) Pali79 válasza sonajkniz hozzászólására (») Okt 9, 2015 /
 
Mitől ragad be a ciklus? Inkább azt kéne megoldani valahogy.
(#) sonajkniz válasza Pali79 hozzászólására (») Okt 9, 2015 /
 
Jelre vár. Csak nem egyre, és nem egy helyen. Ráadásul minden egyes része időkritikus, ezért nem tehetek minden pontjára számlálót.
(#) nedudgi válasza sonajkniz hozzászólására (») Okt 9, 2015 /
 
Megszakításba akarsz ciklust tenni?
(#) sonajkniz válasza nedudgi hozzászólására (») Okt 9, 2015 /
 
Nem.
A ciklus a program futása közben kerül meghívásra. De nem maradhat benne sokáig.
Ezért adott idő után ki kellene belőle lépni. WDT-vel már megoldottam, de nem elegáns megoldás. Ráadásul hosszú.
(#) ktamas66 válasza sonajkniz hozzászólására (») Okt 9, 2015 /
 
A ciklusban figyelt valamilyen státusz bitet, amit a it rutinban átállítasz, így kiugorhat a ciklusból.
(#) sonajkniz válasza ktamas66 hozzászólására (») Okt 9, 2015 /
 
Ez az alap:
BTFSS PORTA,0
GOTOT $-2
Ez 3 utasításciklusl. tehát a bejövő jel még így is 2 utasításciklusnyi szórással rendelkezik.
BTFSC BIT,0
GOTO KILEP
BTFSS PORTA,0
GOTO $-8
További 1-2 utasításciklust tesz a szóráshoz. Mivel ez 40x ismétlődik, az időzítés kicsúszhat a szinkronból.
(#) ktamas66 válasza sonajkniz hozzászólására (») Okt 9, 2015 /
 
Ha jól gondolom ez a vevő rész, ahol állapotot figyelsz, elvileg nem csúszhat ki a szinkronból. Ez így amíg vár 4 ciklus (a BTFSx két ciklus, mert betesz egy NOP-ot), ha közben IT jön ki tudja mennyi. Ha mondjuk IOC-vel kezeled, akkor is van 3-5 ciklus interrupt latency asszinkron jeleknél, ha nem pont IT alatt jött a jel.
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 9, 2015 /
 
Szia!
Nem kell pollingolni, ha az adó "csomagokban küldi az a 2-3 byte-ot, akkor az első felfutó adatélre megszakítást generál, erre a megszakításra továbbiakban nem figyelsz (letiltod) és elindítod valamelyik timert, most már ez fog megszakítást generálni, és megszakításonként rendre betolod az adatláb bitjeit a regiszterbe. 8 után elmented. Ha lefutott x bit, visszaállítod a start megszakítást.
(#) sonajkniz válasza foxi63 hozzászólására (») Okt 9, 2015 /
 
Szia!
Voltaképpen működik a dolog, bár az zavaró, hogy kizárólag az adásszünetben lévő statikus zörejek miatt.
Az álltalad írt adóprogram felhasználásával működésre tudtam bírni a rádiót. Épp csak 2MHz-hez átszámoltam. Valamint a teszt PIC 18-on fut.
Ilyen lett:
  1. ADATKULDES
  2.     MOVLW   D'128'
  3.     MOVWF   ADAT+2
  4.     MOVFF   ADAT,ADAT+1
  5.     MOVLW   D'24'
  6.     MOVWF   CIKLUS
  7. AK1 RRCF    ADAT
  8.     RRCF    ADAT+1
  9.     RRCF    ADAT+2
  10.     CALL    BITKULDES
  11.     DECFSZ  CIKLUS
  12.     GOTO    AK1
  13.     RETURN
  14. BITKULDES
  15.     BTFSC   STATUS,C
  16.     GOTO    OUTBIT1
  17. OUTBIT0
  18.     NOP
  19.     NOP
  20.     BSF     LATA,5
  21.     MOVLW   D'16'
  22.     DECFSZ  WREG
  23.     GOTO    $-2
  24.     NOP
  25.     BCF     LATA,5
  26.     MOVLW   D'45'
  27.     DECFSZ  WREG
  28.     GOTO    $-2
  29.     NOP
  30.     NOP
  31.     RETURN
  32. OUTBIT1
  33.     BSF     LATA,5
  34.     MOVLW   D'49'
  35.     DECFSZ  WREG
  36.     GOTO    $-2
  37.     NOP
  38.     NOP
  39.     BCF     LATA,5
  40.     MOVLW   D'12'
  41.     DECFSZ  WREG
  42.     GOTO    $-2
  43.     NOP
  44.     RETURN


Próbálkoztam csak idő alapú vétellel, hogy ne ragadhasson be a vétel, ha nem jön jel. De ez nem jött össze. Most úgy működik, hogy az adó kb 15msec-ként indít egy adatot. Szinkront + kétszer ugyanazt a byte-ot. Ez kb 1ms alatt fut le. A vevő, amikor adatot kér, beugrik ADATKERES ciklusba. Mivel ez korántsem az érkező adat eleje, hanem adat + zörej, a végösszehasonlítás nem hoz eredményt. Ezért addig ugrál a ciklus elejére, míg az összehasonlítás jó nem lessz.
Így fest:
  1. MODOSIT
  2.     CALL    ADATKERES
  3.     BTFSS   MB1,0
  4.     GOTO    MODOSIT
  5.     MOVFF   VETEL,KIIRANDO
  6.     BCF     MB1,0
  7.     GOTO    MAIN
  8. ;-------------------------------------------------------------------------------
  9. ADATKERES
  10. AK1 BTFSS   PORTA,0           ;Ha a bejöv? jel magas, indít egy számlálót.
  11.     GOTO    AK1
  12.     MOVLW   D'33'
  13.     DECFSZ  WREG              
  14.     GOTO    $-2
  15.     BTFSS   PORTA,0           ;Ha a számláló lejárt, és a bejöv? jel alacsony
  16.     GOTO    AK1              ;visszaugrik a ciklus elejére
  17.     BTFSC   PORTA,0
  18.     GOTO    $-2
  19.    ;----------                
  20.     MOVLW   D'16'
  21.     MOVWF   CIKLUS            ;Ciklusszámláló feltöltése
  22. AK2 BTFSS   PORTA,0           ;Ha a bejöv? jel magas, indít egy számlálót.
  23.     GOTO    AK2
  24.     MOVLW   D'33'
  25.     DECFSZ  WREG              
  26.     GOTO    $-2
  27.     RRCF    VETEL             ;Eggyel jobbra pörgeti ADAT bitjeit
  28.     RRCF    VETEL+1           ;Eggyel jobbra pörgeti ADAT+1 bitjeit
  29.     BCF     VETEL,7
  30.     BTFSC   PORTA,0           ;Ha a számláló lejárt, és a bejöv? jel magas
  31.     BSF     VETEL,7           ;1-be állítja adat 7. bitjét
  32.     BTFSC   PORTA,0
  33.     GOTO    $-2
  34.     DECFSZ  CIKLUS
  35.     GOTO    AK2               ;Ha a számláló lejárt, kilép a rutinból
  36.     MOVF    VETEL,W
  37.     CPFSEQ  VETEL+1
  38.     GOTO    AK1
  39.     BSF     MB1,0
  40.     RETURN
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 10, 2015 /
 
Szia!
A vevőt milyen PIC fogadja és mi fog még menni róla? Mennyire lesz lefoglalt?
Mert ugye mást is kell csináljon.
Lassan eljutsz oda, hogy kell valamiféle szinkron az adatcsomag elé, és nemsokára lesz egy ellenőrző összeg is a végén...
A hozzászólás módosítva: Okt 10, 2015
(#) sonajkniz válasza foxi63 hozzászólására (») Okt 10, 2015 /
 
Szia!
Elsőre a fiaimnak gyártott elektromos gördeszka távirányítóját akarom lecserélni.
Egy infrás helikopter távosából kioperált joystic potiját , és egy nyomógombot olvas be egy PIK12F1840-es. A vevő ugyanilyen PIC-el, PWM szabályzást és elektromos féket fog működtetni. Már készül az adó oldal.
Egy Kinder tojás kapszulájába építem be.
(#) foxi63 válasza sonajkniz hozzászólására (») Okt 10, 2015 /
 
Nem rossz project, próbáld meg, hogy küldesz 0xaa-t 2x8 bitet ez ugye 10101010 kétszer. Ezután egy tetszőleges (0x55) számot
Amikor a vevő elkezdi venni, még nem tudja, hogy a zavar és hasznos bitek miatt, hogy hol kezdődik egy byte. A vevő pörgeti a beérkező biteket, és ha zavart vesz, az nem lesz 0xAA . Ha már egyszer vesz 0xAA-t még ekkor sincs bitszinkronban, de már biztos, hogy a te adód jelei jönnek. Továbbra is görgeted a biteket,de maximum 16 bitet de most már a 0x55-re vizsgálsz, ha beérkezett, jönnek az adatok.Így működnie kell.
Ha csak nem vagy igen elszánt, akkor tényleg javasolnám az RFM12BS modult, mert mindezt ellátja, nincs zavarjelből adódó egyéb szám, a pufferbe csak hasznos adat kerül, Automatikusan kihangolja az antennát stb. Igaz 1300pénz/db.
Cserébe nem kell molyolni, és garantált a siker. Nekem egy szélmérő adatait tárolta egy ram egy hétig, azt azt nyomta be rádión usb-re és onnan PC-re közel fél év alatt soha nem volt hiba,rádaásul oda-vissza kommunikáltak.
(#) sonajkniz válasza foxi63 hozzászólására (») Okt 10, 2015 /
 
Idézet:
„Ha csak nem vagy igen elszánt, akkor tényleg javasolnám az RFM12BS modult, mert mindezt ellátja, nincs zavarjelből adódó egyéb szám, a pufferbe csak hasznos adat kerül”

Hasznos tanács, de én mindíg elsőre a nehezebb utat választom, mert igaz ugyan, hogy jelentősen többet szívok, de mégtöbbet tanulok. Ha valami helyettem végzi el a munkát, az igen jó, de attól én még nem fogom tudni, mit is csinál voltaképpen. Többek között ezért nem vagyok hajlandó egyenlőre másban programozni, mint asm.-ben.
Következő: »»   5 / 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