- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: USART am PIC 16F864

  1. #1
    Brain
    Gast

    USART am PIC 16F864

    Anzeige

    Powerstation Test
    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

  2. #2
    Gast
    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

  3. #3
    Gast
    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?

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    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

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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 ?

  6. #6
    Gast
    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

  7. #7
    Gast
    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

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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 !

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    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 )

    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

    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

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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

Seite 1 von 2 12 LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen