Hi,
Ich würde gerne Daten von meinem Rechner zu einem 18f1320 senden aber irgendwie klappt das noch nicht so richtig ich hab ein Aplictionboard von ner C-control genomen und von dort wo normalerweise die C-Control reingestekt wird gehe ich von RXD auf RXD von meinem PIC mit einem draht. und von TXD auf TXD von meinem PIC das hab ich gemacht weil da schon ein MAX 232 drauf sitzt. diese seite ist in ordnung weil wenn ich ne C-Control anschliese dann empfängt die Daten vom Rechner aber wenn ich meinen PIC anstatt der C-Control anschliese dann passiert nichts.
Der PIC soll später mal eine RGB LED matrix ansteuern mit 100 RGB LEDs
mein Progamm Code in C (ich verwende den C18 Compiler):
/** I N C L U D E S **********************************************************/
#include <p18cxxx.h>
#include "delays.h" // für die Warteschleife
#include "usart.h" // für RS232
/** Configuration ********************************************************/
#pragma config OSC = HSPLL //CPU= 10MHz x 4 = 40MHz
#pragma config PWRT = OFF //Power UP Timer
#pragma config BOR = OFF //Brown Out Reset
#pragma config WDT = OFF //Watchdog Timer
#pragma config LVP = OFF //Low Voltage ICSP
/** D E C L A R A T I O N S **************************************************/
void update(void);
char sortbits(char);
#pragma udata gpr0
unsigned char LED[100]; //Momentaner Status der LEDs
unsigned char LEDbuff[100]; //Ausgabe buffer (für später)
unsigned char lzeiger; //Lese Zeiger
unsigned char szeiger; //Schreib zeiger
unsigned char data; //Daten buffer für RS232 char
/** M A I N **************************************************/
#pragma code
void main(void)
{
LATA = 0x00; //0 in Register A schreiben
LATB = 0x00; //0 in Register B schreiben
TRISA = 0b11111100; //Ausgänge von Register A setzen 0=Matrix Reset 1=Matrix Takt
TRISB = 0b00010000; //Ausgänge von Register B setzen Zustand einer RGB LED 3Farben x 3Zustände (Aus/Hell/Dunkel)
OpenUSART( USART_TX_INT_OFF & //USART Initialisieren
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_HIGH,260 ); //9600 Baud
szeiger = 1; //Zeiger setzen
lzeiger = 1; //Zeiger setzen
while(lzeiger <= 100) //Anfangs muster definieren jede zweite LED ein
{
LED[lzeiger] = 0b11101101;
lzeiger = lzeiger + 2;
}
while(1) //Matrix Zyklus
{
LATAbits.LATA0 = 1; //Matrix reset bit auf 1
lzeiger = 1; //Lese zeiger auf 1
Delay10TCYx(1); //Warten für die Langsamen C-MOS Schieberegister
LATAbits.LATA0 = 0; //Matrix reset bit auf 0
while(lzeiger <= 100) //LED Zyklus
{
LATAbits.LATA1 = 1; //Matrix Takt bit auf 1
LATB = LED[lzeiger]; //LED Zustand setzen
update(); //RS232 Update und warten damit die LED zeit hat zum leuchten
LATAbits.LATA1 = 0; //Matrix Takt bit auf 0
lzeiger = lzeiger + 1; //Lese Zeiger + 1
LATB = 0; //LED Zustand Löschen
} //end LED Zyklus
} //end Matrix Zyklus
} //end main
void update(void) //RS232 Update
{
if DataRdyUSART() //Sind daten im speicher?
{
data = getcUSART(); //ein Byte in den Buffer schreiben (später müssen noch steuerbyts ausgewertet werden)
LED[szeiger] = sortbits(data); //Bits sortieren weil ich zwei ports mitendrin für RS232 brauche
szeiger = szeiger + 1; //Schreib Zeiger + 1
if (szeiger > 100) //Ist Schreibzeiger > 100
szeiger = 1; //Schreibzeiger = 1
}
else //Sind keine Daten im Speicher
Delay100TCYx(12); //Warten 100x12 Zyklen
} //end RS232 Update
char sortbits(char in) //Bits sortieren
{
char out;
if (in&0x01) //Bit 0 nach 0
((out) |= 1);
if ((in>>1)&0x01) //Bit 1 nach 2
((out) |= 1 << (2));
if ((in>>2)&0x01) //Bit 2 nach 3
((out) |= 1 << (3));
if ((in>>3)&0x01) //Bit 3 nach 5
((out) |= 1 << (5));
if ((in>>4)&0x01) //Bit 4 nach 6
((out) |= 1 << (6));
if ((in>>5)&0x01) //Bit 5 nach 7
{
((out) |= 1 << (7));
}
return out; //ergebnis zurück
} //end Bits sortieren
Der PIC befindet sich zum testen auf einer Lochraster platiene da ich für meine PIC und das Aplictionboard zwei verschiedene spannungsversorgungen hab hab ich beide massen verbunden. wenn ich jetz ein byte mit meinem rechner sende dann passiert nichts die funktion DataRdyUSART() gibt immer 0 aus. Die zeilen wo ich den Status meiner LED ins Register schreibe LATB = LED[lzeiger]; und LATB = 0; hab ich auch schon probiert rauszunehmen falls ich die daten an den ports RB1(TXD) und RB4(RXD) überschreibe. bringt aber nix. Was mach ich falsch? ich würde gerne wissen ob mein Programm in ordnung ist oder ob ich was vergessen hab. ich arbeite nämlich erst seit ein paar Tagen mit PICs. Achja ich hab auch noch das Linkerskript geändert

weil ich sonst zu wenig RAM für variablen hab könnte das vieleicht daran liegen?
_________________
Und denkt immer daran...
Aus großer Kraft folgt große Verantwortung!