-
USART am PIC 16F864
Hi
ich versuche seit geraumer Zeit die USART-Schnittstelle am PIC16F874 ans laufen zu bekommen (dh den Empfangspin RX) - leider Erfolglos. Hier ist der Quellcode auf ein Minimum reduziert. Falls jemand einen Fehler findet wäre eine Antwort cool.
MfG
Daniel
Code:
list p=16F874
#include <P16F874.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC
;********************************************************
;auf Bank 0 umschalten
bcf STATUS, RP0
; ADC ausschalten
bcf ADCON0,0
;INIT UART
bsf RCSTA, 4
bsf RCSTA, 7
bsf STATUS, RP0 ;auf Bank 1 umschalten movlw 0x09 ;Baudrate auf 31250 Baud
movwf SPBRG
bcf TXSTA, 4
bcf TXSTA, 2
; ADC auf I/O umschalten
movlw 0x06
movwf ADCON1
;PortA,0 auf Ausgang setzten
bcf TRISA,0
;PortC auf Eingang
bsf TRISC,7
;auf Bank 0 umschalten
bcf STATUS, RP0
;****** Programmstart ************************************
MIDI_IN_ST
btfss PIR1,RCIF
goto loschen
bsf PORTA,0
goto MIDI_IN_ST
loschen
bcf PORTA,0
goto MIDI_IN_ST
end
Hinweis vom Admin für den Beitragsautor:
Bitte nach Möglichkeit Listings mit dem Code Befehl markieren, sieht schöner aus. Habs mal gemacht, Du kannst mit EDIT recht oben über dem Beitrag, anschaun wie es geht. Diese Anmerkung kannst du dann gleich löschen!
Zudem bitte kein Datum beim Posten unten in dem Feld eintragen
-
Ich seh keinen Enable , fehlt aber vielleicht nur da im listing
BSF PIE1,RCIE
BSF INTCON,GIE ; generell Interrupts erlauben
BSF INTCON,PEIE ; Interrupts von Peripheriegeräten erlauben
dieser Code ist für den pic16c877, aber wird wohl bei dir so ähnlich sein
Bemerkung:
bcf TRISx , 0 setzt nur einen pin auf Output und nicht das Port
mfg
-
Hi
Ich benutze keine Interrups in diesem Programm, desswegen nicht ge-enabled. Ist aber der gleiche Code.
Ja das mit dem TRISx ist durch das Reduzieren zustande gekommen
Also kein Fehler im Programm bzw. Initialisierung?
-
Vielleicht sage ich was blödes, aber müsste nicht TRSIC auf 0b.11xx.xxxx gesetzt werden, also Pin 6 und 7, die ja von dem USART-Port besetzt werden auf 1 gesetzt werden??? Vielleicht bin ich ja blind und es ist schon im Source (tschuldige, aber ich benutzt fast 100% C), aber zumindest bei meinem 16F874 muss es so gemacht werden, damit es auch funzt... *vorSchlägenwegducken*
MfG
Mobius
-
Ich hab meine USART auch für MIDI aufgesetzt und kann bei dir so direkt keinen Fehler sehen. Baudrate is so richtig (bei 20MHZ quartz).
Bei deiner Main-Schleife blick ich aber nicht ganz durch. (Warum kein Interrupt? ist doch einfacher)
die Portc-Pins werden durch SPEN automatisch konfigurert. (mobius)
beliebter Fehler bei MIDI: am DIN-Stecker 4 u. 5 verwechseln
keine Sorge, das kriegen wir schon hin mfg
Ich seh grad im Code kein Löschen vom RCIF ?
-
Hi Mobius
Ich meine, wenn ich den nur den Eingang benutze, dh. RX würde das setzten von TrisC,7 reichen.? – Ich werde es aber auf jeden Fall mal ausprobieren
Daniel
-
Hi PicNick,
die Main-Schleife soll mir nur anzeigen, dass der Empfang funktioniert. Wenn der etwas empfangen hat soll der einfach nur den A0 setzten und wenn RCIF wieder auf low geht soll A0 auch auf low. Ich meine RCIF muss nicht gelöscht werden (Datenblatt S.102) – Da sieht das so aus als würde RCIF von selbst gelöscht. Ich hatte vorher im Code RCIF aber auch gelöscht und er wollte trotzdem nicht?!
Interrupt macht bei dem späteren Programm nicht soviel Sinn.
Am MidiIn kann es aber auch nicht liegen, da ich selbst wenn der PIC nicht mit dem MIDI-Port verbunden ist, am Ossi ein Signal bekomme.
Das bestätigt wieder meine Theorie, das PICs eine Psyche haben und manchmal mehr mit Gut-zureden zu erreichen ist. ;-))
Schon mal Dank für eure Bemühungen
Daniel
-
Hi, Daniel ! Ich lass mal alles gelten.
Das mit dem 4 u.5 würde bedeuten, daß die Polarität nicht stimmt, d.h. Signal da, Pic versteht aber nix.
Ich hab aber eine blöde Frage: woher weißt du eigentlich, daß nix funktioniert ? Wenn deine LED bei einem Byte angeht und dann wieder sofort ausgeht, wird das kaum zu erkennen sein.
Ich will dich nicht sekkieren, aber der Zustand ist nicht akzeptabel. Ich werd mir mal das Datasheet von seinem Seppel einholen und mich schlau machen. Kannst Du mir den gesamten Code zugänglich machen ?
Vielleicht hilft es, wenn du dem PIC einmal das Datasheet vorliest, vielleicht kennt er es nicht.
Noch was: liest du das (ev.) erhaltene Byte auch aus ? (sonst weigert er sich vielleicht, weiterzumachen) mfg laß hören !
-
Also, wie das verstanden habe, muss die Initialisierung so ablaufen:
1) Pin 6 & 7 auf 1 setzten (also Tx wird bei Async-Empfang als Clock verwendet, Rx als Clock bei Async-Senden, oder versteh ich was falsch :-k)
2) BAUD-Rate setzten
3) 9.Bit options setzten/entfernen
4) RCIE (oder wie das auch heißt) für empfang setzten
5) beim Empfang wird der Flag RFIE gesetzt (buffer auslesen und flag löschen, auf flag warten)
Na gut... Bin mal gespannt... Wobei ich USART nur für bidirektionale Verbindung verwende :D
Naja, Mfg
Mobius
P.S.: aber, wenn man ein Bit auf einem Port setzt, bleibt dieser dort, bis es nicht gelöscht wird... Also leuchtet es auf und bleibt an :D
-
Bist du noch da ?
Also: das RCIF brauchst du tatsächlich nicht zu löschen, das geschieht elektrisch, wenn du RCREG liest. Letzteres ist also unbedingt erforderlich, sonst geht nix.
Init nochmal geprüft, muß stimmen (f.20MHZ) aber:
FERR u. OERR u. RX9D in RCSTA löschen (wer weiss)
Wenn's dann nicht geht, isses entweder doch 4u5 am Stecker, irgendwas am Optokoppler oder eben doch die PSyche. mfg