Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] 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
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
Zitat aus 'm Datenblatt
1. Initialize the SPBRG register for the appropriate
baud rate. If a high speed baud rate is desired,
set bit BRGH (Section 9.1). -> falsche Reihenfolge
2. Enable the asynchronous serial port by clearing
bit SYNC and setting bit SPEN. -> SPEN nicht gesetzt!
3. If interrupts are desired, then set enable bit
RCIE.
4. If 9-bit reception is desired, then set bit RX9.
5. Enable the reception by setting bit CREN.
6. Flag bit RCIF will be set when reception is complete
and an interrupt will be generated if enable
bit RCIE is set.
7. Read the RCSTA register to get the ninth bit (if
enabled) and determine if any error occurred
during reception.
8. Read the 8-bit received data by reading the
RCREG register.
9. If any error occurred, clear the error by clearing
enable bit CREN.
10. If using interrupts, ensure that GIE and PEIE
(bits 7 and 6) of the INTCON register are set.
korrigier erstmal das und dann poste, ob du Erfolg hattest, oder nicht...
Wenn nicht, dann setz ich mich mal genauer mit dem Problem auseinander...
MfG
Stefan
PS: Sorry dass ich mich erst heute deinem Problem annehme, aber bin grad etwas darmgrippig...
Jaaaaaaaa!!!!!!
Ihr seit die Besten, Döner und Bier für alle!
Sagenhaft - es funktioniert. Wenn ich jetzt die BPM-Zahl erhöhe sieht man sogar die Zunahme der Klötzchen am Ossi. Ein High Pegel ist zwar Permanent da aber das wird sich schon in den Griff bekommen lassen.
Fät merci
Daniel
Ein Phänomen, das zu ergründen wäre:
Kaum macht man's richtig, geht's auch schon :-)
Genau...
es ist einfach toll, wie einfach alles wird, wenn man mal einen Blick ins Datenblatt geworfen hat... ;) :D <-- hier hat das fiese Grinsen des Smilies seine Berechtigung... auch wenn er sonst eher ein :) ausdrücken sollte... ;)
Naja Herr Stegr
das Datenblatt habe ich sehr sehr oft benutzt (ohne gehts glaube ich kaum) aber mir war bis dato nicht bewusst, dass bei der init auch noch die spezielle Reienfolge zu beachten ist!
ne, ist ja ok...
Wenn die Frage jetzt ganz direkt im Datenblatt beantwortet stehen würde, wäre ich mit vier Buchstaben ausgekommen...
Aber hier hilft man doch eigentlich gerne weiter... und manche Sachen überliest man leicht, vor allem dann, wenn man nicht ganz so tief in der Materie drinnen steckt...
Und ansonsten können 150 Seiten Datenblatt und nochmal 400 Seiten Reference Manual schon abschreckend wirken... Die liest man normalerweise nicht grade als Bettlektüre...
Und jetzt wünsch ich dir viel Spass bei Musi machen... Wenn du wieder auf Probleme stößt, einfach fragen... ;)
MfG
Stefan
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.