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







Zitieren

Lesezeichen