-         
Ergebnis 1 bis 7 von 7

Thema: Serielle Kommunikation PIC PC

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2007
    Beiträge
    5

    Serielle Kommunikation PIC PC

    Anzeige

    Ich habe ein Problem, wenn ich mit diesem Code zum Test ein 'H' an den Pc senden will, empfängt er ein Quadrad und ein Hoch drei zeichen. An was kann das liegen?

    Ich verwende ein 18f2550 mit einem 16MHz Quarz.

    Code:
    /*
    
    
    
    TX --> Senden	  --> RC6
    RX --> Empfangen  --> RC7
    
    */
    
    #include <p18f2550.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    
    
    
    //Configuration *********************************************************
    #pragma config FOSC = HS
    #pragma config PWRT = ON
    #pragma config BOR = OFF
    #pragma config WDT = OFF //Watchdog-Timer
    #pragma config LVP = OFF //Low Voltage
    //***********************************************************************
    
    void serialInit(void);		// RS232 initialieren
    void ser_send(char zeichen); 	// Sendet Byte
    char ser_recive(int wait);	// schaut eine angegebene Zeit ob etwas empfangen wird
    
    void main(void)
    {
    int i=30000;
    
    TRISA = 0x00;
    TRISB = 0x00;
    TRISC = 0x80; // Hier wird RC7 als Eingang und RC6 als Ausgang definiert 
     
    serialInit();  // Initialisierung der RS232-Schnittstelle
     INTCONbits.GIE=1;
    INTCONbits.PEIE=1;
       while (1)
       {i=30000;
    	while(i--!=0);
    	PORTA=255;
         ser_send('H');
    	i=30000;
    	while(i--!=0);
    	PORTA=0;
       }
    }
    
    
    
    void serialInit(void)
    {
    
    PIE1bits.TXIE=1;         
    PIE1bits.RCIE=1;  
    
    TXSTAbits.SYNC = 0;	// Das SYNC-Bit auf 0 gesetzt, weil hier der SCI-Modus nicht benötigt wird
    TXSTAbits.TX9=0;
    TXSTAbits.SENDB=0;
    
    BAUDCONbits.BRG16=0;
    TXSTAbits.BRGH = 1;	// Mit dem BRGH-Bit wird der Baudratenbereich ausgewählt, sollte es gesetzt
    		// sein wird der High Speed Bereich aktiviert
     
    SPBRG = 64; 	// 9600 BAUD bei 16MHz Taktfrequenz
    		// SPBRG = (Fosc/ (Baud * 16) ) -1
    		// SPBRG = (4000000 / ( 9600 * 16) ) -1
    		// SPBRG = 25
    
    RCSTAbits.SPEN = 1;	// Durch das SPEN-Bit wird der Serial Port aktiviert, damit können die Pins
    		// der USART-Schnittstelle konfiguriert werden
     
    TXSTAbits.TXEN = 1; 	// Der Datentransfer wird aktiviert
    RCSTAbits.CREN = 1; 	// Der Datenempfang wird aktiviert
    RCSTAbits.RX9=0;
    }
    
    
    void ser_send(char zeichen)
    { int n = 250;
    
       while(!TXSTAbits.TRMT && n--)		// Wenn der Buffer leer ist und Daten gesendet werden dürfen
       			// Bei grossen Datenmengen sollte TRMT Bit abgefragt werden,			
       			// da dieses erst gesetzt wird wenn Byte gesendet ist   
    {
    	Delay10TCYx(10);
    }
       TXREG = 125;   	// Daten werden in das TXREG-Register gespeichert und gesendet       
    PIR1bits.TXIF=0;
    }
    
    
    char ser_recive(int wait)
    {
       while(wait--!=0)
       {
            if (PIR1bits.RCIF)    		// Wurden Daten empfangen, wird das RCIF-Bit gesetzt
            {
               return(RCREG);  	// Empfangene Daten werden vom RCREG-Register geholt und zurückgegeben
            }
       } 
    
    return(0xff);
    }

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    36
    Beiträge
    1.002
    hm ich hab bei dem SPBRG Wert 9 raus
    Legastheniker on Bord !

    http://www.Grautier.com - Projektseite
    http://www.grautier.com/wiki/doku.php?id=bt-index - BT-BUS

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2007
    Beiträge
    5
    Ich habe es nochmals nachgerechnet.

    Mit der Formel komme ich auf 103:

    SPBRG = 103; // 9600 BAUD bei 16MHz Taktfrequenz
    // SPBRG = (Fosc/ (Baud * 16) ) -1
    // SPBRG = (16000000 / ( 9600 * 16) ) -1
    // SPBRG = 103

    Es funktioniert immer noch nicht weder mit 9 oder 103.

    Das Komische ist das immer 2 Zeichen empfangen werden(siehe Anhang).
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken terminal_459.jpg  

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    36
    Beiträge
    1.002
    versuch mal nicht nen H zu senden sondern den hex wert
    Legastheniker on Bord !

    http://www.Grautier.com - Projektseite
    http://www.grautier.com/wiki/doku.php?id=bt-index - BT-BUS

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2007
    Beiträge
    5
    funktioniert auch nicht immer noch das gleiche Resultat

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2007
    Beiträge
    5
    Ich habe das ganze jetzt mit einem 18F4480 getestet, da funktioniert alles wunderbar. Ich habe festgestellt, dass die LED's an PortA beim 18F4480 schneller blinken als beim 18F2550.

    Wahrscheinlich liegt es an der Config, beim
    25550 habe ich #pragma config FOSC = HS geschriben und beim
    4480 #pragma config OSC = HS

    Aber OSC erkennt der Compiler (C1 beim 2550 nicht, kennt jemand die Ursache?

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2007
    Beiträge
    5
    Problem gelöst musst nur noch den CPU Prescaler einstellen

    #pragma config FOSC = HS
    #pragma config CPUDIV = OSC1_PLL2

Berechtigungen

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