Forum: Mikrocontroller und Digitale Elektronik PIC 16F877a - RS232


von Thomas (Gast)


Lesenswert?

Hallo!

bin ein pic neuling und versuche gerade mit einem 16f877a über die rs232 
einen Text (beliebig lange) im Hyperterminal auszugeben. wie schicke ich 
den text über die rs232 ans Hyperterminal? geht das mit dem TXREG?

falls jemand von euch einen programmcode hat wär das super!

bedanke mich im voraus für eure Hilfe!

von tastendrücker (Gast)


Lesenswert?

>bin ein pic neuling

Dann ab zu Sprut...
http://www.sprut.de/electronic/pic/grund/rs232.htm

von Thomas (Gast)


Lesenswert?

> Dann ab zu Sprut...
http://www.sprut.de/electronic/pic/grund/rs232.htm


das hab ich mir schon alles durchgelesen, jedoch weiß ich nicht wie ich 
das ans Hyperterminal schicke! hm

von tastendrücker (Gast)


Lesenswert?

> das hab ich mir schon alles durchgelesen, jedoch weiß ich nicht wie ich
> das ans Hyperterminal schicke! *hm*

Ich versteh jetzt dein Problem nicht.

> falls jemand von euch einen programmcode hat wär das super!

Auf der Sprut-Seite ist das doch genau erklärt - mit Beispielprogramm - 
und 'ne Schaltung ist auch angegeben. Du must nur darauf achten, die 
Register/Bänke an den von dir verwendeten PIC anzugleichen.

Also einfach Verbinden, Hyperterminal starten, richtiges Protokoll 
einstellen und dann Daten über den PIC-UART senden.

von Thomas (Gast)


Lesenswert?

;*********************************************************************** 
*****
; Includedatei für den 16F877a einbinden
;*********************************************************************** 
*****
  include  "p16F877a.inc"

;*********************************************************************** 
*****
; Konstanten-Deklaration
;*********************************************************************** 
*****
DatenSindDa   equ   0x24
Zeichen       equ   0x22


  org  0x00          ;Reset-Adresse fuer PIC16F877A
RESET               ;Initialisierung für den Bootloader
  clrf  STATUS
  movlw  0x00
  movwf  PCLATH
  goto  main        ;Springe zum Label "main"

  org 0x04          ;Interrupt-Adresse fuer PIC16F877A
  goto  Timer0_ISR      ;springe zum Label "Timer0_ISR"

;*********************************************************************** 
*****
; Timer0 Interrupt Service Routine
;*********************************************************************** 
*****

Timer0_ISR
  bcf    INTCON,GIE      ;Alle INT verhindern

  retfie            ;Ende der TMR0-ISR


;*********************************************************************** 
*****
; Initialisierung
;*********************************************************************** 
*****
init
  clrf     DatenSindDa

    bsf      STATUS, RP0   ; auf Bank 1 umschalten
    movlw    B'00000000'   ; PortB alle output
    movwf    TRISB
    bcf      STATUS, RP0   ; auf Bank 0 zurückschalten
    clrf     PORTB         ; alle LEDs ausschalten

; USART initialisieren
    BSF      STATUS,RP0    ; Bank1
    MOVLW    0x20          ; Sender: RS232
    MOVWF    TXSTA         ;
    BCF      STATUS,RP0    ; Bank 0
    MOVLW    0x90          ; Empfänger: RS232
    MOVWF    RCSTA         ;

; USART Baudrate einstellen
    BSF      STATUS,RP0        ; Bank1
    MOVLW    6                ; Set Baud rate 9600 BPS bei 4 MHz
    MOVWF    SPBRG
    BCF      TXSTA, BRGH       ; BRGH=0
    BCF      STATUS,RP0        ; Bank 0

  RETURN

;*********************************************************************** 
*****
; Hauptprogramm
;*********************************************************************** 
*****
main
  CALL init
  CALL autor_senden
  movwf Zeichen
  CALL RS232out
  goto $

;*********************************************************************** 
*****
; Autor senden
;*********************************************************************** 
*****
autor_senden
  ;CLRW
  addwf  Zeichen
  dt  "autor",0

RETURN

RS232out
    btfss   PIR1,TXIF        ; ist Sender leer ?
    goto    RS232out         ; nein, noch nicht leer
  banksel  TXREG
    movwf   TXREG            ; und in den RS232-Sender schreiben

RETURN



;*********************************************************************** 
*****
;Ende des Programms
;*********************************************************************** 
*****

  END


------------------------------------------------------------------------ 
------

Wiso schickt er mir anstatt des Zeichen a ein ß?

von tastendrücker (Gast)


Lesenswert?

>; USART Baudrate einstellen
>    BSF      STATUS,RP0        ; Bank1
>    MOVLW    6                ; Set Baud rate 9600 BPS bei 4 MHz
>    MOVWF    SPBRG
>    BCF      TXSTA, BRGH       ; BRGH=0
>    BCF      STATUS,RP0        ; Bank 0


Laut Datenblatt (S. 114, Tabelle 10-3) gibt's bei BGRH=0 und SPBGR=6 bei 
9600 Baud einen Fehler von 6,99%

Du solltest besser BGRH=1 und SPBGR=25 nehmen (0.16% bei 9600 Baud@4MHz, 
S. 114, Tabelle 10-4):



>Timer0_ISR
>  bcf    INTCON,GIE      ;Alle INT verhindern
>
>  retfie            ;Ende der TMR0-ISR

Und was soll das?

1. Bei Auslösen eines Interrupts wird INTCON,GIE automatisch auf '0' 
gesetzt

2. setzt 'refie' INTCON,GIE wieder auf '1' (siehe DS S. 153)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.