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   7 / 32
(#) Bell válasza Hp41C hozzászólására (») Okt 16, 2015 /
 
Akkor egy 32 bites szám egyes Byte-jai így is kiszámolhatóak:
  1. #define szam .84083201
  2. #define f (szam/.65536)
  3. #define a (szam-f*.65536)
  4. #define b0 low(a)
  5. #define b1 high(a)
  6. #define b2 low(f)
  7. #define b3 high(f)
(#) Hp41C válasza Bell hozzászólására (») Okt 16, 2015 /
 
24 bites számokkal nem volt gondom, de 32 bitessel előjött valamiféle számítási hiba. Sajnos nem emlékszem már milyen.
(#) bbalazs_ hozzászólása Okt 16, 2015 /
 
Koszonom, szoval nincs direkt lehetoseg. Csak erdekes, hogy ha dw van...
Bell: "Ha egy kellene" alatt az 1db 32 bites szamot ertettem...
(#) nedudgi válasza bbalazs_ hozzászólására (») Okt 16, 2015 /
 
Ha nem előjeles, akkor lehetne egy makrót írni, ami tetszőleges sorrendben leteszi db/dw direktívákkal.
(#) Bell válasza bbalazs_ hozzászólására (») Okt 16, 2015 /
 
Mint lentebb, a 32 bites számot 4 darab 8 bitesre (b0,.. b3) alakíthatod, amit jól kezel az MPASM.
(#) sonajkniz hozzászólása Okt 18, 2015 /
 
Sziasztok!
Újabb nonszenszbe futottam bele az adó-vevő kapcsán.
Ha a szinkronjel (500 usec) után mindössze egy byteot küldök, és ellenőrzöm, hogy az érkezett-e meg ami kell, több mint 20 méter a hatótáv, stabil kapcsolattal.
Ha három byteot küldök, 5 méter után, a távolság növekedésével egyre többször érkeznek hibás adatok.
Ha már öt byte az adat, a stabil kapcsolat távolsága 1 méter alá esik. Mi okozhatja ezt?
(#) Bell válasza sonajkniz hozzászólására (») Okt 18, 2015 /
 
A konkrét program ismerete nélkül ezt senki sem fogja Neked megmondani.
Pl. primitív protokoll, zavarérzékeny gagyi RF modul, időzítési hibák tömkelege, stb..
Érdemes lenne menet közben az RF modul kimenetét hallhatóvá tenni, szkóppal rámérni.
(#) Hp41C válasza sonajkniz hozzászólására (») Okt 18, 2015 /
 
Szia!
A vevő AGC fokozatát zavarja, hogy az adás egyenszintje nem állandó. Próbáld ki, hogy az adatot Manchester kóddá lalakítva küldöd át. Ebben a kódolásban a DC szint állandó lesz. Esetleg az is megoldása lehet, hogy az egyes adat byte -ok után a negáltjukat küldöd át. Ekkor a DC szint két byte -ra átlagolva lesz állandó.
Egy kis segítség.
A hozzászólás módosítva: Okt 18, 2015
(#) sonajkniz válasza Hp41C hozzászólására (») Okt 18, 2015 /
 
Szia!
Amit a DC szintről írtál, azt értem.
De az adat negát átküldésétől csak az eredő szint lesz állandó. Adás közben végig változik.
A Manchester kódolással viszont az a problémám, hogy nem jöttem rá, hogyan tudnám dekódolni.
(#) Hp41C válasza sonajkniz hozzászólására (») Okt 18, 2015 /
 
Legyen a távitat:
0x55, 0x55, 0x55 , 0xAA, adatbyte1, neg(adatbyte1), adatbyte2, neg(adatbyte2), adatbyte3, neg(adatbyte3), chksum, neg(chksum)
Ekkor minden páros sorszámon kezdődő egymás utáni két byte -os egységre a DC szinit azonos lesz. Az egymást követő 0x55, x055, 0xAA -ról felismerhető a távirat kezdete.
Manchester kódolásra és dekodolásra példa.
A hozzászólás módosítva: Okt 18, 2015
(#) sonajkniz hozzászólása Okt 24, 2015 /
 
Sziasztok!
Segítsséget szeretnék kérni. Elakadtam egy egyszerű timer vezérelt megszakítással.
Egyszerűen nem történik meg a megszakítás.
Inicializálás ide vonatkozó része:
  1. MOVLW   B'01000000'
  2.     MOVWF   INTCON
  3.     MOVLW   B'00000001'
  4.     MOVWF   T1CON
  5.     BSF     PIE1
  6.     BSF     IPR1

A CBLOCK:
  1. CBLOCK  
  2.     KAR_KOD         ; Kiirandó karakter kódja
  3.     KESLELTETES     ; Kiírás id?zít?je
  4.     LEPES           ; Lépésszám kontrol
  5.     VETEL    :   2   ; Kiolvasandó  byte-ja és negátja
  6.     CIKLUS1
  7.     CIKLUS2
  8.     SZAMLALO :   2
  9.     MB1
  10.     ENDC

A megszakítási indítása:
  1. org             0x0000                                         
  2.         nop                                                                    
  3.     GOTO    START
  4.     org     0X0008
  5.     GOTO    MEGSZAKITAS
  6.     nop
  7.         org             0x0028                                         
  8.     nop
  9. START
  10.     CALL    INICIALIZALAS

A megszakítási rutin:
  1. MEGSZAKITAS
  2.     MOVLW   D'56'
  3.     MOVWF   TMR1L
  4.     BCF     PIR1,0
  5.     RRNCF   VETEL
  6.     BTFSC   PORTA,0
  7.     BSF     VETEL,7
  8.     BTFSS   PORTA,0
  9.     BCF     VETEL,7
  10.     BSF     MB1,0
  11.     RETFIE

Az ide vonatkozó programrészlet:
  1. MOVLW   D'63'
  2.     MOVWF   TMR1L
  3.     BCF     PIR1,0
  4.     BSF     INTCON,7
  5.  
  6. BYTE_FOGADAS                  
  7.     BCF     MB1,0
  8.     NOP
  9.     BTFSS   MB1,0   ;Amíg nincs megszakítás, itt kell várjon.
  10.     GOTO    $-2       ;A baj az, hogy nem jön megszakítás.
  11.     DECFSZ  CIKLUS1
  12.     GOTO    BYTE_FOGADAS
  13.     MOVFF   VETEL,POSTINC0
  14.     DECFSZ  CIKLUS2
  15.     GOTO    BYTE_SZINKRON
  16.     GOTO    KILEP
  17. BYTE_SZINKRON
  18.     BCF     INTCON,7
  19.     BTFSS   PORTA,0
  20.     GOTO    $-2
  21.     BTFSC   PORTA,0
  22.     GOTO    $-2
  23.     MOVLW   D'58'
  24.     MOVWF   TMR1L
  25.     BCF     PIR1,0
  26.     BSF     INTCON,7    
  27.     MOVLW   D'8'                
  28.     MOVWF   CIKLUS1
  29.     GOTO    BYTE_FOGADAS
  30. KILEP
  31.     BCF     INTCON,7

Hol hibáztam?
(#) Pali79 válasza sonajkniz hozzászólására (») Okt 24, 2015 /
 
Milyen PIC? A megszakításnál ORG?
(#) sonajkniz válasza Pali79 hozzászólására (») Okt 24, 2015 /
 
PIC18F14K22.
Magas prioritású megszakítás címe 0x0008
Alacsony prioritású megszakítás címe 0x0018
(#) Pali79 válasza sonajkniz hozzászólására (») Okt 24, 2015 /
 
Hát a megszakítás része elég fura nekem. Én tanultam:
  1. org 0x0000
  2. goto Start
  3.  
  4. org 0x0008
  5. ige jön a megszakítási rutin
  6. retfie
  7.  
  8. Start
  9. ide jön  a program eleje


Ha mellékelnéd az egész asm-et, könnyebb lenne segíteni.
A hozzászólás módosítva: Okt 24, 2015
(#) sonajkniz válasza Pali79 hozzászólására (») Okt 24, 2015 /
 
Eddig oké!
De a megszakítási rutin nem lóghat bele az alacsony prioritású megszakítás kezdőcímébe.
Ez most pont ideférne, de így szoktam meg.
Viszont amit csak most vettem észre, hogy az org-nál nagy x-et, írtam. Ez befolyásolhat valamit?
A program többi része nem befolyásolja ezt a részt. Itt kellene bekapcsolódnia a megszakításnak, és a rutin végén letiltásra kerül. Timer1 sincs máshol használva, ahogy PORTA,0 sem.
PORTA,0-ra szorgalmasan érkeznek a jelek, tehát csak azért ragadhat be itt a program, mert timer1 nem vált ki megszakítást. De nem értem, hogy miért?
(#) Pali79 válasza sonajkniz hozzászólására (») Okt 24, 2015 /
 
Nem tudom, hogy befolyásol-e, de nem hinném. A fordító úgyis kiabál ha nem stimmel. Tedd fel az asm-et vagy küld el mélbe, mert így sötétbe tapogatózás csak.
(#) sonajkniz válasza Pali79 hozzászólására (») Okt 24, 2015 /
 
Ez egy kisérlet 1 vezetékes adattovábbításra, kétsoros kijelző számára.
Előszőr kiír egy szöveget, ami a programmemóriában van eltárolva,
majd belép a Jelfigyelés rutinba, és addig ott van, míg nem kap újabb képernyőtartalmat.
  1. ;*-----------------------------------------------------------------------------*
  2. ;*         1-Wire adatúton kapott szöveg kiírása kétsoros kijelz?re            *
  3. ;*                          PIC18F14K22-vel                                    *
  4. ;*  Létrehozva:2015.10.22.                                                     *
  5. ;*-----------------------------------------------------------------------------*
  6.  
  7.         LIST    P=PIC18F14K22                           ; lista megadása
  8.         INCLUDE <P18F14K22.INC>                         ; includde fájlok megadása
  9.         RADIX   hex                                                     ; alapértelmezet számrendszer megadása
  10.  
  11.         CONFIG  FOSC = IRC              ; bels? oszcillátor
  12.         CONFIG  WDTEN = OFF             ; watchdog bekapcsolása
  13.         CONFIG  LVP = OFF                       ; alacsony feszültség? programozás kikapcsolva
  14.     CONFIG  MCLRE = OFF         ; RA3 bemenetkénti használatra állítása
  15.  
  16.     CBLOCK  
  17.     KAR_KOD         ; Kiirandó karakter kódja
  18.     KESLELTETES     ; Kiírás id?zít?je
  19.     LEPES           ; Lépésszám kontrol
  20.     VETEL    :   2   ; Kiolvasandó  byte-ja és negátja
  21.     CIKLUS1
  22.     CIKLUS2
  23.     SZAMLALO :   2
  24.     MB1
  25.     ENDC
  26.  
  27. #define         UTASITAS        BCF     LATA,1
  28. #define         ADAT            BSF     LATA,1
  29. #define         ENABLE          LATA,2
  30.  
  31.  
  32. DELAY   MACRO   SZAMLALO_INDUL
  33.         MOVLW   SZAMLALO_INDUL
  34.         MOVWF   KESLELTETES
  35.         DECFSZ  KESLELTETES
  36.         GOTO    $-2
  37.         ENDM
  38.  
  39.         org             0x0000                                         
  40.         nop                                                                    
  41.     GOTO    START
  42.     org     0x0008
  43.     GOTO    MEGSZAKITAS
  44.     nop
  45.         org             0x0028                                         
  46.     nop
  47. START
  48.     CALL    INICIALIZALAS
  49. ;-------------------------------------------------------------------------------
  50. MAIN
  51.     MOVLW   D'32'
  52.     MOVWF   LEPES
  53.     CLRF    TBLPTRU
  54.     MOVLW   H'10'
  55.     MOVWF   TBLPTRH
  56.     CLRF    TBLPTRL
  57.     CLRF    FSR0H
  58.     MOVLW   D'101'
  59.     MOVWF   FSR0L
  60. ADAT_INDIT
  61.     TBLRD*+
  62.     MOVFF   TABLAT,POSTINC0
  63.     DECFSZ  LEPES
  64.     GOTO    ADAT_INDIT
  65.     CALL    SZOVEG
  66. ;-------------------------------------------------------------------------------
  67. JELFIGYELES
  68.     MOVLW   D'32'                 ;A szakasz elején feltölti a 2-es
  69.     MOVWF   CIKLUS2               ;ciklusszámlálót, az érkező byte-ok számával.
  70.     MOVLW   D'8'                  ;Az 1-es ciklusszámlálót pedig a byte-on
  71.     MOVWF   CIKLUS1               ;belüli bit-ek számával.
  72.     CLRF    FSR0H                 ;Megcímezzük a ramterületet, ahová az érkező
  73.     MOVLW   D'101'                ;byte-okat tárolni fogjuk.
  74.     MOVWF   FSR0L              
  75. SZINKRONJEL                       ;          Második szakasz
  76.     BTFSS   PORTA,0               ;Egy indító jelre vár.
  77.     GOTO    $-2                  
  78.     BTFSC   PORTA,0              
  79.     GOTO    $-2                  
  80.     MOVLW   D'63'                ;Betölt egy értéket tmr1-be, törli a flag
  81.     MOVWF   TMR1L                ;bitet, majd bekapcsolja a megszakítást.
  82.     BCF     PIR1,0
  83.     BSF     INTCON,7
  84.  
  85. BYTE_FOGADAS                  
  86.     BCF     MB1,0
  87.     NOP
  88.     BTFSS   MB1,0   ;Amíg nincs megszakítás, itt kell várjon.
  89.     GOTO    $-2     ;A baj az, hogy nem jön megszakítás.
  90.     DECFSZ  CIKLUS1
  91.     GOTO    BYTE_FOGADAS
  92.     MOVFF   VETEL,POSTINC0
  93.     DECFSZ  CIKLUS2
  94.     GOTO    BYTE_SZINKRON
  95.     GOTO    KILEP
  96. BYTE_SZINKRON
  97.     BCF     INTCON,7
  98.     BTFSS   PORTA,0
  99.     GOTO    $-2
  100.     BTFSC   PORTA,0
  101.     GOTO    $-2
  102.     MOVLW   D'58'
  103.     MOVWF   TMR1L
  104.     BCF     PIR1,0
  105.     BSF     INTCON,7    
  106.     MOVLW   D'8'                
  107.     MOVWF   CIKLUS1
  108.     GOTO    BYTE_FOGADAS
  109. KILEP
  110.     BCF     INTCON,7
  111.     CALL    SZOVEG
  112.     GOTO    JELFIGYELES
  113. ;-------------Szöveg kiolvasása memóriából, és kiírása kijelz?re----------------
  114. SZOVEG
  115.     MOVLW   D'16'              ;
  116.     ADDWF   LEPES              ;
  117.     UTASITAS                   ;------------------------------------------------
  118.         MOVLW   B'00000001'        ;
  119.     CALL    KIIRAS             ; Ez a rutin átkapcsolja a kijelz?t utasítás
  120.     DELAY   D'250'             ;fogadására. Ezt követ?en törli a kijelz?t, majd
  121.     DELAY   D'250'             ;rövid kivárás után beállítja a fels? sor kezd?-
  122.         MOVLW   B'10000000'        ;címét, ezután visszaálítja adatfogadásra.
  123.     CALL    KIIRAS             ;
  124.     ADAT                       ;------------------------------------------------
  125.     CLRF    FSR0H
  126.     MOVLW   D'101'
  127.     MOVWF   FSR0L
  128. VERS1                          ;------------------------------------------------
  129.     MOVF    POSTINC0,W
  130.     CALL    KIIRAS
  131.     DECFSZ  LEPES
  132.     GOTO    VERS1
  133.     MOVLW   D'16'              ;
  134.     ADDWF   LEPES              ;
  135.     UTASITAS                   ;(Egy szövegmez? hossza a memóriában 32 byte)
  136.         MOVLW   B'11000000'        ; Ezután beállítjuk az alsó sor kezd?címét.
  137.     CALL    KIIRAS             ;
  138.     ADAT                       ;------------------------------------------------
  139. VERS2                          ;------------------------------------------------
  140.     MOVF    POSTINC0,W
  141.     CALL    KIIRAS
  142.     DECFSZ  LEPES
  143.     GOTO    VERS2
  144.     RETURN
  145. ;------------------------------INICIALIZALAS------------------------------------
  146. INICIALIZALAS
  147.         CLRF    LATA                                            ; kimeneti portok törlése
  148.         CLRF    LATB                                            ;
  149.         CLRF    LATC                                            ;
  150.         MOVLW   B'00000000'                                     ; bemenetek 1=analóg  0=digitális
  151.         MOVWF   ANSEL
  152.         MOVLW   B'00000000'                                     ; bemenetek 1=analóg  0=digitális
  153.         MOVWF   ANSELH                                          ;
  154.         MOVLW   B'00000001'                                     ; A port
  155.         MOVWF   TRISA
  156.         MOVLW   B'00000000'                                     ; B port kimenet
  157.         MOVWF   TRISB
  158.         MOVLW   B'00000111'                                     ; C port kimenet
  159.         MOVWF   TRISC
  160.         MOVLW   B'01000010'                                     ; oszcillátor frekvenciája <4:6>
  161.         MOVWF   OSCCON                                          ; 2 MHz
  162.         MOVLW   B'01000000'
  163.     MOVWF   INTCON
  164.     MOVLW   B'00000001'
  165.     MOVWF   T1CON
  166.     BSF     PIE1
  167.     BSF     IPR1
  168. ;---------------------------------------------------------------------------*
  169. LCD ;kijelz? inicializálása
  170.     BCF     ENABLE              ;Beírás tiltása
  171.     BSF     LATC,3
  172.     DELAY   D'250'
  173.     DELAY   D'250'
  174.     DELAY   D'250'
  175.     DELAY   D'250'
  176.     DELAY   D'250'
  177.     DELAY   D'250'
  178.     DELAY   D'250'
  179.     DELAY   D'250'
  180.     UTASITAS             ;Beállítjuk a kijelz? R/S bemenetét utasítás fogadására
  181.         MOVLW   B'00110000'        ;Ez az utasítás 4x végrehajtva reseteli az LCD-t
  182.     CALL    KIIRAS0
  183.     CALL    KIIRAS0
  184.     CALL    KIIRAS0
  185.     CALL    KIIRAS0
  186.     DELAY   D'250'             ;Némi kivárás után be kell állítani a kijelz?t.
  187.         MOVLW   B'00100000'
  188.     CALL    KIIRAS0            ;Itt kapcsolunk át 4 bites üzemmódra
  189.         MOVLW   B'00101000'       ;Már 4 bites módban beállítjuk a
  190.     CALL    KIIRAS            ; kijelz?t kétsorsa
  191.         MOVLW   B'00001100'       ;Kijelz? engedélyezése
  192.     CALL    KIIRAS
  193.     RETURN
  194. ;-------------------------------------------------------------------------------
  195. KIIRAS
  196.  
  197.     MOVWF   KAR_KOD            ;Wreg áttöltése KAR_KOD-ba
  198.     MOVFF   KAR_KOD,LATB       ;KAR_KOD LATB-be töltése(Csak a fels? 4 bit)
  199.     DELAY   D'2'               ;El? várakozás
  200.     BSF     ENABLE             ;Beírás indul
  201.     DELAY   D'4'               ;Kivárás
  202.     BCF     ENABLE             ;Beírás vége
  203.     SWAPF   KAR_KOD            ;Megcseréli KAR_KOD els? és második 4-4 bitjét
  204.     MOVFF   KAR_KOD,LATB       ;KAR_KOD LATB-be töltése(Csak a fels? 4 bit)
  205.     DELAY   D'2'               ;El? várakozás
  206.     BSF     ENABLE             ;Beírás indul
  207.     DELAY   D'4'               ;Kivárás
  208.     BCF     ENABLE             ;Beírás vége
  209.     RETURN
  210. KIIRAS0                        ;Kijelz? reszetelésekor  használatos
  211.     MOVWF   LATB               ;Karakter b-be töltése
  212.     DELAY   D'2'               ;El? várakozás
  213.     BSF     ENABLE             ;Beírás indul
  214.     DELAY   D'4'               ;Kivárás
  215.     BCF     ENABLE             ;Beírás vége
  216.     RETURN
  217. ;-------------------------------------------------------------------------------
  218. MEGSZAKITAS
  219.     MOVLW   D'56'
  220.     MOVWF   TMR1L
  221.     BCF     PIR1,0
  222.     RRNCF   VETEL
  223.     BTFSC   PORTA,0
  224.     BSF     VETEL,7
  225.     BTFSS   PORTA,0
  226.     BCF     VETEL,7
  227.     BSF     MB1,0
  228.     RETFIE
  229. ;-------------------------------------------------------------------------------
  230.     org     0x1000
  231.     DB "    Kijelzo         kiserlet!   "
  232. ;-------------------------------------------------------------------------------
  233.     END
(#) Pali79 válasza sonajkniz hozzászólására (») Okt 24, 2015 /
 
Ez így le sem fordul.... Az itteni 166, 167 sorból hiányzik, hogy melyik bitet szeretnéd állítani.
(#) ktamas66 válasza sonajkniz hozzászólására (») Okt 24, 2015 /
 
A 166, 177 sornál nálam jelezne, hiányzik a 0.
(#) sonajkniz válasza ktamas66 hozzászólására (») Okt 24, 2015 /
 
Jogos!
Ez pár perce még így nézett ki:
  1. MOVLW   B'01000000'
  2.     MOVWF   INTCON
  3.     MOVLW   B'00000001'
  4.     MOVWF   T1CON
  5.     MOVLW   B'00000001'
  6.     MOVWF   PIE1
  7.     MOVLW   B'00000001'
  8.     MOVWF   IPR1

CSak közben is próbálkozok mindennel.
(#) Pali79 válasza sonajkniz hozzászólására (») Okt 24, 2015 /
 
Akkor is kelle a Timer1 megszakítás, ha a PORTA,0 még nem jött jel?
(#) cross51 válasza sonajkniz hozzászólására (») Okt 24, 2015 /
 
Én leszimuláltam és az INTCON, GIE piszkálása volt a baj kiszedtem akkor a szimulátor is generált megszakítást, amíg bent volt a BCF INTCON, GIE .. BSF INTCON, GIE addig nem.
(#) Pali79 válasza cross51 hozzászólására (») Okt 24, 2015 /
 
Nekem az a fura, hogy a Timer1 már a program elején indítva van, de a megszakítás engedélyezése, csak jóval később, miután PORTA,0-nál már bejött egy jel. Addig csak megy magában, viszont ha azon túlmegy akkor egyből megszakításba megy mert a flag bit már rég 1-ben van.
Ha a 162,163 sorba ezt írom:
  1. movlw b'11000000'
  2. movwf INTCON

Egyből van Timer1 megszakítás.
A hozzászólás módosítva: Okt 24, 2015
(#) sonajkniz válasza Pali79 hozzászólására (») Okt 24, 2015 /
 
Pont az a lényeg, hogy csak akkor legyen megszakítás, ha már az indítójel bejött. A flagbitet pedig még az előtt törlöm, hogy a megszakítást bekapcsolnám. Megpróbáltam már fordítva is, hogy a megszakítás folyamatosan legyen aktív, és timer1-et tiltom. De úgy sem működik. Miért?
(#) Pali79 válasza sonajkniz hozzászólására (») Okt 24, 2015 / 1
 
Értem. Szimulátorban ez így pedig működik, viszont ha ez az elképzelés, akkor nem csak a TMR1L-et kellene feltölteni egy értékkel, mert az Isten tudja, hogy a TMR1H mennyi lesz, mire bejön az első jel.
(#) sonajkniz válasza Pali79 hozzászólására (») Okt 24, 2015 /
 
Lehet, hogy rávezettél a hibára!
Én ugyanis timer 1-et 8 bites módban akartam üzemeltetni. Így aztán várhatom a megszakítást. Holnap lepróbálom timer2-vel. Majd megírom az eredményt.
(#) Pali79 válasza sonajkniz hozzászólására (») Okt 24, 2015 /
 
Amikor a TMR1L-t feltöltöd, töltsd fel a TMR1H-t b'11111111'-val és akkor csak az alsónak kell elszámolnia 255-ig a megszakításhoz. De csinálhatod TIMER0-val is, az csak 8 bites alapból.
Ha pontos megszakításokat akarsz akkor ez jól jöhet: Bővebben: Link
A hozzászólás módosítva: Okt 24, 2015
(#) sonajkniz válasza Pali79 hozzászólására (») Okt 25, 2015 /
 
Szia!
Timer2-vel hibátlan.
Ráadásul még egyszerűbb is, mert nem kell értékkel feltölteni, mivel PR2-vel meghatározható, hogy meddig számoljon.
Most így néz ki:
  1. MOVLW   B'01000010'                                     ; oszcillátor frekvenciája <4:6>
  2.         MOVWF   OSCCON                                          ; 2 MHz
  3.     CLRF    T2CON
  4.     BSF     IPR1,1
  5.     BSF     PIE1,1
  6.     BCF     PIR1,1
  7.     MOVLW   D'197'
  8.     MOVWF   PR2
  9.         MOVLW   B'11000000'
  10.     MOVWF   INTCON

  1. MEGSZAKITAS
  2.     BCF     PIR1,1
  3.     RRNCF   VETEL
  4.     BTFSC   PORTA,0
  5.     BSF     VETEL,7
  6.     BTFSS   PORTA,0
  7.     BCF     VETEL,7
  8.     BSF     MB1,0
  9.     RETFIE

  1. JELFIGYELES
  2.     MOVLW   D'32'                 ;A szakasz elején feltölti a 2-es
  3.     MOVWF   CIKLUS2               ;ciklusszámlálót, az érkező byte-ok számával.
  4.     MOVLW   D'8'                  ;Az 1-es ciklusszámlálót pedig a byte-on
  5.     MOVWF   CIKLUS1               ;belüli bit-ek számával.
  6.     CLRF    FSR0H                 ;Megcímezzük a ramterületet, ahová az érkező
  7.     MOVLW   D'101'                ;byte-okat tárolni fogjuk.
  8.     MOVWF   FSR0L              
  9. SZINKRONJEL                       ;          Második szakasz
  10.     BTFSS   PORTA,0               ;Egy indító jelre vár.
  11.     GOTO    $-2                  
  12.     BTFSC   PORTA,0              
  13.     GOTO    $-2                  
  14.     BSF     T2CON,2
  15.     CLRF    TMR2
  16.     BCF     PIR1,1
  17. BYTE_FOGADAS                  
  18.     BCF     MB1,0
  19.     NOP
  20.     BTFSS   MB1,0   ;Amíg nincs megszakítás, itt kell várjon.
  21.     GOTO    $-2    
  22.     DECFSZ  CIKLUS1
  23.     GOTO    BYTE_FOGADAS
  24.     MOVFF   VETEL,POSTINC0
  25.     DECFSZ  CIKLUS2
  26.     GOTO    BYTE_SZINKRON
  27.     GOTO    KILEP
  28. BYTE_SZINKRON
  29.     BCF     T2CON,2
  30.     BTFSS   PORTA,0
  31.     GOTO    $-2
  32.     BTFSC   PORTA,0
  33.     GOTO    $-2
  34.     BSF     T2CON,2
  35.     CLRF    TMR2    
  36.     MOVLW   D'8'                
  37.     MOVWF   CIKLUS1
  38.     GOTO    BYTE_FOGADAS
  39. KILEP
  40.     BCF     T2CON,2
  41.     CALL    SZOVEG
  42.     GOTO    JELFIGYELES

Ráadásul elég komoly szórást is elvisel.
PR2 értéke 191-202-ig állítható. Tehát 197-re állítva +-2,5%-os frekvenciaszórást elvisel.
Köszi mindenkinek a segítsséget!
(#) hapci válasza Hp41C hozzászólására (») Okt 29, 2015 /
 
Idézet:
„Nem segít a bádogtető lejtésének emelése, ha jó nagy lyuk van rajta.”

Ilyen szép, szemléletes műszaki hasonlatot nem hallottam az elmúlt félszáz évben... (Esetleg az "Eccerű, mint a faék" fogható hozzá.)
(#) sonajkniz hozzászólása Nov 10, 2015 /
 
Sziasztok!

Kérlek, segítssetek!
Adott egy PIC18F46K22-es microcontroller.
Az a problémám vele, hogy a D port bemenetnek konfigurált lábai valamiért nem érzékelik a magas szintet. Az A, a B, és a D port egy része bemenet. Fizikailag ugyan úgy vannak felépítve. Közvetlen a PIC lábain mérve, ha egy bemenet sem aktív, a felhúzóellenállások által mérhető a tápfeszültség. Ha egy bemenet aktív, 0V van a lábon. Ehhez képest ha D port megfelelő lábait lekérdezem, mindegy mi van rajtuk, alacsony szintet mutatnak.
Ezek a beállítások:
  1. LIST    P=PIC18F46K22                           ; lista megad??sa
  2.         INCLUDE <P18F46K22.INC>                         ; includde f??jlok megad??sa
  3.         RADIX   hex                                                     ; alap?©rtelmezet sz??mrendszer megad??sa
  4.  
  5.         CONFIG  FOSC = INTIO67          ; bels? oszcill??tor
  6.         CONFIG  WDTEN = OFF             ; watchdog bekapcsol??sa
  7.         CONFIG  LVP = OFF                       ; alacsony fesz??lts?©g? programoz??s kikapcsolva
  8.     CONFIG  MCLRE = EXTMCLR     ; RA3 bemenetk?©nti haszn??latra ??ll?­t??sa
  9.     CONFIG  PBADEN = OFF

  1. INICIALIZALAS
  2.         CLRF    LATA                                            ; kimeneti portok törlése
  3.         CLRF    LATB                                            ;
  4.         CLRF    LATC                                            ;
  5.     CLRF    LATD
  6.     CLRF    LATE
  7.         MOVLW   B'00000011'
  8.     MOVWF   ANSELA
  9.         MOVLW   B'00111000'                                     ; A port
  10.         MOVWF   TRISA
  11.         MOVLW   B'00111100'                                     ; B port
  12.         MOVWF   TRISB
  13.     CLRF    WPUB
  14.         MOVLW   B'00000000'                                     ; C port
  15.         MOVWF   TRISC
  16.         MOVLW   B'00011111'                                     ; D port
  17.         MOVWF   TRISD
  18.     CLRF    ANSELD
  19.         MOVLW   B'00001000'                                     ; E port
  20.         MOVWF   TRISE
  21.         MOVLW   B'01010010'                                     ; oszcillátor frekvenciája <4:6>
  22.         MOVWF   OSCCON
  23.         MOVLW   B'10000111'                                     ; timer 0 beállítása, el?osztó <2:0>
  24.         MOVWF   T0CON

Mi nem jó?
A hozzászólás módosítva: Nov 10, 2015
Következő: »»   7 / 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