PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielle Kommunikation PIC PC



Quibo
30.11.2007, 22:18
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.


/*



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);
}

theborg
01.12.2007, 00:18
hm ich hab bei dem SPBRG Wert 9 raus

Quibo
01.12.2007, 14:50
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).

theborg
01.12.2007, 14:57
versuch mal nicht nen H zu senden sondern den hex wert

Quibo
01.12.2007, 15:11
funktioniert auch nicht immer noch das gleiche Resultat

Quibo
01.12.2007, 22:37
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 (C18) beim 2550 nicht, kennt jemand die Ursache?

Quibo
01.12.2007, 23:23
Problem gelöst musst nur noch den CPU Prescaler einstellen

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