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   31 / 32
(#) sonajkniz hozzászólása Feb 22, 2024 /
 
Sziasztok!

Egy anomália megfejtésében kérem a segítségeteket.
Számítógépre szeretnék adatokat küldeni egyszerű terminál felületre.
Megírtam egy tesztprogramot, de részleges a működése.
Uarton adok-veszek egy CH340-esen keresztül.
Két féle terminál programmal is próbálkoztam, az eredmény mindig ugyan az.
Az OK parancsot küldöm, amire a válasz az lenne, hogy "ITT VAGYOK"
Helyette ezt kapom "ITVGOK"
Mellékelem a programot:
  1. MAIN
  2.     BTFSS   PIR1,RCIF
  3.     GOTO    $-2
  4.     MOVF    RCREG,W
  5.     SUBLW   "O"
  6.     BNZ     MAIN
  7.     BTFSS   PIR1,RCIF
  8.     GOTO    $-2
  9.     MOVF    RCREG,W
  10.     SUBLW   "K"
  11.     BNZ     MAIN
  12.     ;--------------
  13.     MOVLW   "I"
  14.     MOVWF   TXREG
  15.     BTFSS   PIR1,TXIF
  16.     GOTO    $-2
  17.     MOVLW   "T"
  18.     MOVWF   TXREG
  19.     BTFSS   PIR1,TXIF
  20.     GOTO    $-2
  21.     MOVLW   "T"
  22.     MOVWF   TXREG
  23.     BTFSS   PIR1,TXIF
  24.     GOTO    $-2
  25.     MOVLW   " "
  26.     MOVWF   TXREG
  27.     BTFSS   PIR1,TXIF
  28.     GOTO    $-2
  29.     MOVLW   "V"
  30.     MOVWF   TXREG
  31.     BTFSS   PIR1,TXIF
  32.     GOTO    $-2
  33.     MOVLW   "A"
  34.     MOVWF   TXREG
  35.     BTFSS   PIR1,TXIF
  36.     GOTO    $-2
  37.     MOVLW   "G"
  38.     MOVWF   TXREG
  39.     BTFSS   PIR1,TXIF
  40.     GOTO    $-2
  41.     MOVLW   "Y"
  42.     MOVWF   TXREG
  43.     BTFSS   PIR1,TXIF
  44.     GOTO    $-2
  45.     MOVLW   "O"
  46.     MOVWF   TXREG
  47.     BTFSS   PIR1,TXIF
  48.     GOTO    $-2
  49.     MOVLW   "K"
  50.     MOVWF   TXREG
  51.     GOTO    MAIN
(#) helektro válasza sonajkniz hozzászólására (») Feb 22, 2024 /
 
Az biztos hiba, hogy sehol nem törlöd a megszakítás jelzés bitet (TXIF, RXIF). Azt minden TXREG írás előtt, ill. RCREG olvasás előtt törölni kellene.
(#) pipi válasza sonajkniz hozzászólására (») Feb 22, 2024 /
 
Ne a txif-et nézd, hanem a megfelelő soros vez. regiszter bitet. Meg nézd meg az erratát, mert pic24valamiben futottam bele, hogy dokumentáltan rossz az egyik vezérlőbit
UTXBF /* wait if the buffer is full, not working correctly!!!!*/
TRMT jó
https://www.mouser.com/datasheet/2/268/80522c-19131.pdf
Module: UART (TX Buffer)
If the transmit buffer is filled sequentially with
four characters, the characters may not be
transmitted in the correct order.
Work around
Do not completely fill the buffer before transmitting data; send three characters or less at a
time.
Affected Silicon Revisions
5. Module: UART (Transmit)
The Transmit Buffer Full flag, UTXBF
(UxSTA<9>), may become cleared before data
starts moving out of the full buffer. If the flag is
used to determine when data can be written to
the buffer, new data may not be accepted and
data may not be transmitted.
Work around
Poll the Transmit Buffer Empty flag (TRMT,
UxSTA<8>) to determine when the transmit
buffer is empty and can be written to.
(#) sonajkniz válasza helektro hozzászólására (») Feb 22, 2024 /
 
Próbáltam úgy is. Semmi változás.
Az adatlap szerint amúgy a jelzőbitek maguktól törlődnek. Az RXIF akkor, ha új adatot írok bele, a TXIF pedig akkor, amikor kiolvasom.
Végül úgy sikerült eredményt elérnem, hogy kiszámoltam az átviteli időt, arra még rátettem egy picit, és két adás közt ennyit késleltetek.
Csakhogy ez nem a megoldása, hanem a megkerülése a problémának. Így nem vagyok előrébb, mintha szoftveresen csinálnám meg az uartot.
(#) pipi válasza sonajkniz hozzászólására (») Feb 22, 2024 /
 
Itt én más sorrendet látok a teszt és a regiszterbe írás, meg a goto $-1
http://teachers.cm.ihu.gr/kalomiros/Mtptx/Lectures/Lecture_Embedded..._4.pdf
inkább cimkézd meg a goto-t akkor nem téved

  1. send btfss PIR1,TXIF ; wait for TXIF to become '1'
  2.      goto $-1 ; before TXREG is loaded
  3.      movwf TXREG
  4.      return

De én továbbra sem a txif-et használnám
(#) sonajkniz válasza pipi hozzászólására (») Feb 22, 2024 /
 
Bocsánat, az elfelejtettem leírni, hogy a kérdéses PIC 18-as szériájú, azért kell 2-őt visszalépni a GOTO-val. Amúgy tényleg jó ötlet külön rutinba tenni.
(#) Hp41C válasza sonajkniz hozzászólására (») Feb 22, 2024 / 1
 
A TXIF törlése két utasítás végrehajtásnyi idővel késik a beíráshoz képest. A PIC UART-jának van egy 1 byte-os puffere. Ha beírtad az I-t, enegedi beírni az első T -t is, a TXIF nem változik. A következő T beírásáig nem törlődik a TXIF.
Bufferelt vételt és adést javaslok, ezzel az adás alatt beérkező adatokat is fel lehet dolgozni.
(#) majkimester válasza sonajkniz hozzászólására (») Feb 22, 2024 /
 
Én ugyanígy TXIF-re várva küldtem adatot, eddig mindig működött, szerintem nem ott van a hiba:

  1. RS232_SendByte
  2. RS232_waittx    btfss   PIR1, TXIF              ; wait for empty buffer
  3.                 goto    RS232_waittx
  4.                 movwf   TXREG
  5.                 return


Milyen PIC, milyen órajelet használsz és hogyan néz ki az inicializálás?
Szerintem azért nem kapod meg minden második byteot, mert a PC UART framing error miatt eldobja. Ugyanúgy neked is le kell majd kezelned a végleges programban fogadáskor ezeket az eseteket:

  1. RS232_ReceiveByte
  2.                 btfss   PIR1, RCIF
  3.                 goto    RS232_norec
  4.                 movlw   ((1 << OERR) | (1 << FERR))     ; serial receive error
  5.                 andwf   RCSTA,w
  6.                 jz      RS232_rb_no_error
  7.                 movf    RCREG,w                         ; read received byte twice for deletion
  8.                 movf    RCREG,w
  9.                 btfsc   RCSTA, OERR                     ; if OERR
  10.                 bcf     RCSTA, CREN                     ;    - clear CREN and
  11.                 bsf     RCSTA, CREN                     ;    - and set again.
  12. RS232_norec     clrw
  13.                 clrz                                    ; Z=0 -> error or not received
  14.                 return
  15.  
  16. RS232_rb_no_error
  17.                 movf    RCREG,w
  18.                 setz                                    ; Z=1 -> ok
  19.                 return
(#) majkimester válasza Hp41C hozzászólására (») Feb 22, 2024 /
 
A "I" közvetlen bekerül a Transmit Shift Register-be, amiből az adás megy, a "T" meg a TXREG-be ami az 1 byte buffer, de utánna már várni kell a második "T" beirása előtt, ez normális.
A TXIF flag akkor lesz beállítva amikor a TXREG átkerül a TSR-be, ekkor még megy az adás, de van bőven idő betölteni a következő byte-ot a TXREG-be.

Amit irsz viszont igaz:
Idézet:
„TXIF becomes valid in the second instruction cycle following the write execution. Polling TXIF immediately following the TXREG write will return invalid results.”


Szóval nálam azért működik, mert nálam van pluszban call + return
(#) zenetom válasza sonajkniz hozzászólására (») Feb 24, 2024 /
 
Szia!
Amíg nem írod le a PIC pontos típusát, nem biztos hogy tudunk érdemben segíteni.
Viszont 2 hatalmas hibát látok.
Ez életveszélyes, lehetőleg soha ne használj ilyet:
  1. GOTO    $-2


És ami szerintem magát a hibát okozza, hogy nem jó flag-et nézel. A TXIF erre nem jó. Én a TXSTA, TRMT bitét javaslom.
Mivel a küldés részig eljut, ezért a fogadásnál nem akad el.

A küldés részt alakítsd át pl. erre:
  1. MOVLW "I"
  2. CALL PROC_SEND_UART1
  3. MOVLW "T"
  4. CALL PROC_SEND_UART1
  5. MOVLW "T"
  6. CALL PROC_SEND_UART1
  7. MOVLW " "
  8. CALL PROC_SEND_UART1
  9. MOVLW "V"
  10. CALL PROC_SEND_UART1
  11. MOVLW "A"
  12. CALL PROC_SEND_UART1
  13. MOVLW "G"
  14. CALL PROC_SEND_UART1
  15. MOVLW "Y"
  16. CALL PROC_SEND_UART1
  17. MOVLW "O"
  18. CALL PROC_SEND_UART1
  19. MOVLW "K"
  20. CALL PROC_SEND_UART1
  21.  
  22. GOTO MAIN
  23.  
  24. PROC_SEND_UART1
  25.         MOVWF TXREG1
  26. PROC_SEND_UART11
  27.         BTFSS TXSTA1,TRMT
  28.         GOTO PROC_SEND_UART11
  29.         RETURN


Ez saját kód, nálam már évek óta bevált.
(#) sonajkniz válasza zenetom hozzászólására (») Feb 24, 2024 /
 
Habár az időzítés most megoldotta, de a későbbiekben jobb módszer kell, mindenképp ki fogom próbálni.
Mindenkinek köszönöm a segítséget.
(#) majkimester válasza zenetom hozzászólására (») Feb 24, 2024 /
 
A TRMT akkor vált, amikor a shift regiszter (TSR) is kiürült, ez jó arra, hogy például RS485-nél az adatirányt visszaváltsd, és a példádban is jó, amikor nem csinál mást a kontroller, de ha a TXIF helyett használod, akkor pont az 1 byteos bufferelést hagyod ki, ez elég mezítlábas megoldás.

Ha a TXIF-et használod, akkor van 1 byte kiküldésének megfelelő időd, hogy újra feltöltsd a TXREG-et. A delux megoldás pedig, ha ezt valójában egy IT-ből egy ring bufferből teszed. A küldés ekkor annyi, hogy feltöltöd a ring buffered és elindítod az adást, az IT pedig mindig feltölti a TXREG-et, amikor az kiürül. A főprogram meg bármi mást csinálhat az egész adás alatt.
A hozzászólás módosítva: Feb 24, 2024
(#) zenetom válasza majkimester hozzászólására (») Feb 24, 2024 /
 
Igen, ez így van.
De ehhez kell megszakításkezelés is.
Szerintem a kérdező által bemásolt kódban a TXIF flag pollingozása azért nem jó, mert ott a kód még azelőtt betölti a TXREG-be a kiküldendő adatot, hogy az előző átkerült volna a TSR-be.
Szóval "ráfutás" történt.
(#) sonajkniz hozzászólása Márc 19, 2024 /
 
Sziasztok!

Egy anomália megfejtésében kérném a segítségeteket.
Az itt bemutatott PIC boardom számára írtam egy bővítményt a bootloader alá. Ez a bootloaderrel együtt kerül feltöltésre és a programmemória legvégén, közvetlen a bootloader előtt kapott helyet.
Tartozik hozzá egy makro gyűjtemény, amit a készülő programba lehet behívni. Nélküle nem is lehet meghívni. 24 btes előjeles számok matematikai műveleteit végzi. Kivonás, összeadás, szorzás, osztás, valamint linearizálás. A mellékelt képek tanúsága szerint szimulátorban futtatva minden számítás végeredménye jó. Ellenben a PIC a linearizáció végeredményét elhibázza.
Több PIC-re is feltöltöttem, mind ugyanazt a hibát véti.
Mi lehet ennek az oka?
(#) sonajkniz válasza sonajkniz hozzászólására (») Márc 19, 2024 /
 
Több külömböző variációban is lefuttattam mind szimulátorban, mind PIC-en a linearizációt.
Változtattam a tartomány értékeket, a bejövő értéket. Minden tesztben a szimulátor helyes eredményt adott, a PIC viszont konzekvensen 1-el kevesebet írt a H byte-ba.
Ezt nem úgy teszi, hogy a 0-ás bit mindíg 0, ami utalhatna ramhibára, hanem akár 6 helyére 5-öt ír. Azaz a H byteból valamiért mindíg levon 1-et.
(#) majkimester válasza sonajkniz hozzászólására (») Márc 19, 2024 /
 
Esetleg ha a LIN macro belsejét is láthatnánk ...
(#) sonajkniz válasza majkimester hozzászólására (») Márc 19, 2024 /
 
Magával a makróval nem sokra lehet rálátni, az egész pedig elég hosszú, de feltöltöm.
  1. LIN MACRO   X_MIN,X_MAX,Y_MIN,Y_MAX,X_ERTEK,Y_ERTEK
  2.     MOVFF   X_MIN,0x1F6
  3.     MOVFF   X_MIN+1,0x1F7
  4.     MOVFF   X_MIN+2,0x1F8
  5.     MOVFF   X_MAX,0x1F9
  6.     MOVFF   X_MAX+1,0x1FA
  7.     MOVFF   X_MAX+2,0x1FB
  8.     MOVFF   Y_MIN,0x1EC
  9.     MOVFF   Y_MIN+1,0x1ED
  10.     MOVFF   Y_MIN+2,0x1EE
  11.     MOVFF   Y_MAX,0x1E3
  12.     MOVFF   Y_MAX+1,0x1E4
  13.     MOVFF   Y_MAX+2,0x1E5
  14.     MOVFF   X_ERTEK,0x1E0
  15.     MOVFF   X_ERTEK+1,0x1E1
  16.     MOVFF   X_ERTEK+2,0x1E2
  17.     CALL    0x3C20
  18.     MOVFF   0x1E6,Y_ERTEK
  19.     MOVFF   0x1E7,Y_ERTEK+1
  20.     MOVFF   0x1E8,Y_ERTEK+2
  21.     ENDM

Ez pedig maga a linearizáció:
  1. ;---------------------------------Linearizálás----------------------------------     
  2.     org 0x3C20
  3.     ;Linearizálás képlete:
  4.     ;Y=(Xe*Y0):X0+Ymin
  5.     ;Ahol:
  6.     ;X0=Xmax-Xmin (Számítás során Xmax változó lesz X0, azaz az osztó.)
  7.     ;Y0=Ymax-Ymin (Számítás során Ymax változó lesz Y0, azaz a szorzó)
  8.     ;Xe=X-Xmin    (Számítás során X változó lesz Xe, azaz a szorzandó
  9.     ;Xe*Y0=Szorzat(osztandó)
  10.     ;Osztandó:X0=Eredmény (Eredmény osztandóban jelenik meg)
  11.     ;Eredmény+Ymin (Számítás során az eredmény osztandó helyére kerül.
  12.    
  13.     ;Szorzandó 0x1E0, 0x1E1, 0x1E2
  14.     ;Szorzó 0x1E3, 0x1E4, 0x1E5
  15.     ;Szorzat/osztandó 0x1E6, 0x1E7, 0x1E8, 0x1E9, 0x1EA, 0x1EB
  16.     ;Osztó 0x1EC, 0x1ED, 0x1EE (fels? 3 byte értéke 0)
  17.     ;Maradék 0x1F0, 0x1F1, 0x1F2, 0x1F3, 0x1F4 0x1F5
  18. LINEARIZALAS
  19.     MOVLB   0x1
  20.     MOVF    0x1EC,W ;Y_MIN   \
  21.     SUBWF   0x1E3,F ;Y_MAX    |
  22.     MOVF    0x1ED,W ;Y_MIN+1  |Számítás során Ymax változó lesz Y0,
  23.     SUBWFB  0x1E4,F ;Y_MAX+1  | azaz a szorzó.
  24.     MOVF    0x1EE,W ;Y_MIN+2  |
  25.     SUBWFB  0x1E5,F ;Y_MAX+2 /
  26.     MOVF    0x1F6,W ;X_MIN   \
  27.     SUBWF   0x1F9,F ;X_MAX    |
  28.     MOVF    0x1F7,W ;X_MIN+1  |Számítás során Xmax változó lesz X0,
  29.     SUBWFB  0x1FA,F ;X_MAX+1  | azaz az osztó.
  30.     MOVF    0x1F8,W ;X_MIN+2  |
  31.     SUBWFB  0x1FB,F ;X_MAX+2 /    
  32.     MOVF    0x1F6,W ;X_MIN   \
  33.     SUBWF   0x1E0,F ;X        |
  34.     MOVF    0x1F7,W ;X_MIN+1  |Számítás során X változó lesz Xe,
  35.     SUBWFB  0x1E1,F ;X+1      | azaz a szorzandó.
  36.     MOVF    0x1F8,W ;X_MIN+2  |
  37.     SUBWFB  0x1E2,F ;X+2     /    
  38. SZORZAS_1
  39.     MOVLB   0x1
  40.     CLRF    0x1E9
  41.     CLRF    0x1EA
  42.     BCF     0x1FF,0
  43.     BCF     0x1FF,1
  44.     BTFSS   0x1E2,7
  45.     GOTO    SZORZAS_2
  46.     COMF    0x1E0
  47.     COMF    0x1E1
  48.     COMF    0x1E2
  49.     INCF    0x1E0
  50.     CLRF    WREG
  51.     ADDWFC  0x1E1
  52.     ADDWFC  0x1E2
  53.     BSF     0x1FF,0
  54. SZORZAS_2    
  55.     BTFSS   0x1E5,7
  56.     GOTO    SZORZAS_3
  57.     COMF    0x1E3
  58.     COMF    0x1E4
  59.     COMF    0x1E5
  60.     INCF    0x1E3
  61.     CLRF    WREG
  62.     ADDWFC  0x1E4
  63.     ADDWFC  0x1E5
  64.     BTG     0x1FF,0    
  65. SZORZAS_3    
  66.     CLRF    0x1E6                        
  67.     CLRF    0x1E7
  68.     CLRF    0x1E8
  69.     CLRF    0x1E9                        
  70.     CLRF    0x1EA
  71.     CLRF    0x1EB
  72.     MOVF    0x1E0,W            
  73.     MULWF   0x1E3          
  74.     MOVFF   PRODL,0x1E6
  75.     MOVFF   PRODH,0x1E7
  76.     MOVF    0x1E0,W
  77.     MULWF   0x1E4
  78.     MOVF    PRODL,W
  79.     ADDWF   0x1E7
  80.     MOVF    PRODH,W
  81.     ADDWFC  0x1E8
  82.     MOVF    0x1E0,W
  83.     MULWF   0x1E5
  84.     MOVF    PRODL,W
  85.     ADDWF   0x1E8
  86.     MOVF    PRODH,W
  87.     ADDWFC  0x1E9
  88.     MOVF    0x1E1,W
  89.     MULWF   0x1E3
  90.     MOVF    PRODL,W
  91.     ADDWF   0x1E7    
  92.     MOVF    PRODH,W
  93.     ADDWFC  0x1E8
  94.     CLRF    WREG
  95.     ADDWFC  0x1E9
  96.     MOVF    0x1E1,W
  97.     MULWF   0x1E4
  98.     MOVF    PRODL,W
  99.     ADDWF   0x1E8    
  100.     MOVF    PRODH,W
  101.     ADDWFC  0x1E9
  102.     CLRF    WREG
  103.     ADDWFC  0x1EA
  104.     MOVF    0x1E1,W
  105.     MULWF   0x1E5
  106.     MOVF    PRODL,W
  107.     ADDWF   0x1E9
  108.     MOVF    PRODH,W
  109.     ADDWFC  0x1EA
  110.     CLRF    WREG
  111.     ADDWFC  0x1EB
  112.     MOVF    0x1E2,W
  113.     MULWF   0x1E3
  114.     MOVF    PRODL,W
  115.     ADDWF   0x1E8
  116.     MOVF    PRODH,W
  117.     ADDWFC  0x1E9
  118.     CLRF    WREG
  119.     ADDWFC  0x1EA
  120.     ADDWFC  0x1EB
  121.     MOVF    0x1E2,W
  122.     MULWF   0x1E4
  123.     MOVF    PRODL,W
  124.     ADDWF   0x1E9  
  125.     MOVF    PRODH,W
  126.     ADDWFC  0x1EA
  127.     CLRF    WREG
  128.     ADDWFC  0x1EB
  129.     MOVF    0x1E2,W
  130.     MULWF   0x1E5
  131.     MOVF    PRODL,W
  132.     ADDWF   0x1EA  
  133.     MOVF    PRODH,W
  134.     ADDWFC  0x1EB
  135.     ;-------------------------------------
  136. OSZTAS
  137.     MOVLW   D'48'                        
  138.     MOVWF   0x1FE
  139.     CLRF    0x1F0                      
  140.     CLRF    0x1F1
  141.     CLRF    0x1F2
  142.     CLRF    0x1F3
  143.     CLRF    0x1F4
  144.     CLRF    0x1F5
  145.     BTFSS   0x1FB,7
  146.     GOTO    VIZSGALAT_48
  147.     COMF    0x1F9
  148.     COMF    0x1FA
  149.     COMF    0x1FB
  150.     INCF    0x1F9
  151.     CLRF    WREG
  152.     ADDWFC  0x1FA
  153.     ADDWFC  0x1FB5
  154.     BTG     0x1FF,0  
  155. VIZSGALAT_48
  156.     BCF     STATUS,C           
  157.     RLCF    0x1E6                
  158.     RLCF    0x1E7              
  159.     RLCF    0x1E8                
  160.     RLCF    0x1E9
  161.     RLCF    0x1EA                        
  162.     RLCF    0x1EB
  163.     RLCF    0x1F0              
  164.     RLCF    0x1F1              
  165.     RLCF    0x1F2                
  166.     RLCF    0x1F3
  167.     RLCF    0x1F4                        
  168.     RLCF    0x1F5
  169.     MOVF    0x1F9,W                
  170.     SUBWF   0x1F0,W        
  171.     MOVF    0x1FA,W
  172.     SUBWFB  0x1F1,W
  173.     MOVF    0x1FB,W
  174.     SUBWFB  0x1F2,W
  175.     CLRF    WREG
  176.     SUBWFB  0x1F3,W
  177.     SUBWFB  0x1F4,W
  178.     SUBWFB  0x1F5,W
  179.     BNC     NINCS_KIVONAS_48
  180.     MOVF    0x1F9,W                  
  181.     SUBWF   0x1F0,F        
  182.     MOVF    0x1FA,W
  183.     SUBWFB  0x1F1,F
  184.     MOVF    0x1FB,W
  185.     SUBWFB  0x1F2,F
  186.     CLRF    WREG
  187.     SUBWFB  0x1F3,F
  188.     SUBWFB  0x1F4,F
  189.     SUBWFB  0x1F5,F
  190.     INCF    0x1E6              
  191. NINCS_KIVONAS_48
  192.     DECFSZ  0x1FE                      
  193.     BRA     VIZSGALAT_48
  194.     BTFSS   0x1FF,0
  195.     GOTO    $+14
  196.     COMF    0x1E6
  197.     COMF    0x1E7
  198.     COMF    0x1E8
  199.     INCF    0x1E6
  200.     CLRF    WREG
  201.     ADDWFC  0x1E7
  202.     ADDWFC  0x1E8
  203.     BCF     0x1FF,0    
  204.     NOP
  205.     MOVF    0x1EC,W
  206.     ADDWF   0x1E6,F
  207.     MOVF    0x1ED,W
  208.     ADDWFC  0x1E7,F
  209.     MOVF    0x1EE,W
  210.     ADDWFC  0x1E8,F
  211.     RETURN     
  212. ;-------------------------------------------------------------------------------
(#) majkimester válasza sonajkniz hozzászólására (») Márc 19, 2024 / 1
 
A linearizació 153-ban van egy elírás szerintem.
a CBLOCK vagy RES nem működik ebben a fordítóban?
Igy elég átláthatatlan a kód, hogy minden címmel szerepel benne.
(#) sonajkniz válasza majkimester hozzászólására (») Márc 19, 2024 /
 
Sas szemed van, hogy ezt így kiszúrtad, de sajnos nem oldotta meg a problémát.
Egyébként működik a CBLOCK, és magam sem értem, hogy miért így csináltam. Sokat nehezítettem saját magamnak.
(#) majkimester válasza sonajkniz hozzászólására (») Márc 19, 2024 / 1
 
A linearizació 40-41 sorok nem kellenek, mert később is kinullázod, addig meg nincs használva.
43 sem kell, mert azt sem használod.
A gyanus még a 195 (GOTO $+14), ez hova ugrik?

Átneveztem minden címet, hogy érthetőbb legyen.
  1. LIN MACRO   X_MIN,X_MAX,Y_MIN,Y_MAX,X_ERTEK,Y_ERTEK
  2.         MOVFF   X_MIN,XMIN_B0
  3.         MOVFF   X_MIN+1,XMIN_B1
  4.         MOVFF   X_MIN+2,XMIN_B2
  5.         MOVFF   X_MAX,XMAX_B0
  6.         MOVFF   X_MAX+1,XMAX_B1
  7.         MOVFF   X_MAX+2,XMAX_B2
  8.         MOVFF   Y_MIN,YMIN_B0
  9.         MOVFF   Y_MIN+1,YMIN_B1
  10.         MOVFF   Y_MIN+2,YMIN_B2
  11.         MOVFF   Y_MAX,YMAX_B0
  12.         MOVFF   Y_MAX+1,YMAX_B1
  13.         MOVFF   Y_MAX+2,YMAX_B2
  14.         MOVFF   X_ERTEK,XERTEK_B0
  15.         MOVFF   X_ERTEK+1,XERTEK_B1
  16.         MOVFF   X_ERTEK+2,XERTEK_B2
  17.         CALL    0x3C20
  18.         MOVFF   RESULT_B0,Y_ERTEK
  19.         MOVFF   RESULT_B1,Y_ERTEK+1
  20.         MOVFF   RESULT_B2,Y_ERTEK+2
  21.         ENDM
  22.  
  23.     ;---------------------------------Linearizálás----------------------------------    
  24.         org 0x3C20
  25.         ;Linearizálás képlete:
  26.         ;Y=(Xe*Y0):X0+Ymin
  27.         ;Ahol:
  28.         ;X0=Xmax-Xmin (Számítás során Xmax változó lesz X0, azaz az osztó.)
  29.         ;Y0=Ymax-Ymin (Számítás során Ymax változó lesz Y0, azaz a szorzó)
  30.         ;Xe=X-Xmin    (Számítás során X változó lesz Xe, azaz a szorzandó
  31.         ;Xe*Y0=Szorzat(osztandó)
  32.         ;Osztandó:X0=Eredmény (Eredmény osztandóban jelenik meg)
  33.         ;Eredmény+Ymin (Számítás során az eredmény osztandó helyére kerül.
  34.        
  35.         ;Szorzandó XERTEK_B0, XERTEK_B1, XERTEK_B2
  36.         ;Szorzó YMAX_B0, YMAX_B1, YMAX_B2
  37.         ;Szorzat/osztandó RESULT_B0, RESULT_B1, RESULT_B2, RESULT_B3, RESULT_B4, RESULT_B5
  38.         ;Osztó YMIN_B0, YMIN_B1, YMIN_B2 (fels? 3 byte értéke 0)
  39.         ;Maradék REM_B0, REM_B1, REM_B2, REM_B3, REM_B4 REM_B5
  40.     LINEARIZALAS
  41.         MOVLB   0x1
  42.         MOVF    YMIN_B0,W ;Y_MIN   \
  43.         SUBWF   YMAX_B0,F ;Y_MAX    |
  44.         MOVF    YMIN_B1,W ;Y_MIN+1  |Számítás során Ymax változó lesz Y0,
  45.         SUBWFB  YMAX_B1,F ;Y_MAX+1  | azaz a szorzó.
  46.         MOVF    YMIN_B2,W ;Y_MIN+2  |
  47.         SUBWFB  YMAX_B2,F ;Y_MAX+2 /
  48.        
  49.         MOVF    XMIN_B0,W ;X_MIN   \
  50.         SUBWF   XMAX_B0,F ;X_MAX    |
  51.         MOVF    XMIN_B1,W ;X_MIN+1  |Számítás során Xmax változó lesz X0,
  52.         SUBWFB  XMAX_B1,F ;X_MAX+1  | azaz az osztó.
  53.         MOVF    XMIN_B2,W ;X_MIN+2  |
  54.         SUBWFB  XMAX_B2,F ;X_MAX+2 /  
  55.          
  56.         MOVF    XMIN_B0,W ;X_MIN   \
  57.         SUBWF   XERTEK_B0,F ;X        |
  58.         MOVF    XMIN_B1,W ;X_MIN+1  |Számítás során X változó lesz Xe,
  59.         SUBWFB  XERTEK_B1,F ;X+1      | azaz a szorzandó.
  60.         MOVF    XMIN_B2,W ;X_MIN+2  |
  61.         SUBWFB  XERTEK_B2,F ;X+2     /    
  62.  
  63.     SZORZAS_1
  64.         MOVLB   0x1
  65.         CLRF    RESULT_B3
  66.         CLRF    RESULT_B4
  67.         BCF     FLAGS,0
  68.         BCF     FLAGS,1
  69.        
  70.         BTFSS   XERTEK_B2,7
  71.         GOTO    SZORZAS_2
  72.        
  73.         COMF    XERTEK_B0
  74.         COMF    XERTEK_B1
  75.         COMF    XERTEK_B2
  76.         INCF    XERTEK_B0
  77.        
  78.         CLRF    WREG
  79.         ADDWFC  XERTEK_B1
  80.         ADDWFC  XERTEK_B2
  81.         BSF     FLAGS,0
  82.        
  83.     SZORZAS_2    
  84.         BTFSS   YMAX_B2,7
  85.         GOTO    SZORZAS_3
  86.        
  87.         COMF    YMAX_B0
  88.         COMF    YMAX_B1
  89.         COMF    YMAX_B2
  90.         INCF    YMAX_B0
  91.         CLRF    WREG
  92.         ADDWFC  YMAX_B1
  93.         ADDWFC  YMAX_B2
  94.         BTG     FLAGS,0
  95.            
  96.     SZORZAS_3    
  97.         CLRF    RESULT_B0                        
  98.         CLRF    RESULT_B1
  99.         CLRF    RESULT_B2
  100.         CLRF    RESULT_B3                        
  101.         CLRF    RESULT_B4
  102.         CLRF    RESULT_B5
  103.        
  104.         MOVF    XERTEK_B0,W            
  105.         MULWF   YMAX_B0          
  106.         MOVFF   PRODL,RESULT_B0
  107.         MOVFF   PRODH,RESULT_B1
  108.        
  109.         MOVF    XERTEK_B0,W
  110.         MULWF   YMAX_B1
  111.         MOVF    PRODL,W
  112.         ADDWF   RESULT_B1      
  113.         MOVF    PRODH,W
  114.         ADDWFC  RESULT_B2
  115.        
  116.         MOVF    XERTEK_B0,W
  117.         MULWF   YMAX_B2
  118.         MOVF    PRODL,W
  119.         ADDWF   RESULT_B2
  120.         MOVF    PRODH,W
  121.         ADDWFC  RESULT_B3
  122.        
  123.         MOVF    XERTEK_B1,W
  124.         MULWF   YMAX_B0
  125.         MOVF    PRODL,W
  126.         ADDWF   RESULT_B1    
  127.         MOVF    PRODH,W
  128.         ADDWFC  RESULT_B2
  129.         CLRF    WREG
  130.         ADDWFC  RESULT_B3
  131.        
  132.         MOVF    XERTEK_B1,W
  133.         MULWF   YMAX_B1
  134.         MOVF    PRODL,W
  135.         ADDWF   RESULT_B2    
  136.         MOVF    PRODH,W
  137.         ADDWFC  RESULT_B3
  138.         CLRF    WREG
  139.         ADDWFC  RESULT_B4
  140.        
  141.         MOVF    XERTEK_B1,W
  142.         MULWF   YMAX_B2
  143.         MOVF    PRODL,W
  144.         ADDWF   RESULT_B3
  145.         MOVF    PRODH,W
  146.         ADDWFC  RESULT_B4
  147.         CLRF    WREG
  148.         ADDWFC  RESULT_B5
  149.        
  150.         MOVF    XERTEK_B2,W
  151.         MULWF   YMAX_B0
  152.         MOVF    PRODL,W
  153.         ADDWF   RESULT_B2
  154.         MOVF    PRODH,W
  155.         ADDWFC  RESULT_B3
  156.         CLRF    WREG
  157.         ADDWFC  RESULT_B4
  158.         ADDWFC  RESULT_B5
  159.        
  160.         MOVF    XERTEK_B2,W
  161.         MULWF   YMAX_B1
  162.         MOVF    PRODL,W
  163.         ADDWF   RESULT_B3  
  164.         MOVF    PRODH,W
  165.         ADDWFC  RESULT_B4
  166.         CLRF    WREG
  167.         ADDWFC  RESULT_B5
  168.        
  169.         MOVF    XERTEK_B2,W
  170.         MULWF   YMAX_B2
  171.         MOVF    PRODL,W
  172.         ADDWF   RESULT_B4  
  173.         MOVF    PRODH,W
  174.         ADDWFC  RESULT_B5
  175.        
  176.         ;-------------------------------------
  177.     OSZTAS
  178.         MOVLW   D'48'                        
  179.         MOVWF   LOOP_COUNTER
  180.        
  181.         CLRF    REM_B0                      
  182.         CLRF    REM_B1
  183.         CLRF    REM_B2
  184.         CLRF    REM_B3
  185.         CLRF    REM_B4
  186.         CLRF    REM_B5
  187.        
  188.         BTFSS   XMAX_B2,7
  189.         GOTO    VIZSGALAT_48
  190.        
  191.         COMF    XMAX_B0
  192.         COMF    XMAX_B1
  193.         COMF    XMAX_B2
  194.         INCF    XMAX_B0
  195.         CLRF    WREG
  196.         ADDWFC  XMAX_B1
  197.         ADDWFC  XMAX_B2
  198.         BTG     FLAGS,0
  199.          
  200.     VIZSGALAT_48
  201.         BCF     STATUS,C          
  202.         RLCF    RESULT_B0                
  203.         RLCF    RESULT_B1              
  204.         RLCF    RESULT_B2                
  205.         RLCF    RESULT_B3
  206.         RLCF    RESULT_B4                        
  207.         RLCF    RESULT_B5
  208.        
  209.         RLCF    REM_B0              
  210.         RLCF    REM_B1              
  211.         RLCF    REM_B2                
  212.         RLCF    REM_B3
  213.         RLCF    REM_B4                        
  214.         RLCF    REM_B5
  215.        
  216.         MOVF    XMAX_B0,W                
  217.         SUBWF   REM_B0,W        
  218.         MOVF    XMAX_B1,W
  219.         SUBWFB  REM_B1,W
  220.         MOVF    XMAX_B2,W
  221.         SUBWFB  REM_B2,W
  222.        
  223.         CLRF    WREG
  224.         SUBWFB  REM_B3,W
  225.         SUBWFB  REM_B4,W
  226.         SUBWFB  REM_B5,W      
  227.         BNC     NINCS_KIVONAS_48
  228.        
  229.         MOVF    XMAX_B0,W                  
  230.         SUBWF   REM_B0,F        
  231.         MOVF    XMAX_B1,W
  232.         SUBWFB  REM_B1,F
  233.         MOVF    XMAX_B2,W
  234.         SUBWFB  REM_B2,F
  235.         CLRF    WREG
  236.         SUBWFB  REM_B3,F
  237.         SUBWFB  REM_B4,F
  238.         SUBWFB  REM_B5,F
  239.         INCF    RESULT_B0
  240.                      
  241.     NINCS_KIVONAS_48
  242.         DECFSZ  LOOP_COUNTER                      
  243.         BRA     VIZSGALAT_48
  244.        
  245.         BTFSS   FLAGS,0
  246.         GOTO    $+14
  247.        
  248.         COMF    RESULT_B0
  249.         COMF    RESULT_B1
  250.         COMF    RESULT_B2
  251.         INCF    RESULT_B0
  252.         CLRF    WREG
  253.         ADDWFC  RESULT_B1
  254.         ADDWFC  RESULT_B2
  255.         BCF     FLAGS,0    
  256.         NOP
  257.        
  258.         MOVF    YMIN_B0,W
  259.         ADDWF   RESULT_B0,F
  260.         MOVF    YMIN_B1,W
  261.         ADDWFC  RESULT_B1,F
  262.         MOVF    YMIN_B2,W
  263.         ADDWFC  RESULT_B2,F
  264.         RETURN    
  265.     ;-------------------------------------------------------------------------------
(#) sonajkniz válasza majkimester hozzászólására (») Márc 19, 2024 /
 
Idézet:
„A linearizació 40-41 sorok nem kellenek, mert később is kinullázod, addig meg nincs használva.
43 sem kell, mert azt sem használod.”

Igazad van megint. A 40-41-et már azóta én is észrevettem és töröltem, a 43. sor pedig egy hibajelző bit lenne 0-val történő osztás esetén a normál osztó rutinban, de itt nincs szerepe, így a vizsgálatot kihagytam. Tehát ez sem kell.
A 0X1FF,0, vagy ahogy átnevezted FLAGS,0 egy vezérlőbit. Mivel előjeles szám, pontosabban negatív szám nem osztható vagy szorozható, ezért 3 vizsgálata van. A szorzat 2 eleme, valamint az osztó van vizsgálva. Ahol kell, komplementálva van. minden komplementálás fordít egyet a jelzőbiten. A jelző bit a legelején törölve van. Mivel mínusz*mínusz az plusz, illetve mínusz/mínusz is plusz, ha nincs fordítva, vagy ha kétszer van fordítva, akkor a végén lévő komplementálást átugorja. A te változatodban a 256. sorban lévő NOP-ra ugrik.
Ilyen kiszámított ugrásokat gyakran szoktam használni. Különösen makróknál kedvelem, mivel ott macerás lokális ugrási címeket létrehozni.

Egyébként eszembe jutott, miért nincsenek nevesítve a változók.
Mivel ez a program a bootloader részét képezi, viszont a matematikai makrók nem, így nem fordította le a fordító amíg nevesítve volt.
A hozzászólás módosítva: Márc 19, 2024
(#) majkimester válasza sonajkniz hozzászólására (») Márc 20, 2024 / 1
 
a FLAGS,0-ra rájöttem miért van. A $+14-gyel viszont nem tudok kibékülni. A 14 itt 14 wordot jelent vagy 14 byte-ot? Akárhogy számolom nekem nem a NOP lesz a vége, de inkább használj labelt.
A CBLOCK nem foglal memóriát csak cimkéket generál neked, azt szerintem tudnád itt is használni.
Azt kellene megnézni, hogy a szorzás után a RESULT részeredmény még egyezik-e.
(#) sonajkniz válasza majkimester hozzászólására (») Márc 20, 2024 /
 
Idézet:
„A $+14-gyel viszont nem tudok kibékülni.”

Kedves majkimester!
Te egy zseni vagy, én meg egy ökör.
Még el is magyarázom neked, hogy mi ez, és még akkor sem veszem észre, hogy a 0x kimaradt belőle.
Kijavítottam, és helyreállt a rend.
Most már csak azt mondja meg nekem valaki, hogy a fordító miért nem dobta ez ki mint hibát, és a hiba ellenére miért adott jó értéket a szimulátorban?
Nagyon köszönöm a segítségedet!
(#) majkimester válasza sonajkniz hozzászólására (») Márc 21, 2024 /
 
Szuper. Na ezért kell mindig label-t használni. Én sosem használtam a $ offsetes megadást. 18-as családnál meg vannak két wordos utasítások is, ott mégjobban figyelni kell rá. Nálam a macro-n belül sem volt soha probléma a label, csak kell egy local-t csinálni, igaz csak a régi MPLAB-ot használtam. Az újban mostmár új fordító van, azzal nem tudom mi a helyzet:

  1. MYMACRO         macro
  2.                 local   mylabel
  3.  
  4. mylabel         btfss   TXSTA, TRMT
  5.                 goto    mylabel
  6.  
  7.  
  8.                 endm
(#) KBal76 válasza sonajkniz hozzászólására (») Márc 21, 2024 / 1
 
Az is lehet, hogy a RADIX a szimulátorban HEX és a fordítóban meg DEC, (ugye ez határozza meg hogy minek vegye a számokat amiknek nincs megjelölve a formátuma. A decimálist is lehet jelölni, én direkt szoktam is kódban: D'14' és így nem lehet eltéveszteni)
(#) zenetom válasza KBal76 hozzászólására (») Márc 21, 2024 /
 
Ponttal is lehet jelölni a decimálist, én erre szoktam át, mert egyszerűbb.
Tehát
  1. D'14'
helyett
  1. .14
(#) sonajkniz válasza KBal76 hozzászólására (») Márc 21, 2024 /
 
Nyertél!
A bootloaderben az alapértelmezett számrendszer a decimális. A matematikai részeket is ez tartalmazza.
Ez ugyebár fel lett töltve a PIC-re, ezután már a tesztprogramot a bootloader töltötte be.
Viszont a szimulátorban össze kellett vonjam a két programot, hogy szimulálni lehessen.
Itt pedig már a tesztprogram beállításai működtek, ahol az alapértelmezett számrendszer a HEX volt.
Ezért működött jól.
Ismét tanultam valamit. Máskor majd jobban figyelek.
(#) nemgyuri hozzászólása Márc 22, 2024 /
 
Segítséget kérek! Nem sikerült az PORTA4-es pint kimenetnek konfigurálnom. MPLABX-et használok, PIC12F1572-el. (MPLABX simulátor-hiba lenne? PWM valós kimenet kis hibával megfelel a számítottnak, a "Logikai Analizátor" szerint ötször nagyobb!)
( PIN1572.PNG-ben: RA4 Din T1G0 van kiemelve)
  1. ;Port beállítás:
  2.         banksel APFCON
  3.         bsf     APFCON,TXCKSEL  ;ha=1 Tx RA4 - ha=0 Tx RA0
  4.         bsf     APFCON,T1GSEL   ;???
  5.         banksel INLVLA  ;bemenetválasztó TTL(0) - STtrigg(1 alap)
  6.         banksel ODCONA  ;kimenet open-drain -- push-pull
  7.         clrf    ODCONA
  8.        
  9.         BANKSEL PORTA ;
  10.         CLRF PORTA ;Init PORTA
  11.         BANKSEL LATA ;Data Latch
  12.         CLRF LATA ;
  13. ;       bsf     LATA,TEST
  14.         BANKSEL ANSELA ;
  15.         CLRF ANSELA ;digital I/O
  16.         BANKSEL TRISA ;
  17.         MOVLW B'00111111' ;Set RA<5:3> as inputs
  18.         MOVWF TRISA ;and set RA<2:0> as
  19.         bsf     TRISA,FSKbe
  20.         bcf     TRISA,TX  
  21.         bcf     TRISA,PWMki
  22.         banksel WPUA
  23.         movlw   b'00001001' ;bemenetek gyenge felhúzása
  24.         movwf   WPUA
  25.  
  26. ;EUSART beállítás: -->9600 baud rate 8bites
  27.         ;TXSTA,TMRT --> ha=1 TSR üres
  28.         banksel BAUDCON
  29.         bcf     BAUDCON,BRG16
  30.         bcf     BAUDCON,SCKP
  31.         banksel TXSTA
  32.         bcf     TXSTA,TX9 ;8bites
  33.         bsf     TXSTA,TXEN
  34.         bcf     TXSTA,SYNC
  35.         bcf     TXSTA,BRGH
  36.         bsf     RCSTA,SPEN   ;USART engedélyezése!
  37.         banksel SPBRGL
  38.         movlw   d'40'   ;beállítani! <-Fosc + boudrate (25.175MHz 9600baud-->d'40' ~-0,06%)
  39.         movwf   SPBRGL
  40.         clrf    SPBRGH
A hozzászólás módosítva: Márc 22, 2024

PIN1572.PNG
    
(#) sonajkniz válasza nemgyuri hozzászólására (») Márc 23, 2024 /
 
Szia!

Nem egészen értem ezt a beállítást.
Idézet:
„MOVLW B'00111111' ;Set RA<5:3> as inputs
MOVWF TRISA ;and set RA<2:0> as
bsf TRISA,FSKbe
bcf TRISA,TX
bcf TRISA,PWMki”

Először mindent bemenetre állítassz, majd valami ravasz betűjelzéssel akarod kimenetté tenni.
Erre való utalást, hogy a TRISA regisztert címezni lehetne én nem találtam az adatlapon. Ha a fordító elfogadja, még indig nem biztos, hogy azt is fordít, amit te szeretnél.
Sokkal tisztább ezt beírni: BCF TRISA,4
Akkor biztos, hogy kimenet lesz belőle.
(#) nemgyuri válasza sonajkniz hozzászólására (») Márc 23, 2024 /
 
Szia!
A TRISA beállítást bemenetre állítás már csak azért volt, mert így tudtam figyelni a beállításokat.
A beállítások korrektek, de az PORTA4-et nem sikerült kimenetnek állítani! Ugyanezzel a módszerrel másik portot sikerült kimenetnek beállítani, és vezérelni. USART TX továbbra sem megy, kénytelen leszek szoftveres adatkivitelt készíteni. (bőven van idő az adatküldésre..)
megj.: "FSKbe" és a többi definiálva van az elején
A hozzászólás módosítva: Márc 23, 2024
Következő: »»   31 / 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