Hemets
08.06.2007, 15:49
Hallo
ich programmiere gerade für ein Projekt einen PIC der 2x LIN und CAN ansprechen soll. Dies funktioniert schon, aber leider nicht die Datenübertragung vom PC zum PIC.
Ich verwende einen PIC18F6585 und Programmiere mit PIC-C von CCS.
Da ich keinen RS232 Port mehr frei habe wollte ich es mit einen MAX3110 über die SPI Schnittstelle kompensieren.
Ablauf sollte so sein:
PC sendet Daten an den PIC der diese an den LIN Bus weiterleiten soll.
also:
PC sendet Daten auf RS232 Schnittstelle
PIC initaisiert max3110 und setzt ihn auf lesen
wenn max3110 Daten empfängt wird IRQ SSP (aktivität auf SPI Bus) augelöst
in der IRQ Routine wird vom SPI gelesen, die Daten verarbeitet, ein ACK gesendet und den max3110 wieder auf lesen gesetzt.
und wenn alle Daten da sind werden diese an den LIN Bus gesendet
das müsste ja funktionieren, tut es aber nicht!
Der Interrupt wird nie ausgelöst, aber die Daten werden an den Max3110 gesendet, da ich das schon mit Portmon kontrolliert habe.
Leider finde ich den Fehler nicht. Hab ich einen Denkfehler oder muss ich auf etwas bestimmtes Achten?
main.c:
#int_SSP //ISR for SPI activity
SSP_isr()
{
int i, j;
byte A_byte;
unsigned long temp;
int count;
A_byte = spi_read(); //liest die Daten vom Bus
spi_write(0xC609); //setze alle flags vom Max3110 zurück
LIN_Msg = LIN_Msg & A_byte;
LIN_Msg << 8;
count++;
if (count == 8)
{
count = 0;
temp = LIN_Msg;
if ( ((temp << 6) == 0) && (LIN_Msg > 0) )
{
MessID = LIN_Msg >> 58;
LIN_Msg = 0x00000000000;
}
else
{
linMessage(MessID, LIN_Msg, MessLen);
}
LIN_Msg = 0;
spi_write(0x8000 | 0x11); //schreibt ein ACK an PC zurück
spi_write(0x0000); //setze MAX3110 in den Lesemodus
}
}
/************************************************** ****************************/
/*
Hauptprogramm: main()
Initialisiert SPI und PIC
Endlosschleife, dass der PIC aktiv bleibt
Funktionen: CSWake() Sendet wakeup-Signal an den PIC
linWakeUp() Weckt den LIN Bus
spi_write() Initialisiert den MAX3110 mit den unten stehenden Parametern
*/
/************************************************** ****************************/
void main()
{
unsigned char msg[8];
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_4);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
setup_oscillator(False);
CSWake();
linWakeUp();
spi_write(0xED09);
/*
Hiermit wird eingestellt:
•= Baudrate = 19200bps
•= 8 Bit Daten
•= kein Parity
•= 1 Stopbit
•= alle nötigen Interrupts erzeugen
•= Stromsparmodus aus (/SHTDN)
•= Polarität der CTS RTS Signale
•= FIFO enabled
*/
spi_write(0x0000); //setze MAX3110 in den Lesemodus
while (1)
{
}
}
vielen Dank im vorraus für eure Antworten.
LG
Hemets
ich programmiere gerade für ein Projekt einen PIC der 2x LIN und CAN ansprechen soll. Dies funktioniert schon, aber leider nicht die Datenübertragung vom PC zum PIC.
Ich verwende einen PIC18F6585 und Programmiere mit PIC-C von CCS.
Da ich keinen RS232 Port mehr frei habe wollte ich es mit einen MAX3110 über die SPI Schnittstelle kompensieren.
Ablauf sollte so sein:
PC sendet Daten an den PIC der diese an den LIN Bus weiterleiten soll.
also:
PC sendet Daten auf RS232 Schnittstelle
PIC initaisiert max3110 und setzt ihn auf lesen
wenn max3110 Daten empfängt wird IRQ SSP (aktivität auf SPI Bus) augelöst
in der IRQ Routine wird vom SPI gelesen, die Daten verarbeitet, ein ACK gesendet und den max3110 wieder auf lesen gesetzt.
und wenn alle Daten da sind werden diese an den LIN Bus gesendet
das müsste ja funktionieren, tut es aber nicht!
Der Interrupt wird nie ausgelöst, aber die Daten werden an den Max3110 gesendet, da ich das schon mit Portmon kontrolliert habe.
Leider finde ich den Fehler nicht. Hab ich einen Denkfehler oder muss ich auf etwas bestimmtes Achten?
main.c:
#int_SSP //ISR for SPI activity
SSP_isr()
{
int i, j;
byte A_byte;
unsigned long temp;
int count;
A_byte = spi_read(); //liest die Daten vom Bus
spi_write(0xC609); //setze alle flags vom Max3110 zurück
LIN_Msg = LIN_Msg & A_byte;
LIN_Msg << 8;
count++;
if (count == 8)
{
count = 0;
temp = LIN_Msg;
if ( ((temp << 6) == 0) && (LIN_Msg > 0) )
{
MessID = LIN_Msg >> 58;
LIN_Msg = 0x00000000000;
}
else
{
linMessage(MessID, LIN_Msg, MessLen);
}
LIN_Msg = 0;
spi_write(0x8000 | 0x11); //schreibt ein ACK an PC zurück
spi_write(0x0000); //setze MAX3110 in den Lesemodus
}
}
/************************************************** ****************************/
/*
Hauptprogramm: main()
Initialisiert SPI und PIC
Endlosschleife, dass der PIC aktiv bleibt
Funktionen: CSWake() Sendet wakeup-Signal an den PIC
linWakeUp() Weckt den LIN Bus
spi_write() Initialisiert den MAX3110 mit den unten stehenden Parametern
*/
/************************************************** ****************************/
void main()
{
unsigned char msg[8];
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_4);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
setup_oscillator(False);
CSWake();
linWakeUp();
spi_write(0xED09);
/*
Hiermit wird eingestellt:
•= Baudrate = 19200bps
•= 8 Bit Daten
•= kein Parity
•= 1 Stopbit
•= alle nötigen Interrupts erzeugen
•= Stromsparmodus aus (/SHTDN)
•= Polarität der CTS RTS Signale
•= FIFO enabled
*/
spi_write(0x0000); //setze MAX3110 in den Lesemodus
while (1)
{
}
}
vielen Dank im vorraus für eure Antworten.
LG
Hemets