PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme bei USART-Ini.



Jen
03.12.2004, 09:13
Hallo,

ich versuche schon einige Tage lang, meinem PIC das Senden von Daten beizubringen. Aber irgendwie stellt er sich stur.

Hier mein Initialisierungscode:



Ini_start

; Setzen der Ein- und Ausgänge
BANK_1 ; alle Pins, die nicht belegt sind, werden als
; Eingänge initialisiert, um Kurzschlüsse zu
; vermeiden
movlw b'11111011' ; Pin-Belegung
movwf TRISA ; in TRIS-Register schreiben (konfiguriert PORT)

movlw b'11100011'
movwf TRISB

movlw b'00001000' ; TMR0: 1/4 Pic-Takt, RB0-I:
movwf OPTION_REG ; fallende Flanke

movlw b'11000000' ; Interrupts konfigurieren (RB0,
movwf INTCON ; PORTB, generell=1)

BANK_0
; Pegel der Ein- und Ausgänge initialisieren
movlw b'00000100' ; initialisieren der Pegel
movwf PORTA ; in PORT-Register schreiben

movlw b'00111001' movwf PORTB
; initialisieren von TMR1
movlw b'00000111'
movwf T1CON

; alle Comparatoreingänge auf Digital umschalten
bsf CMCON, CM0
bsf CMCON, CM1
bsf CMCON, CM2

clrf adresse

call LED_B ; hier blinkt eine LED
; BIS HIER HIN FUNKTIONIERT´S!!!!

; USART initialisieren
BANK_1
movlw b'01000000'
movwf SPBRG ; Baudrate 19200

bcf TXSTA, TXEN

movlw b'00000100'
movwf TXSTA ; Sender

call LED_B

BANK_0
bcf RCSTA, CREN

movlw b'10000000'
movwf RCSTA ; Empfänger

call LED_B

clrf PIR1 ; alle Interrupt-Flags löschen

BANK_1
bsf TXSTA, TXEN
bsf PIE1, TXIE ; Sender-Interrupt zulassen

return



Das Main ruft nach Ini_start dann nochmal LED_B auf. Wird aber nicht gemacht. Wegen irgendwas kommt der PIC nicht aus Ini_start raus.

Sieht einer den Fehler? Welche Fehler könnten denn in der Hardware sein?
Die Pins für RX und TX gehen auf ein MAX232, aber nicht während des Programmierens oder ausführen des Programms, es wird erst zu geschaltet, wenn ausgelesen werden soll.

Hier noch einige Daten: PIC16F628, programmiert wird in Assembler, JDM Programmer.

Bitte helft mir, ich verzweifle sonst noch [-o<

LG
Jen

PicNick
03.12.2004, 10:08
Schau mal
Ich definiere zwar ne andere Baudrate, aber so geht's zumindest (Die Bank-selectionen hab ich weggelassen, die weißt du ja)
MOVLW 0x20
MOVWF TXSTA
MOVLW 0x90 ;
MOVWF RCSTA
MOVLW D'9' Set Baud rate 31,250 BPS (MIDI) at 20 MHz
MOVWF SPBRG
BCF TXSTA, BRGH
BSF PIE1,RCIE
BSF PIE1,TXIE

BSF INTCON,GIE // Interrrupts general enab
BSF INTCON,PEIE // + device interrrupts enab

Anm: Init endet mit "return"--> Wird sie auch mit "CALL" aufgerufen ?
2 . Ist die LED-Routine sicher in Ordnung ? denn falsch oder richtig, DURCHLAUFEN muß er in jedem Fall
mfg

Jen
03.12.2004, 10:15
Hallo,

danke erstmal für deine Antwort.

Ja,Ini_start wird vom main aufgerufen.

Die LED-Routine ist in Ordnung, sobald ich die gesamte USART-Ini. auskommentiere, funktioniert das Ganze auch wieder. Aber das ist ja nicht Sinn und Zweck der Sache. :(

LG
Jen

PicNick
03.12.2004, 10:19
Logo.
nochmal "aufgerufen" ---> CALL oder JMP (branch, goto) ???
der Kerl MUSS zurückkommen richtig oder falsch initialisiert, egal.
Next : die Init-statements alle auskommentieren, dann einzeln wieder dazu geben
Wie gesagt, es is mal wurst, ob der INIT auch stimmt, Erst geht's mal ums überleben mfg

Jen
03.12.2004, 10:23
Call

das andere werd ich gleich mal ausprobieren

LG

Jen
03.12.2004, 13:39
Hallo,

hab mich jetzt auf die Weise durchgekämpft, wie du gesagt hast.

Hab zuerst einmal den Pin der LED gewechselt, denn den, wo ich die LED bis jetzt hatte wollt er nicht.

Dann bin ich nach und nach die Ini. durchgegangen. Folgendes macht er nicht richtig:


BANK_1
movlw b'01000000'
movwf SPBRG ; Baudrate 19200

(nur eine LED blinkt ohne "Betriebsanzeige")


BANK_1
bsf TXSTA, TXEN
bsf PIE1, TXIE ; Sender-Interrupt zulassen

(beide LED blinken ohne "Betriebsanzeige")

Damit die Sachen in Klammern verstanden werden, hier noch schnell, was mein Programm derzeit macht:



; UP
; LED-Warten
Warte_100 ; 100ms
movlw b'1100100'
movwf warte_ko
Warte
movlw b'11111001' movwf warte_1m
LOOP_1m
NOP ; 20Zyklen
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
decfsz warte_1m,f ; 1ms
goto LOOP_1m
decfsz warte_ko,f
goto Warte
return

; UP
; Blinken durch Auslesen aus EEPROM
eeblinken
bsf INTCON, GIE ; Interrupts allgemein zu lassen
movfw adresse
call eeread
movwf PORTB

incf adresse, f ; Adresse erhöhen
btfsc adresse, 1 ; Adresse = '00000010' = 2 ??
clrf adresse ; zurück zur Adresse 0

call Warte_100
goto eeblinken
return

; UP
; EEPROM auslesen
eeread
BANK_1
movwf EEADR
bsf EECON1,RD
movf EEDATA,w BANK_0

return

; UP
; EEPROM beschreiben

eeschreiben
BANK_1
movlw 0x00
movwf EEADR movfw zahl_2
movwf EEDATA bsf EECON1,WREN
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
call Warte_100

movlw 0x01
movwf EEADR movfw zahl_3
movwf EEDATA bsf EECON1,WREN
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
call Warte_100
BANK_0
return

; UP
; Rechnen
eerechnen
movlw d'20'
movwf zahl_1

movlw d'4'
subwf zahl_1,w
movwf zahl_2 ; hier müsste jetzt 16 drin stehen

movlw d'12'
subwf zahl_1,w
movwf zahl_3 ; hier müsste jetzt 8 drin stehen
return

; UP
; LED-Betriebsanzeige
LED_B
movlw 0x0A
movwf blin_10
LOOP_B
bcf PORTA,2
call Warte_100
bsf PORTA,2
call Warte_100
decfsz blin_10,f
goto LOOP_B
return

; Hauptprogramm
main
call Ini_start
call LED_B
call eerechnen
call eeschreiben
call eeblinken

end


Wieso funkionieren nur die obigen Code-Teile nicht richtig?
Kann es sein, dass sie wegen irgendetwas übersprungen werden?

LG
Jen

PicNick
03.12.2004, 14:14
Gut, ich seh schon, ich muß das heute auf meinem Pic mal probieren, ich rühr' mich.
Eines WICHTIG: Die PIC's sind heikel auf dir Reihenfolge der Initialisierung, das wissen wir schon.
Vielleicht: Erst durch das Setzen von SPEN im RCSTA definiert sich der Bursche seine Pins für RxTx. Das machst du relativ spät., vielleicht hängt er sich deswegen auf
Ein Rat noch im Moment: Mach die Initialisierung von der Reihenfolge her klitzeklein genau so wie bei mir (mit Deinen Baud-Werten natürlich). Ich kann damit seit Monaten kreuz- und quer USARTen.
Nach dem Initialisieren kannst du dann sicher enablen und disablen, wie du magst,
! aber tu' mir die Liebe und versuchs mal.!
Wie gesagt, ich probier's daheim mal durch, vielleich kann ich den gleichen Fehler verursachen., mal sehen. bis dann Robert

Jen
06.12.2004, 07:01
Hallo!

DANKE! DANKE! DANKE!

Dein Tipp mit der Reihenfolge hat geholfen!!!! Hab ein paar Sachen umgestellt und jetzt funktioniert´s!!!!! \:D/

LG
Jen

PicNick
06.12.2004, 08:53
Wieder das Phänomen:
Kaum macht du es richtig, geht's auch schon O:)
also, auf geht's mfg robert