list p=16f627
#define __16F627
#include <P16f627.INC>
ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES
;**************************************************************
; Configuration festlegen
;
;Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein
LV-programming, MCLR, externer Oszillator
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF &
_LVP_OFF & _MCLRE_ON & _ER_OSC_CLKOUT
;**************************************************************
;Registerzuordnung
Eingang equ 0x22
org 0x000
goto init
;**************************************************************
;Initialisierung
init
bsf STATUS,RP0 ;Bankumschaltung
movlw b'11110000'
movwf TRISA ;PortA Eingänge
movlw b'00000000'
movwf TRISB ;PortB Ausgänge
BSF TRISB,1 ; RX-RS232 für USART-Modul
BSF TRISB,2 ; TX-RS232 für USART-Modul
bcf status,rp0 ;Bankumschaltung
BSF CMCON, CM0 ;Komperatoreingänge auf Digital schalten
BSF CMCON, CM1
BSF CMCON, CM2
; USART initialisieren
BSF STATUS,RP0 ; Bank1
MOVLW 0x24 ; Sender: RS232
MOVWF TXSTA ;
BCF STATUS,RP0 ; Bank 0
MOVLW 0x90 ; Empfänger: RS232
MOVWF RCSTA ;
; USART Baudrate einstellen
BSF STATUS,RP0 ; Bank1
MOVLW D'23' ; Set Baud rate 14.7456 Mhz bei 38400
Baud
MOVWF SPBRG
BSF TXSTA, BRGH ; BRGH=1
BCF STATUS,RP0 ; Bank 0
;**************************************************************
;Programm
RS232in
btfss PIR1,RCIF
goto RS232in ; Interrupt kam von wo anders
movfw RCREG ; RS232-Register auslesen
movwf Eingang
RS232out
btfss PIR1,TXIF ; ist Sender leer ?
goto RS232out ; nein, noch nicht leer
movfw Eingang
movwf TXREG ; und in den RS232-Sender schreiben
goto RS232in
END
Leider funktioniert dieses Programm nicht:(
Es soll nur die Daten vom NMEA protokoll vom GPS einlesen und gleich
wieder rausschicken.
Leider kommt am Ausgang nur datenmüll an, obwohl ab und zu auch mal ne
zeile korrekt ausgegeben wird.
Habe dann mal zu test eine "3" senden lassen immer wenn ein Byte
emfpangen wird und das hat wunderbar funktioniert auch in dem Rythmus
wie ie daten vom NMEA reinkommen.
Ich habe schon alles versucht aber nichts hilft.
hoffe Ihr könnt mir helfen.
Hallo bcf status,rp0 ;Bankumschaltung Richtig : STATUS,RP0 mfg Ottmar
Eric John schrieb: > Leider funktioniert dieses Programm nicht Dein Code ist lausig. Abgesehen von formalen Dingen scheinst du der Ansicht zu sein, daß man Rx und Tx immer und jederzeit benutzen kann, ohne drauf zu achten, ob der Tx auch frei ist, wenn am Rx grad was passendes eingetroffen ist. Mein Rat: Zwischenpufferung. Hier ist mal ein kruder Auszug aus einer meiner Quellen. Syntax ist ein bissel anders als bei deinem Assembler, aber du wirst es schon verstehen: ; Interrupt-Routine ; ================= ORG 4 Interrupt: MOVWF RetteW ; W retten SWAPF Status,W ; Flags in W holen CLRF Status MOVWF RetteFlags ; Flags retten MOVF FSR,W MOVWF RetteFSR SKIP RCIF GOTO i1 ; Byte von SIO wurde empfangen BCF RCIF MOVF RCSTA,W ; Test auf Rx Fehler ANDLW B'00000110' SKIP NZ GOTO i_rxb BCF CREN NOP BSF CREN GOTO i1 i_rxb: MOVF rx_ip,W ; Zeichen in den ANDLW 7 ; Empfangs-Ringpuffer ADDLW RxBuf ; schreiben MOVWF FSR MOVF RCREG,W MOVWF Indirect INCF rx_ip,W ANDLW 7 MOVWF rx_ip i1: SKIP TXIF GOTO i2 ; SIO Sender kann nächstes Byte vertragen ; (TXIF kann man nicht löschen! - nur mit TXIE=0 verbieten) MOVF tx_ip,W XORWF tx_op,W SKIP Z GOTO i_send_next BSF RP0 ; Bank 1 BCF TXIE ; wenn es nix zu tun gibt, löschen wir TXIE BCF RP0 GOTO i2 i_send_next: MOVF tx_op,W ADDLW TxBuf MOVWF FSR MOVF Indirect,W MOVWF TXREG INCF tx_op,W ANDLW 63 MOVWF tx_op i2: SKIP ADIF GOTO i3 ... usw. ; V.24 In/Out-Funktionen ; Test, ob empfangene Zeichen verfügbar sind. ; ZERO, wenn nix anliegt CharAvail: MOVF rx_ip,W XORWF rx_op,W RETURN ; liefert empfangenes Zeichen GetChar: MOVF rx_ip,W XORWF rx_op,W SKIP NZ GOTO GetChar MOVF rx_op,W ADDLW RxBuf MOVWF FSR INCF rx_op,W ANDLW 7 MOVWF rx_op MOVF Indirect,W RETURN ; sendet Zeichen PutChar: BCF GIE MOVWF PHudl ; Zeichen retten __put1: INCF tx_ip,W XORWF tx_op,W ANDLW 63 SKIP Z GOTO __put2 BSF RP0 ; Puffer ist voll, also warten BSF TXIE BCF RP0 BSF GIE GOTO __put1 __put2: BCF GIE MOVF tx_ip,W ANDLW 63 ADDLW TxBuf MOVWF FSR MOVF PHudl,W MOVWF Indirect INCF tx_ip,W ANDLW 63 MOVWF tx_ip BSF RP0 BSF TXIE BCF RP0 MOVF PHudl,W ; Zeichen zurück nach W BSF GIE RETURN ;===== Kaltstart ================================================= Start: MOVLW ValPortA MOVWF PortA MOVLW ValPortB MOVWF PortB MOVLW ValPortC MOVWF PortC MOVLW ValPortD MOVWF PortD MOVLW ValPortE MOVWF PortE CLRF tx_ip CLRF tx_op CLRF rx_ip CLRF rx_op CLRF AbFlags CLRF ModFlags CLRF AdcMap CLRF Protokoll CLRF Amplix CLRF SloMoCount BSF RP0 ; Bank 1 MOVLW B'01000000' MOVWF OptionReg MOVLW ValTrisA MOVWF TrisA MOVLW ValTrisB MOVWF TrisB MOVLW ValTrisC MOVWF TrisC MOVLW ValTrisD MOVWF TrisD MOVLW ValTrisE MOVWF TrisE MOVLW B'00100010' MOVWF ADCON1 ; 5 Kanäle AN0..4 analog, left justified MOVLW 20 MOVWF SPBRG MOVLW B'00100110' MOVWF TXSTA BCF RP0 ; wieder Bank 0 MOVLW B'10110000' MOVWF RCSTA MOVLW B'00000101' ;Timer 1, Pre=1:1, intern MOVWF T1CON BSF RP0 BSF RCIE BSF TXIE BSF INTE BSF PEIE BCF RP0 ...usw. W.S.
Hallo W.S. Danke für deine Antwort. Das Senden funktioniert bei mir ja, aber auch beim Einlesen habe ich keinen Puffer oder wartezeit. Ist mir ehrlich gar nicht aufgefallen:( Hoffe das es daran liegt. Was meine Formale schreibweise angeht wie z.b. status,rp0 Richtig : STATUS,RP0 Wozu gibt es denn Compiler?^^ sicherlich nicht schön aber die funktion bleibt die selbe. Werde aber mal das programm umschreiben: RS232in btfss PIR1,RCIF goto RS232in ; Interrupt kam von wo anders movfw RCREG ; RS232-Register auslesen movwf Eingang RS232out btfss PIR1,TXIF ; ist Sender leer ? goto RS232out ; nein, noch nicht leer movfw Eingang movwf TXREG ; und in den RS232-Sender schreiben leer btfsc PIR1,RCIF goto leer btfsc PIR1,TXIF goto leer goto RS232in Das sollte doch genügen damit er genug zeit hat zum senden und empfangen?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.