Fórum témák
» Több friss téma |
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:
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.
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.
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.
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
De én továbbra sem a txif-et használnám
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.
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.
Én ugyanígy TXIF-re várva küldtem adatot, eddig mindig működött, szerintem nem ott van a hiba:
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:
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
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:
É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:
Ez saját kód, nálam már évek óta bevált.
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.
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
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. |
Bejelentkezés
Hirdetés |