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