Gast
#635195
Hallo,
ich habe hier ein kleines Problem bzw. Fragen zu den PORT Befehlen.
Ich arbeite hier an einem Atmel AT90CAN.
Über PORT A werden Daten geschickt oder gelesen, das wird anhand eines
Flags von PORTB entschieden, desweiteren enthält PORT B noch 3 Bytes für
eine Adresse (welches Datenbyte ich von einer Karte lesen will) und
einer Chipselectadresse.
Also das Prinzip ist so, das ich bei PORTB eine bestimmte Adresse
angeben so das eine Karte mir Daten auf den Datenbus der an PORTA geht
anlegt.
Irgendwie schafft er es aber nicht immer das richtige zu lesen, somit
habe ich eine Frage, gibt es "Regeln" in welcher Reihenfolge oder in
welchem Abstand ich bestimmte PORT Befehle nur benutzen darf?
Momentan sieht das ganze so aus:
unsigned char ReadIO(unsigned char ucSlot, unsigned char ucByteNumber)
{
unsigned char ucData = 0x00;
unsigned char ucAdresse = 0x00;
cli();
DDRA = 0x00;
PORTA = 0x00;
DDRB = 0xFF;
ucAdresse = ( 0xA0 | (g_aucIOSlotBitMask[ucSlot] & 0x18) |
(ucByteNumber & 0x07)) ;
PORTB = ucAdresse;
PORTB &= ~(1<<PB5);
mywait();
ucData = PINA;
PORTB |= (1<<PB5);
PORTB = 0xFF;
sei();
return ucData;
}
Quellcode zu myWait:
void mywait(void)
{
DDRD &= 0xFE;
do
{
}while( (PIND & 0x01) == 0x00 );
}
Bei wait wartet er einfach bis ein PIND1 wieder auf 1 gesetzt wird von
dem "Kommunikationspartner". Dabei ist DDRD mit DDRD &= 0xFE
initialisiert zum lesen und es wird (PIND & 0x01) in einer Whileschleife
nur angefragt.
Also meine Frage ist einfach, kann es daran liegen das hier bestimmte
befehle zu schnell hintereinander kommen??? Oder woran kann noch so ein
Fehler liegen?
Danke für eure Hilfe im Vorraus