Tina78
11.04.2007, 11:30
HELP!!!!
Hallo zusammen,
ich brauche superdringend eure Hilfe:
besuche gerade die schule für elektrotechniker und mache gerade meine techniker-abschlussarbeit.
thema: steuerung eines modellbaggers mit can-bus.
ich steuere mit einem at89s8253 (mein controller) den mcp 2515(can-controller) an über die spi-schnittstelle.
benutze den keil compiler µvision (c51)
ich habe hier ein originalprogramm von atmel, für den keil.nur funktioniert das nicht wie es solte:
spcr ist controllregister, hier werden die grundeinstellungen gemacht,
das funktioniert auch, wenn ich das programm im simulator laufen lasse.
spdr ist datenregister, wenn in spdr gerschrieben wird, beginnt die übertragung,wenn diese beendet, wird interruptflag
gesetzt, und in interruptserviceroutine gesprungen, funktioniert auch
spsr ist statusregister, hier wird dasinterruptflag gesetzt, wenn dieses register
ausgelesen oder beschrieben wird, wird interruptflag wieder gelöscht-> geht auch
nur ins spdr wird nichts übertragen!!
es wird normalmodus eingestellt, sollte aber auch funktionieren laut datenblatt,(ist ja originalprogramm)
vielleicht geht es nur im enhanced modus, hier werden buffer zum daten austausch benutzt(soweit ichs verstanden habe)
nur kapiere ich den enhanched modus nicht, was man da alles einstellen muss.
direkt am controller(wenn programm geladen) kann ich aber am spi-clock keinen takt messen,obwohl programm im simulator
taktet!?
#include "REG8253.h"
char serial_data=0x00;
char data_example=0x55;
char data_save=0x00;
bit transmit_completed= 0;
/**
* FUNCTION_PURPOSE: This file set up spi in master mode with
* Fclk Periph/128 as baud rate and with slave select pin.
* FUNCTION_INPUTS: P1.5(MISO) serial input
* FUNCTION_OUTPUTS: P1.7(MOSI) serial output
*/
void main(void)
{
SPCR |= 0x10; /* Master mode (MSTR =1)*/
P1_4=1; /* enable master */
SPCR |= 0x03; //0x82;? /* Fclk Periph/128 */
SPCR &= ~0x08; /* CPOL=0; transmit mode example */
SPCR |= 0x04; /* CPHA=1; transmit mode example */
SPCR |= 0x80; //enable spi interrupt(SPIE =1)
ES = 1; //enable spi/uart interrupt
EA=1; /* enable interrupts */
SPCR |= 0x40; /* run spi */
while(1) /* endless */
{
SPDR = data_example; /* send an example data *///HIER WIRD REGISTER NICHT GELADEN!!
while(!transmit_completed); /* wait end of transmition */
transmit_completed = 0; /* clear software transfert flag */
//-----------------------wozu sind diese anweisungen da?:
SPDR=0x00; /* data is send to generate SCK signal */
while(!transmit_completed); /* wait end of transmition */
transmit_completed = 0; /* clear software transfert flag */
data_save = serial_data; /* save receive data */
}
}
/**
* FUNCTION_PURPOSE:interrupt
* FUNCTION_INPUTS: void
* FUNCTION_OUTPUTS: transmit_complete is software transfert flag
*/
/---------------------------funktioniert so nicht, es wird interrupt 4 statt 9 ausgelöst:
void it_SPI(void) interrupt 9 /* interrupt address is 0x004B */
{
switch ( SPSR ) /* read and clear spi status register */
{
case 0x80:
serial_data=SPDR; /* read receive data */
transmit_completed=1; /* set software flag */
break;
case 0x10:
/* put here for mode fault tasking */
break;
case 0x40:
/* put here for overrun tasking */
break;
}
}
//---------------------interrupt serviceroutine,wird ausgelöst, wenn datenbyte übertragen wurde:
void it_ser() interrupt 4 /* interrupt address is 0x0023*/
{
switch ( SPSR ) /* read and clear spi status register */
{
case 0x80:
serial_data=SPDR; /* read receive data */
transmit_completed=1;/* set software flag */
break;
case 0x10:
/* put here for mode fault tasking */
break;
case 0x40:
/* put here for overrun tasking */
break;
}
}
wer von euch kann mir helfen, oder weiss eine einfachere lösung, um die kommunikation zwischen den controllern zu
managen??
viele, gaanz dicke grüsse,
Tina
Hallo zusammen,
ich brauche superdringend eure Hilfe:
besuche gerade die schule für elektrotechniker und mache gerade meine techniker-abschlussarbeit.
thema: steuerung eines modellbaggers mit can-bus.
ich steuere mit einem at89s8253 (mein controller) den mcp 2515(can-controller) an über die spi-schnittstelle.
benutze den keil compiler µvision (c51)
ich habe hier ein originalprogramm von atmel, für den keil.nur funktioniert das nicht wie es solte:
spcr ist controllregister, hier werden die grundeinstellungen gemacht,
das funktioniert auch, wenn ich das programm im simulator laufen lasse.
spdr ist datenregister, wenn in spdr gerschrieben wird, beginnt die übertragung,wenn diese beendet, wird interruptflag
gesetzt, und in interruptserviceroutine gesprungen, funktioniert auch
spsr ist statusregister, hier wird dasinterruptflag gesetzt, wenn dieses register
ausgelesen oder beschrieben wird, wird interruptflag wieder gelöscht-> geht auch
nur ins spdr wird nichts übertragen!!
es wird normalmodus eingestellt, sollte aber auch funktionieren laut datenblatt,(ist ja originalprogramm)
vielleicht geht es nur im enhanced modus, hier werden buffer zum daten austausch benutzt(soweit ichs verstanden habe)
nur kapiere ich den enhanched modus nicht, was man da alles einstellen muss.
direkt am controller(wenn programm geladen) kann ich aber am spi-clock keinen takt messen,obwohl programm im simulator
taktet!?
#include "REG8253.h"
char serial_data=0x00;
char data_example=0x55;
char data_save=0x00;
bit transmit_completed= 0;
/**
* FUNCTION_PURPOSE: This file set up spi in master mode with
* Fclk Periph/128 as baud rate and with slave select pin.
* FUNCTION_INPUTS: P1.5(MISO) serial input
* FUNCTION_OUTPUTS: P1.7(MOSI) serial output
*/
void main(void)
{
SPCR |= 0x10; /* Master mode (MSTR =1)*/
P1_4=1; /* enable master */
SPCR |= 0x03; //0x82;? /* Fclk Periph/128 */
SPCR &= ~0x08; /* CPOL=0; transmit mode example */
SPCR |= 0x04; /* CPHA=1; transmit mode example */
SPCR |= 0x80; //enable spi interrupt(SPIE =1)
ES = 1; //enable spi/uart interrupt
EA=1; /* enable interrupts */
SPCR |= 0x40; /* run spi */
while(1) /* endless */
{
SPDR = data_example; /* send an example data *///HIER WIRD REGISTER NICHT GELADEN!!
while(!transmit_completed); /* wait end of transmition */
transmit_completed = 0; /* clear software transfert flag */
//-----------------------wozu sind diese anweisungen da?:
SPDR=0x00; /* data is send to generate SCK signal */
while(!transmit_completed); /* wait end of transmition */
transmit_completed = 0; /* clear software transfert flag */
data_save = serial_data; /* save receive data */
}
}
/**
* FUNCTION_PURPOSE:interrupt
* FUNCTION_INPUTS: void
* FUNCTION_OUTPUTS: transmit_complete is software transfert flag
*/
/---------------------------funktioniert so nicht, es wird interrupt 4 statt 9 ausgelöst:
void it_SPI(void) interrupt 9 /* interrupt address is 0x004B */
{
switch ( SPSR ) /* read and clear spi status register */
{
case 0x80:
serial_data=SPDR; /* read receive data */
transmit_completed=1; /* set software flag */
break;
case 0x10:
/* put here for mode fault tasking */
break;
case 0x40:
/* put here for overrun tasking */
break;
}
}
//---------------------interrupt serviceroutine,wird ausgelöst, wenn datenbyte übertragen wurde:
void it_ser() interrupt 4 /* interrupt address is 0x0023*/
{
switch ( SPSR ) /* read and clear spi status register */
{
case 0x80:
serial_data=SPDR; /* read receive data */
transmit_completed=1;/* set software flag */
break;
case 0x10:
/* put here for mode fault tasking */
break;
case 0x40:
/* put here for overrun tasking */
break;
}
}
wer von euch kann mir helfen, oder weiss eine einfachere lösung, um die kommunikation zwischen den controllern zu
managen??
viele, gaanz dicke grüsse,
Tina