Re: RS-232 sendet nicht, weil Transmit-Buffer nie empty
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  Schnittstellen (Assembler)  |  Re: RS-232 sendet nicht, weil Transmit-Buffer nie empty « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Re: RS-232 sendet nicht, weil Transmit-Buffer nie empty  (Gelesen 3504 mal)
 
Victor
Full Member
***
Offline Offline

Beiträge: 121



Profil anzeigen WWW
« am: Januar 03, 2010, 11:52:13 »

Guten Tag,
beschäftige mich gerade auch mit dem Thema.

Was mir noch nicht ganz klar ist, ist die Herkunft dieser beiden Befehle:
Code:
    movlw   0x0D
    call    Rs232Out
    movlw   0x0A
    call    Rs232Out
Offensichtlich führen sie dazu, dass die Ausgabe immer in der neuen Zeile beginnt.

Aber woher weiss man das?

Gespeichert
Edson
Globaler Moderator
Sr. Member
*****
Offline Offline

Beiträge: 373



Profil anzeigen
« Antworten #1 am: Januar 03, 2010, 12:09:39 »

Hallo Victor,

die ASCII-Codes 0x0D und 0x0A stehen für "Carriage Return" (Wagenrücklauf) und "Line Feed" (Zeilenvorschub). Die Begriffe stammen aus der Zeit der Fernschreiber und elektrischen Schreibmaschinen, sind also nicht mehr ganz jung.

http://de.wikipedia.org/wiki/Wagenr%C3%BCcklauf

Grüße,
Edson

PS. Habe die Threads getrennt, da der Ursprungsthread bereits als gelöst markiert war.
Gespeichert
Victor
Full Member
***
Offline Offline

Beiträge: 121



Profil anzeigen WWW
« Antworten #2 am: Januar 04, 2010, 13:57:36 »

Danke für den Tipp!

Nun wollte ich verschiedene Datentypen über den seriellen Port senden.

Character, Dezimalzahl, Binärzahl.

Irgendwie werden nur die characters ausgegeben. Die Dezimalzahl sowie die Binärzahl werden nicht ausgegeben.

Dieser Quellcode:
Code:
;*********************************************************************************
;*********************************************************************************
; _____ _____ **
; RA2 |1   U   18| RA1 **
; RA3 |2   17| RA0 **
; RA4 |3   16| osc 4 MHz **
; RA5 |4   15| osc 4 MHz **
; GND Vss |5   14| Vdd 5V **
; RB0 |6   13| RB7 **
; RX RB1 |7   12| RB6 **
; TX RB2 |8   11| RB5 **
; RB3 |9________10| RB4 **
; **
; PIC16F628A **
; **
;*********************************************************************************
;*********************************************************************************
list      p=16f628a
#include <P16F628A.INC>
;******** Config Bits setzen ********
__CONFIG     _HS_OSC & _WDT_OFF & _BODEN_OFF & _LVP_OFF & _PWRTE_OFF & _MCLRE_OFF
org 0
; Komparatoren auf Port A ausschalten
bsf CMCON, CM0
bsf CMCON, CM1
bsf CMCON, CM2

; USART initialisieren

; Baudrateneinstellung mit SPBRG (BRGH=1)
; 20 MHz 16 MHz 10 MHz 8 MHz 4 MHz
; 2 400 Baud - - 255 127 63
; 9 600 Baud 129 103 64 51 25
; 19 200 Baud 64 51 31 25 12
; 28 800 Baud 42 33 21 16 8

    bsf    STATUS, RP0 ; Bank1
movlw   D'12'              ; Set Baud rate 19,2 kBPS bei 4 MHz und BRGH=1
    movwf   SPBRG
    bsf TXSTA, BRGH ; BRGH=1
bcf     TXSTA, SYNC      ; no Sync
bsf TXSTA, TXEN          ; Transmit enable Bit
bcf     STATUS, RP0         ; Bank 0
bsf RCSTA, SPEN ; Serial Port enable Bit     


main:
movlw 'A'
call RS232out
movlw 0x0D
call RS232out
movlw 0x0A
call RS232out

movlw .12
call RS232out
movlw 0x0D
call RS232out
movlw 0x0A
call RS232out

movlw B'11111111'
call RS232out
movlw 0x0D
call RS232out
movlw 0x0A
call RS232out   

movlw 'B'
call RS232out
movlw 0x0D
call RS232out
movlw 0x0A
call RS232out
goto main

RS232out:
    btfss   PIR1,TXIF       ; USART Transmit Interrupt Flag Bit
    goto    RS232out    ;    full => back   
    movwf   TXREG            ; den RS232-Sender schreiben
return

end

liefertt in HyperTerminal folgendes:
Code:


B
A
















































B
A



Woran liegt das? Können über RS232 nur Buchstaben übertragen werden?
Gespeichert
mogli
Hero Member
*****
Offline Offline

Beiträge: 580



Profil anzeigen
« Antworten #3 am: Januar 04, 2010, 16:57:54 »

na dann schalt die anzeige in deiner anwendung mit der du die daten empfangst einfach mal um

oder kennst du den unterschied nicht von

Zitat
Character, Dezimalzahl, Binärzahl.

 Smiley
Gespeichert
Victor
Full Member
***
Offline Offline

Beiträge: 121



Profil anzeigen WWW
« Antworten #4 am: Januar 04, 2010, 18:13:13 »

Ich benutze HyperTerminal und dort kann ich diese Einstellung des Formates nicht finden.


Gespeichert
mogli
Hero Member
*****
Offline Offline

Beiträge: 580



Profil anzeigen
« Antworten #5 am: Januar 04, 2010, 20:17:29 »

dann schau dir mal das thema an
Character, Dezimalzahl, Binärzahl.

im wiki sind sehr gute beiträge dazu

ein kleiner tip am rande egal was kommt es ist immer ein byte/8bits min.
was dieses byte darstellt ist wieder nee andere sache

dir fehlen sie ersten grundlagen der digitalwelt, ohne die kommst nicht weiter

und als Terminalprogramm kann ich dir dies empf.
http://www.docklight.de/

lg
« Letzte Änderung: Januar 04, 2010, 21:58:11 von mogli » Gespeichert
Victor
Full Member
***
Offline Offline

Beiträge: 121



Profil anzeigen WWW
« Antworten #6 am: Januar 05, 2010, 20:31:15 »

Die Themen: Character, Dezimalzahl, Binärzahl => Datentypen,
habe ich mir angeschaut.

Also nimmt jedes Zeichen des Datentyps Character 8Bit ein.
Deswegen kann jeweils ein Zeichen über den Seriellen Port gesendet werden,
weil das TXREG (Register) ebenfalls 8Bit groß ist.

Nun möchte ich auch andere Datentypen an den Computer senden.
Zb. die Zahl 3.  In Binär: 00000011.

Diese Zahl ist doch kleiner als 8Bit.("Passt in die 8Bit rein").
Es sollte doch kein Problem darstellen diese Zahl zu übertragen.
Als Ergebnis bekomme ich aber lauter leere Zeilen anstatt von "00000011".

Kann mich einer aufklären Huch

 
Gespeichert
Edson
Globaler Moderator
Sr. Member
*****
Offline Offline

Beiträge: 373



Profil anzeigen
« Antworten #7 am: Januar 06, 2010, 00:14:07 »

Zitat
Es sollte doch kein Problem darstellen diese Zahl zu übertragen.

Ist es auch nicht, das Byte wird ja übertragen - du siehst es nur nicht.

Zitat
Als Ergebnis bekomme ich aber lauter leere Zeilen anstatt von "00000011"

Du erwartest eine Zeichenkette aus Einsen und Nullen? Schau dir doch mal eine ASCII-Tabelle an, dann siehst du dass der Code b'00000011' gleich 0x03 gleich d'3' kein darstellbares Zeichen abbildet (und schon gar keine Zeichenkette die ein Bitfeld darstellt).

Ich empfehle dir das kostenlose HTERM von Tobias Hammer als Terminalprogramm. Damit kannst du gesendete und empfangene Codes in verschiedenen Formaten anzeigen lassen, dann erklären sich die Zusammenhänge von selbst.


Hier der Link zum Download:
http://www.der-hammer.info/terminal/


Grüße,
Edson
Gespeichert
Victor
Full Member
***
Offline Offline

Beiträge: 121



Profil anzeigen WWW
« Antworten #8 am: Januar 08, 2010, 14:11:40 »

Habe mir das Programm runtergeladen und eine Versuchsreihe gestartet.
Die Einstellung, dass alle möglichen Datentypen dargestellt werden habe
ich eingeschaltet.

Mein Ziel ist es ein 'H' per RS232 an den PC zu senden.

Eine Möglichkeit ist das 'H' in ASCII kodoierung zu senden.
In der ASCII Tabelle entspricht das Zeichen 'H' der hexadezimalen Zahl 48.

Habe also die 0x48 an den PC gesendet.
Code:
main:
movlw 0x48
call RS232out
movlw 0x0D
call RS232out
movlw 0x0A
call RS232out 
goto main

Das Programm HTERM liefert folgendes:
5)5)5)5)5)5)5)5)5)...
Das Programm HYPERTERMINAL liefert nichts.

Nun habe ich das Zeichen selbst also 'H' an den PC gesendet:
Code:
main:
movlw 'H'
call RS232out
movlw 0x0D
call RS232out
movlw 0x0A
call RS232out 
goto main
Das Programm HTERM liefert folgendes:
HHHHHHHHHHHHHH...
Das Programm HYPERTERMINAL liefert folgendes:
H
H
H
.
.
.

Habe danach probiert die Zahl 1 zu senden.
In der ASCII-Tabelle entspricht die zahl 1 den hexadezimalen Wert 30.

Code:
main:
movlw 0x30
call RS232out
movlw 0x0D
call RS232out
movlw 0x0A
call RS232out 
goto main

Das Programm HTERM liefert folgendes:
jR jR jR.....
Das Programm HYPERTERMINAL liefert folgendes:
0
0
0
.
.
.

Nun habe ich das Zeichen selbst also '1' an den PC gesendet:
Code:
main:
movlw '1'
call RS232out
movlw 0x0D
call RS232out
movlw 0x0A
call RS232out 
goto main
Das Programm HTERM liefert folgendes:
1111....
Das Programm HYPERTERMINAL liefert folgendes:
1
1
1
.
.
.

Schlussfolgerung:
Wie es aussieht kann ich nur die ASCII Zeichen selbst rübersenden.
Das Zeicher per Hexadezimalcode auszugeben klappt nicht.

Was mich jedoch verwirrt ist, dass mache Sachen wie z.B.
0D und 0A (Wagenrücklauf und neue Zeile)
doch interpretiert werden.
Gespeichert
slowslow
Gast
« Antworten #9 am: Januar 08, 2010, 16:02:42 »

ASCII '1' ist immer noch 0x31, da hat sich seit jahren nichts geändert.
Gespeichert
Jotze
Jr. Member
**
Offline Offline

Beiträge: 54


C4004


Profil anzeigen
« Antworten #10 am: Januar 08, 2010, 16:20:22 »

slowslow's Beitrag löst das Problem natürlich -.-
Gespeichert
Victor
Full Member
***
Offline Offline

Beiträge: 121



Profil anzeigen WWW
« Antworten #11 am: Januar 08, 2010, 17:49:09 »

Aha, war also mein Fehler.  Verlegen

Kann man über den seriellen Port auch andere Datentypen rübersenden
oder nur ASCII?

Will den Status des Port-B als Binärzahl rübersenden.
In dem Buch, mit dem ich arbeite "CRC Press - Microcontroller Programming - The Microchip PIC" wird das Thema viel zu flüchtig behandelt.


Gespeichert
Jotze
Jr. Member
**
Offline Offline

Beiträge: 54


C4004


Profil anzeigen
« Antworten #12 am: Januar 11, 2010, 08:20:10 »

Du kannst jeden Wert rüber senden. Pro Byte also von 0-255 alles. Wie du mit den Empfangenen Werten umgehst kannst du dir aussuchen. Hyperterminal und Co interpretieren die Empfangenen Daten als Ascii Code. Darum wird bei zb 0x03 nichts dargestellt...
Gespeichert
JoK
Newbie
*
Offline Offline

Beiträge: 1


Profil anzeigen
« Antworten #13 am: Januar 11, 2010, 19:05:19 »

Gutenn Abend,
wenn Du ein b'10101010' per Terminal anzeigen lassen willst, muss Du jedes Bit prüfen und entsprechende Werte übermitteln.
In diesem Falle also:
Hex:     0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x30
Dez:       49   48   49   48   49   48   49   48
Zeichen:    1    0    1    0    1    0    1    0

Denn eigentlich ist obiges Byte:
0xAA bzw. 170




Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.052 Sekunden mit 19 Zugriffen.
 
Top! Top!