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 / 31
(#) 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.
Következő: »»   31 / 31
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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