Hey hey,

Meestal lees ik vooral de topics op dit forum. Echter loop ik nu toch echt ergens tegen aan wat volgens mij niet eerder behandeld is.

Situatie:
Ik laat een 18F4520 communiceren met een PC. Dit gaat opzich goed (ik zie dat de pic data ontvangt, en hij kan ook data zenden).

Echter krijg ik met HSEROUT allemaal vreemde tekens in mijn terminal.

Simpelweg

HSEROUT ["TEST"]

leverd een aantal mooie ascii tekens op in mijn terminal zonder enige betekenis.

Mijn vraag:
Hoe stuur ik "plain" tekst over een serieele poort?

Mvg

Je moet ervoor zorgen dat de instelling van het serieel signaal in de terminal en de PIC gelijk zijn
(De snelheid in baud/s, het aantal stop of pariteitsbits etc)

Deze staat waarschijnlijk in de datasheet van je PIC, of in de PicBASIC handleiding.
Daarna gewoon die instelling overnemen in je terminal (persoonlijk zou ik putty gebruiken als terminal)

succes!

Hoe is je microcontroller aan gesloten op je terminal?

Gebruik je een driver als de MAX232, MAX233 ? of zit je op TTL nivo te communiceren ?

Baudrate?
start stopbits ok?
parity?
terminal in 7 bits en uC in 8 bits?

putty gebruik ik ook (super tool voor com & ssh werkzaamheden ;))

Ik declare de waardes in picbasic


HSERIAL_BAUD = 9600
HSERIAL_RCSTA = $90
HSERIAL_TXSTA = $24
HSERIAL_SPBRG = 129
HSERIAL_CLEAR = ON

in putty geef ik het volgende op:
9600 8n1

Rest van de instellingen ook op no (dts, xor)

Ik dacht inderdaad eerst ook dat het met de snelheid van doen had, maar volgens mij staat die goed.

@antwoord2: er zit een max232 tussen

[Bericht gewijzigd door Henry S. op (4%)]

Heb je de waarde van je kristalfrequentie ook goed in je source staan?

Ik heb laatst exact hetzelfde probleem gehad met een arm, het was de baudrate die niet overeenkwam, kijk op een scope wat je denkt uit te sturen en wat je daadwerkelijk uitstuurd. Bij ons was het namelijk dat de snelheid in de arm te hoog was ingesteld.

Op 6 juni 2009 23:29:40 schreef hp197:
putty gebruik ik ook (super tool voor com & ssh werkzaamheden ;))

Ik declare de waardes in picbasic


HSERIAL_BAUD = 9600
HSERIAL_RCSTA = $90
HSERIAL_TXSTA = $24
HSERIAL_SPBRG = 129
HSERIAL_CLEAR = ON

in putty geef ik het volgende op:
9600 8n1

Rest van de instellingen ook op no (dts, xor)

Ik dacht inderdaad eerst ook dat het met de snelheid van doen had, maar volgens mij staat die goed.

klopt, dat krijg je als je het high speed bitje niet hoog maakt.

probeer dit eens:

HSERIAL_BAUD = 9600 ' Set baud rate to 9600
HSERIAL_RCSTA = %10010000 ' Enable serial port and continuous receive
HSERIAL_TXSTA = %00100100 ' Enable transmit and asynchronous mode
HSERIAL_CLEAR = On ' Optionally clear the buffer before receiving

[Bericht gewijzigd door VWG3JB op (33%)]

Check eventjes de output die je krijgt: klopt het aantal karakters? Zoja, kijk eens of ze bitwise inverted zijn. Zonee, check je baudrate, stopbits en pariteiten.

Bedankt voor jullie reacties, ik zal zo even proberen of dat werkt.

Ik gebruik overigens een wisp648 in serial passthrough modus. Als ik de rx en tx draden met elkaar verbind na de wisp648 echoot hij normaal mijn tekens terug naar de terminal (dus je mag aannemen dat dat allemaal goed werkt).

Ik ben alles nog een keer aan het testen en kom er net achter dat ik in ISIS hetzelfde probleem heb

http://img521.imageshack.us/img521/5751/testaif.png

Code:


Device = 18f4520
                
CONFIG_START
OSC = HS
PWRT = On ; Power Up Timer Enabled
WDT = OFF ; Watchdog Timer Disabled
MCLRE = OFF ; MCLR disabled
STVREN = On ; Stack Overflow Reset Enabled
LVP = OFF ; Low Voltage ICSP Disabled
CONFIG_END

all_digital TRUE
XTAL 10

HSERIAL_BAUD = 9600 ' Set baud rate to 9600
HSERIAL_RCSTA = %10010000 ' Enable serial port and continuous receive
HSERIAL_TXSTA = %00100100 ' Enable transmit and asynchronous mode
HSERIAL_CLEAR = On ' Optionally clear the buffer before receiving 

dim teller as byte

while 1=1
    toggle porta.1
    HSerOut ["Teller = ", dec2 teller, "\r\n"]
    teller = teller + 1
    DELAYMS 1000
wend

end

Output geeft in virtual terminal:
HEX: 55 D3 D2 52 D3 A3 2B BF 9F 9D
TEXT: UÓÒRÓ£+¿Ÿ�

Beide is teller = 1

Virtual terminal staat op 9600 8n1 en rx/tx not inverted.

Doe ik nu iets dramatisch fout?

[Bericht gewijzigd door Henry S. op (0%)]

Sluit dat ding eens rechtstreeks aan op een compoort met hyperterminal?

Ik weet niet wat die passtrough mode precies (hardwarematig) doet, en ik weet niet of dat ding RS232 niveaus aankan.

Watvoor compoort gebruik je?

Lees de handleiding van je wisp eens?

The common asynchronous serial communication (as used by the PC serial port) uses RS232
voltage levels and polarity. These PIC UART pins use TTL (0 .. 5V) levels and inverted polarity
(inverted with respect to the RS232 line levels). A MAX232 or an equivalent chip is the standard
way to interface between the TTL signals and the RS232 signals. But some dirt-cheap PIC circuits
interface the PIC pins directly to the RS232 signals. This violates all design rules and
specifications, but sometimes it works. Note that in this situation the TTL signals have the same
polarity as the RS232 signals. Hence a PIC UART can not be used, because it uses inverted
polarity.

http://www.voti.nl/wisp648/wisp648.pdf

[Bericht gewijzigd door Henry S. op (63%)]

HSerOut ["Teller = ", dec2 teller, "\r\n"]

daar zit je fout
je kan niet tekst bij de rs232 poort aanbieden

http://www.asciitabel.nl/

HSerOut [116,101,108,108,101,114]

nu moet er teller op je scherm staan.
je moet de tellerwaarde nog wel +48 want de acciwaarde van 0 is 48.

De serial Pass-through van de wisp648 is beperkt in baudrate.

uit de manual p5: "This pass-through is done in the Wisp648
firmware, so it is limited to lower baudrates (up to 9600 baud seems to work OK)."

/e: dit zou geen probleem mogen geven, maar toch maar eens ter info..

[Bericht gewijzigd door hidnplayr op (15%)]

In ISIS zou het toch moeten lukken, speel daar eens met de parity en stopbits in de terminal.

Op 7 juni 2009 16:11:45 schreef VWG3JB:
HSerOut ["Teller = ", dec2 teller, "\r\n"]

daar zit je fout
je kan niet tekst bij de rs232 poort aanbieden

http://www.asciitabel.nl/

HSerOut [116,101,108,108,101,114]

nu moet er teller op je scherm staan.
je moet de tellerwaarde nog wel +48 want de acciwaarde van 0 is 48.

Wat daar staat is hartstikke correct. In picbasic wordt dat allemaal netjes als leesbare tekst verzonden.

Wat ts verkeerd doet:
Hoge baudrate ("zou moeten werken" vertrouw ik niet), level shifter, hardware uart enz. enz.

Zoals aangegeven

Op 7 juni 2009 16:11:45 schreef VWG3JB:
HSerOut ["Teller = ", dec2 teller, "\r\n"]

daar zit je fout
je kan niet tekst bij de rs232 poort aanbieden

http://www.asciitabel.nl/

HSerOut [116,101,108,108,101,114]

nu moet er teller op je scherm staan.
je moet de tellerwaarde nog wel +48 want de acciwaarde van 0 is 48.

Ja, zoeits had ik eerder ook aan gedacht.
Als ik dat echter invoer krijg ik als output:

HEX: 51 D3 D2 52 D3 23

116 word dus 51?¿?

Overigens gebruik jij dec waarden, maar ik heb ook hex en oct waarden proberen te verzenden. Wat ik niet begrijp is dat als ik er aan de ene kant nummer 1 in stop (dmv hserout [1]), ik er aan de terminal zijde 7D hex uit krijg.

Op 7 juni 2009 16:21:34 schreef elmowww:
[...]

Wat daar staat is hartstikke correct. In picbasic wordt dat allemaal netjes als leesbare tekst verzonden.

Wat ts verkeerd doet:
Hoge baudrate ("zou moeten werken" vertrouw ik niet), level shifter, hardware uart enz. enz.

ik heb dat zelf geprobeerd, maar dat werkte niet!

ik heb zelf de hserout nog nooit aan de praat gekregen. Probeer het eens zo:
Serout port?.?, getal uit tabel, ["test"]


BaudRate 8-bit no-parity  inverted 8-bit no-parity true 7-bit even-parity inverted 7-bit even-parity true 
300      19697            3313                          27889                      11505 
600      18030            1646                          26222                      9838 
1200     17197            813                           25389                      9005 
2400     16780            396                           24972                      8588 
4800     16572            188                           24764                      8380 
9600     16468            84                            24660                      8276 

Misschien staat het xtal op een harmonische te piepen?

Hij heeft in ISIS hetzelfde probleem dus daar zal het niet aan liggen.
Zet in de virtual terminal van ISIS de parity aan of stopbits op 2, of die 2 samen.

idd plantrekker, omdat ik dezelfde output krijg met de hardware als met isis, weet ik dat het niet ligt aan de hardware. Maar moet het softwarematig ergens fout zitten.

Ik ga ff kloten met parity en stop bits.

Overigens is de picbasic code met ISIS schakeling hier te downloaden: http://www.megaupload.com/?d=6G5UD3ZQ

probleem gevonden!

9600 8n1 & rx/tx polarity moet op inverted staan (in isis virtual terminal). Dan kan ik vanuit picbasic

HRSOUT ["abc"]

zenden zonder problemen.

Maar.....
Nu met de hardware.

Wat word er bedoeld met rx/tx polarity, en hoe stel ik dat in in putty?

EDIT:
Hmmmm

Bij inverted mode staat er 0V op de TX pin. Terwijl dat normaal +5V is. verschil tussen RX en TX maakt dat -8.5V. Zet ik inverted uit, dan krijg ik -13.5V op rx ~ tx.

Zou iemand opheldering kunnen geven?

[Bericht gewijzigd door hp197 op (28%)]

0 wordt 1 en 1 wordt 0. Ik werk niet met PIC's maar daar zal het aangepast kunnen worden en in putty ook denk ik.
Bij RS232 stelt -15v tot -3v een 1 voor, 3v tot 15v een nul. De PIC draait het waarschijnlijk om (met de niveau's 0v en 5v dan).

welke hardware gebruik je om de uart data uit de pic om te zetten in seriele niveaus? Max232CPE ?

@jeroen
Een wisp, daarin zit een max232n.