PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 funktioniert nicht



doolitle15
29.08.2005, 21:26
hallo!

ich habe ein programm für meinem pic geschriebn ( ich habe auf www.sprut.de geschaut), dass einfach wenn es daten vom pc empfängt am PORTB ausgeben sollte!! leider funktioniert das nicht!! am pc habe ich das programm teraTerm!! was könnte ich falsch gemacht habn?? welches Kabel benutzt ihr( ausgekreuzt oda 1:1)?? ich hoffe es kann mir jemand helfen!!
mfg doolitle

PicNick
30.08.2005, 06:56
Was könnte ich falsch gemacht habn??
Jeden einzelnen Buchstaben im Programm kannst du theoretisch falsch machen.

Die Verbindung muß ausgekreuzt sein, dh
RX <> TX und
TX <> RX
Wie das real aussieht, kommt auf deine Stecker an. Beim sprut.de gibt's darüber ellenlange Doku
Nicht vergessen: Terminal Einstellung: "Handshake none"

doolitle15
30.08.2005, 09:36
da hab ich gleich noch eine frage! was muss ich im terminal eingeben, wenn jetzt zB. PORTB5 schalten soll??
mfg doolitle

30.08.2005, 09:44
PinB.0 = ctrl A
PinB.1 = ctrl B
PinB.2 = ctrl D
PinB.3 = ctrl H
PinB.4 = ctrl @
PinB.5 = space (Leertaste)
PinB.6 = @
PinB.7 = p

mfg picnick

doolitle15
30.08.2005, 10:58
hallo!
ich hab das jetzt ausprobiert aba es funktioniert nicht! also denke ich das mein programm falsch ist! könnte sich mal jemand ansehen was falsch ist??

list p=16f873
#include <P16f873.INC>

init
bsf STATUS,RP0
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 ;
MOVLW 0x90 ; Empfänger: RS232
MOVWF RCSTA
BCF STATUS,RP0 ;
; USART Baudrate einstellen
BSF STATUS,RP0 ; Bank1
MOVLW 25 ; Set Baud rate 2,4 kBPS bei 4 MHz
MOVWF SPBRG
BCF TXSTA, BRGH ; BRGH=0
BCF STATUS,RP0 ; Bank 0



RS232in

btfss PIR1,RCIF ; sind Daten da ?
goto RS232in ; nein, noch keine Daten da
movfw RCREG ; RS232-Register auslesen
movwf PORTB ; und nach 'PORTB' schreiben
goto RS232in
end

PicNick
30.08.2005, 11:11
Ich hab mit meinem Setup (PIC16F877) verglichen.
Die Baudrate kann ich nicht beurteilen, ich hab eine andere.
Aber, was ich noch habe, ist


bsf STATUS,RP0 ; Bank1
bcf TRISC, 6 ; PortC output 6 (tx COM)
bsf TRISC, 7 ; PortC input 7 (rx COM)

Probier' mal, vielleicht nutzt das was

30.08.2005, 11:30
hallo!
muss ich wenn ich im terminal zb. PORTB5 (mit space) eintippe dann noch irgendwo senden drücken oda so? ich hab da zwar schon geschaut aba ich finde imma nur send file und so!!
mfg doolitle

PicNick
30.08.2005, 11:34
Nein, wenn du das nicht extra einstellst, wird durch drücken der z.B. Leertaste auch sofort der Code 0x20 losgeschickt.

doolitle15
30.08.2005, 11:40
aha danke ! aba irgendwie funktioniert das nicht!! ich weiß nicht mehr was ich tun soll?? hast du noch eine idee??
doolitle

PicNick
30.08.2005, 11:48
Statt:

MOVLW 25 ; Set Baud rate 2,4 kBPS bei 4 MHz
Schreib lieber

MOVLW d'25'
man weiß ja nie, was einem Compiler so alles einfällt

Übrigens: wenn du unsicher bist, kannst du testweise den RS232-Stecker auch mal kurz umdrehen, von wegen auskreuzen oder nicht, das hält der schon aus

doolitle15
30.08.2005, 11:50
ok danke werd ich gleich ausprobieren !!

doolitle15
30.08.2005, 11:58
leida funktioniert das auch nicht!! weiß nicht mehr was ich tun könnte??

30.08.2005, 12:00
Verbinde mal an deinem RS232-Kabel RX mit TX (Ohne Controller; einfach nur am offenen Kabel). Wenn du dann eine Taste am Terminal druckst sollte das Zeichen angezeigt werden. So kannst du testen, ob von deiner PC-Seite alles in Ordnung ist.
Die Baudrate kannst du so allerdings nicht prüfen.

doolitle15
30.08.2005, 12:04
hallo! ich hab gerade probiert 2,3 zuverbinden! und es funktioniert!!
also die pc seite dürfte in ordnung sein!! was kann ich am controller falsch habn??
mfg doolitle

PicNick
30.08.2005, 12:21
Tja,


RS232in:
btfss PIR1,RCIF
goto RS232in
;-----------------------
bcf PIR1,RCIF ; interrupt-Flag löschen
;-----------------------
movfw RCREG
movwf PORTB
goto RS232in
end

wenn du auch noch diese Zeile einfügst, bin ich mit meiner Weisheit am Ende und habe die Hardware oder die Chip-Einstellungen im Verdacht

Ich habe einen externen quarz, und drehe den Watchdog ab
list p=16f873
#include <P16f873.INC>
__config _HS_OSC & _WDT_OFF
Wie sieht das bei dir aus ?

doolitle15
30.08.2005, 12:36
ich hab auch einen externen quarz und hab den watchdog timer ausgeschaltet!!

doolitle15
30.08.2005, 12:51
vielleicht hab ich einen fehler in der schaltung!

RS232 schnittstelle: pin 2-------> MAX232: pin 7
RS232 schnittstelle: pin 3-------> MAX232: pin 8
MAX232: pin 9---------> PORTC,7 (RX)
MAX232: pin 10-------->PORTC,6 (TX)

mfg doolitle

PicNick
30.08.2005, 14:07
FÜr ein klassisches Null-modem kabel solltest du diese beiden vertauschen
RS232 schnittstelle: pin 2-------> MAX232: pin 7
RS232 schnittstelle: pin 3-------> MAX232: pin 8

doolitle15
30.08.2005, 14:09
ich hab die beiden aba schon mal vertauscht gehabt und es hat trotzdem nicht funktioniert!!

PicNick
30.08.2005, 14:13
Das mit dem Echotest hast du ja schon probiert. das muß auch HINTER dem MAX 232 funktionieren. also 9 u. 10 am Max überbrücken.
dazu muß aber der Controller kurz raus !

doolitle15
30.08.2005, 14:14
ok werd ich gleich ausprobieren!!

doolitle15
30.08.2005, 14:19
also ich habs beim MAX232 bei pin 7,8 probiert ,ich hab p eingegeben und es es ist ein , zurückgekommen!!?? und dann hab ich es bei pin 9, 10 probiert da ist gar nichts gekommen!!
das heißt woll das der MAX232 kaputt ist oda??

PicNick
30.08.2005, 14:52
Na ja, wenn du 7, 8 verbindest, muß aber der MAX raus.
bei 9, 10 MAX rein, dafür Controller raus.
Wenn du das so probiert hast, muß wirklich mit dem MAX was sein.
auf dem MAX muß bei Pin 2 + 8V und bei Pin 6 -8V zu messen sein (zirka)
Bei verschiedenen Max-Typen braucht man andere Kondensatoren. Geprüft ?

doolitle15
30.08.2005, 14:58
ich habe gerade alles nachgemessn und es ist genau so wie du es jetzt geschriebn hast!! und alles andere hab ich auch schon geprüft!! wenn ich nach dem max RX und TX verbinde dann kommt nichts zurück!!!

PicNick
30.08.2005, 15:14
Erst mal die blöde Frage: Am RS232 Stecker Pin 5 ist Masse. Die ist aber schon mit GND vom Max verbunden ?
*murmel*
Am Max (wenn du nicht einen anderen probieren kannst) gibt es noch zwei Anschluß-Möglichkeiten
RS232 schnittstelle: pin 2-------> MAX232: pin 7 -->14
RS232 schnittstelle: pin 3-------> MAX232: pin 8 -->13
MAX232: pin 9---------> PORTC,7 (RX) Max-pin 12
MAX232: pin 10-------->PORTC,6 (TX) Max-pin 11

*stöhn*

doolitle15
30.08.2005, 15:16
jop ich weiß und ich bin gerade dabei es zu ändern hoffe jetzt funktionierts!!!

doolitle15
30.08.2005, 15:22
nein das funktioniert auch nicht !!!

PicNick
30.08.2005, 15:30
Und 2 /3 andersrum ?

doolitle15
30.08.2005, 15:42
wenn ich jetzt nach dem max 11, 12 zusammenschließe bekomm ich ein signal zurück aba die led leuchten trotzdem nicht wenn der pic drinen ist!!

PicNick
30.08.2005, 15:53
Mühsam nährt sich das Eichhörnchen.
Wie's jetzt ist, müßt Max-Pin 11 zum Controller TX und 12 zum RX.
Haben wir das ?

doolitle15
30.08.2005, 15:54
jop das hab ich

PicNick
30.08.2005, 16:10
Jetzt müssen wir sicherstellen, daß der Pic überhaupt läuft
Mach VOR der Empfangsroutine eine dauerschleife, in der du die Leds einzeln aufdrehst. Das muß dann so aussehen, als ob alle gleichzeitig leuten würden.
movlw 1
movwf PORTB
Schleife:
rlf PORTB, f
b Schleife

doolitle15
30.08.2005, 16:15
ok werd ich machen!!!!!

doolitle15
30.08.2005, 16:29
jop hab ich gemacht! und die leds leuchten wie imma!!

PicNick
30.08.2005, 18:06
Moment, moment
RCSTA is ja in Bank 0
bcf STATUS,RP0 ; Bank 0
movlw 0x90 ; Empfänger: RS232
movwf RCSTA ;

uiiiiii

30.08.2005, 20:31
DANKE danke jetzt funktionierts endlich!!!!!!!!!

DHigh
05.09.2005, 12:05
mal was anderes ....

mein PIC hägnt sich auf oder so aufjeden fall macht er nach ner zeit nichtmehr das was er soll
könnte natürlich mit nem WachtDogTimer machen aber wollte eigentlich raus lassen.
Also RB1 geht high wenn er über RS232 binär 1 bekommt (und 3 eigentlich aus aber das war wegen was anderem und ist unwichtig)

Wenn 1 kommt wird rb1 für die eingestellte zeit high
so wenn ich aber ganz oft in der zeit 1sen schicke was das programm macht, also ohne pausen 00000001,00000001
dann hängt der sich nach 3 mal auf an nem anderen rechner 4 mal
wenn ich allerdings warte bis rb1 wieder low ist dann gehts ...

so sollte es sein:
RB1 high dann zeitverzögerung dann relais aus dann zeitverzögerung dann wieder abfrage rs232

bin am fehlersuchen aber finde nichts ... code iss ok meiner meinung nach






LIST P=16F628, R=DEC ; Use the PIC16F628 and decimal system

#include "P16F628.INC" ; Include header file




ORG 0x000 ; Programmstart bei 0x000

; --------------------------------
; SET ANALOG/DIGITAL INPUTS PORT A
; --------------------------------

movlw 7 ; lädt 7 in das W-Register
movwf CMCON ; Comperator

; ----------------
; Init der Ports
; ----------------
3



bsf STATUS,RP0 ; Bank 1
movlw b'00100000'
movwf PIE1 ; USART Receive Interrupt Enable Bit wird gesetzt (RS232 Empfang ein)

bcf STATUS,RP0 ; Bank 0
movlw b'00000000'
movwf PORTA ; alle low an PORTA

movlw b'00000100'
movwf PORTB ; PORTB wird auf 00000100 gesetzt

bsf STATUS,RP0 ; Bank 1

movlw 0xFE
movwf TRISA ; bis auf RA0 alle Eingäng(high)
movlw 0xFF
movwf TRISB ; alle Eingänge RB1(RX)=Eingang

; ------------------------------------
; BAUD RATE für Kommunikation mit dem PC wird gesetzt
; ------------------------------------
; Boot Baud Rate = 19200, No Parity, 1 Stop Bit

movlw 0x0C ; 0x0C=19200bps 0x19=9600bps
movwf SPBRG ; Baud Rate 19200bps wird gesetzt
movlw b'00000100' ; brgh = high (2)
movwf TXSTA ; schaltet brgh high ein
bcf STATUS,RP0 ; Bank 0

movlw b'10010000'
movwf RCSTA ; schaltet seriellen Port ein

; ---------
; MAIN LOOP
; ---------

loop call receive ; ruft Dateiempfang auf
call vergleich ; ruft ersten Vergleich auf
call vergleich2 ; ruft zweiten Vergleich auf
goto loop ; MAIN LOOP wird wiederholt

; -------------------------------------------
; SIGNALE VON DER RSR232 SCHNITTSTELLE EMPFANGEN
; -------------------------------------------

receive btfss PIR1,RCIF ; checkt ob im register PIR1 das RCIF bit (USART Receive Interrupt Flagbit) wenn der receive buffer voll ist geht weiter
goto receive ; das wird so lange abgefragt bis was empfangen wurde
movf RCREG,0 ; speichert das Empfangende in W
movwf 0x7F ; speichert das Empfangene in Speicherzelle 7F
return ; zurück zum MAIN LOOP

; -------------------------------------------------------------
; "VERGLEICHT" DIE BEIDEN SIGNALE
; -------------------------------------------------------------

vergleich
movf 0x7F,0 ; das aus der RS232 Empfange Byte in W schreiben
sublw 1 ; das Signal wird mit 1 subtrahiert, wenn 0 herraus kommt wird Zero Bit gesetzt
btfss STATUS,Z ; wenn Zerobit gesetzt wurde, wird nächster Befehl übersprungen
return ; zurück zum MAIN LOOP
bsf PORTA,0 ; PORTA Bit 0 wird gesetzt(Ausgang Pin 17)
call verz
bcf PORTA,0 ; PORTA Bit 0 wird gelöscht(Ausgang Pin 17)
call verz
return ; zurück zum MAIN LOOP

vergleich2
movf 0x7F,0 ; das aus der RS232 Empfange Byte in W schreiben
sublw 3 ; das Signal wird mit 3 subtrahiert, wenn 0 herraus kommt wird Zero Bit gesetzt
btfss STATUS,Z ; wenn Zerobit gesetzt wurde, wird nächster Befehl übersprungen
return ; zurück zum MAIN LOOP

bcf PORTA,0 ; PORTA Bit 0 wird gelöscht(Ausgang Pin 17)
return ; zurück zum MAIN LOOP


; ---------------
; Verzögerung Einstellbar 250ms
; ---------------
verz movlw 6 ; einstellbar 1 = 250ms 4 = 1s
movwf 0x20
verz2 movlw 250
movwf 0x21
verz3 movlw 200
movwf 0x22
verz4 nop
nop
decfsz 0x22,1
goto verz4 ; verz4 loop = 5us
decfsz 0x21,1
goto verz3 ; verz3 loop = 1000us
decfsz 0x20,1
goto verz2 ; verz2 loop = 250000us x verz1
return

END


hm ohne die zeitverzögerung und bcf im vergleich 1, kann man mit 1(RS232) rb1 high und mit 3 rb1 low schalten

DHigh
06.09.2005, 10:43
habe es schon gelöst einfach nach den verzögerungen das CREN bit gecleart und nun gehts ^^ kA warum der das gemacht hat aber anscheind hatte der nen Overrun error.
Also empfängt er Daten an RX obwohl nicht abgefragt wird ?

mfg daniel