Forum: Mikrocontroller und Digitale Elektronik Problem bei C Programmierung


von Alex X. (behindi)


Lesenswert?

Hallo,

Ich hab da ne frage und es ware super wenn mir da jemand helfen könnte.

Also ich möchte den Zustand eines PINs in ein Array schreibn,
ich habs so mal versucht aber es funktioniert nicht.

status_register[0]=LATDbits.LATD2;

LATCbits.LATC0=status_register[0];         // zum testn obs funzt

das Programm lässt sich compilieren und ausführen abhesehen davon dass 
das array nicht beschrieben wird.

TRISD ist 0x04-daher sollte RD2 ein Eingan sein.
TRISC ist 0x00- PortC = Autput
und den PIN RD2 hab ich auf High;

(ich verwende MPLAP C18 Compiler)

danke im voraus für alle Beiträge

mgf
alex

von R. F. (rfr)


Lesenswert?

Wie sind 90026742 und LATCbits.LATC0=status_register[0] definiert?

Gruss

Robert

von Alex X. (behindi)


Lesenswert?

status_register[0] ist ein integer (int)

mgf

von R. F. (rfr)


Lesenswert?

Bei sowas wie

status_register[0]=LATDbits.LATD2;

würden viele über logische Operatoren nachdenken.


Gruss

Robert

von Michael S. (rbs_phoenix)


Lesenswert?

Versuch mal beim Lesen den PORT zu nehmen und nicht LAT. LAT ist ansich 
nur zum Ausgang über ein Latch setzen. Dich interessiert beim lesen aber 
nicht das Latch sondern der Portpin.

von Peter D. (peda)


Lesenswert?

alex le. schrieb:
> status_register[0] ist ein integer (int)

Ist nicht gerade effektiv, ein Bit als 16Bit-Wert zu speichern (1500% 
Verschwendung).


Peter

von Alex X. (behindi)


Lesenswert?

Ja aber ich mach das weil ich dann mit schleifen arbeiten kann, hier 
sollen dann die Ausgangszustände meines SPI EEPROMs hineingeschrieben 
werden, anschließend sschreib ich die ganzen Bits schon in eine 
Variable,

wenn du ne bessere Lösung hast dann wär es toll wenn du mir helfen 
könntest:)

von R. F. (rfr)


Lesenswert?

Verwende ein unsigned char.

unsigned char Status = 0 ;  /* initialer Zustand  */

Schreibe das bit rein

Status = PORTA.1              /* soll das bit bezeichnen */

if ( Status )    {...}        /* mach was, was gesetztes Bit anzeigt  */
else         {...}            /* mach was anderes                     */

 Gruss

Robert

von Peter D. (peda)


Lesenswert?

alex le. schrieb:
> Ja aber ich mach das weil ich dann mit schleifen arbeiten kann,

Schieben (<<, >>) gehen doch prima in Schleifen.

alex le. schrieb:
> hier
> sollen dann die Ausgangszustände meines SPI EEPROMs hineingeschrieben
> werden, anschließend sschreib ich die ganzen Bits schon in eine
> Variable,

Dann nimm das HW-SPI oder mach SPI in SW. Hier ein Beispiel für den AVR:
1
uint16_t shift_io16( uint16_t b )               // send / receive word
2
{
3
  uint8_t i;
4
5
  SPI_CLK_DDR = 1;                              // set as output
6
  SPI_MOSI_DDR = 1;
7
8
  for( i = 16; i; i-- ){                        // 16 bits
9
    SPI_MOSI = 0;
10
    if( b & 0x8000 )                            // high bit first
11
      SPI_MOSI = 1;
12
    b <<= 1;
13
    SPI_CLK = 1;
14
    if( SPI_MISO_PIN )
15
      b++;
16
    SPI_CLK = 0;
17
  }
18
  return b;
19
}


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.