Forum: Compiler & IDEs Problem IO Port


von Martin W. (tschini)


Lesenswert?

Hallo,

Ich habe ein Problem bei dem ich absolut nicht nachvollziehen kann wie 
es zustande kommt. Ich habe ein paar LEDs in meiner Schaltung, die ich 
an bestimmten stellen an und aus schalte um optisch feedback zu 
bekommen. Das funktioniert so weit ganz gut, jedoch habe konnte ich 
nachdem ich den Code ein bisschen umstrukturiert habe die LED am Port B0 
nicht mehr einschalten. nach ein bisschen probieren fand ich heraus, 
dass meine Funktion SPIInit und zwar die erste zeile probleme macht... 
Jedoch verstehe ich nicht warum, da ich bei dem port mit bitmasken ja 
nur ein bit verändere.

main.c
1
  DDRD = (1 << PD5)| (1 << PD6) | (1 << PD7);
2
  DDRB |= (1 << PB0);
3
  PORTB |= 1 << PB0;
4
  SPIInit();            // SPI Schnittstelle initialisieren
5
  TimerInit();          // Timer Initialisieren
6
  USARTInit(UBRR_VALUE);       // UART Initialisieren
7
  ADCInit();            // ADC Initialisieren
8
  RFM70_Init();          // RFM70 Initialisieren
9
  //DDRB |= (1 << PB0); //schreibe ich den Befehl hier funktioniert alles aber warum !?
10
  //PORTB |= 1 << PB0;  
11
sei();
12
  while(1)
13
.
14
.
15
.

SpiInit
1
void SPIInit()
2
{
3
  DDRB = (1<<CSN)|(1<<MOSI)|(1<<SCK)|(1<<CE);      //  Outputs für Master definieren // SCK / MOSI / SS
4
  DDRB &= ~(1<<MISO);                  // Input Miso
5
  DDRD &=~ (1<<IRQ);                  // INT0 als Input für Interrupt
6
  SPCR = 0x50;                    //  SPEN = 1 MSTR=1 / spi aktivieren prescaler 4
7
  PORTB |= 1<<CSN;                  // SS auf high --> kommunikation mit dem Modul nicht möglich muss auf low gesetzt werden                  // CE als output
8
  PORTB &= ~(1<<CE);                  // auf low setzen
9
}

.h file
1
// SPI Port definition
2
#define CE PB1
3
#define CSN PB2
4
#define MOSI PB3
5
#define MISO PB4
6
#define SCK PB5
7
#define IRQ PD2

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Martin Walchshofer schrieb:
> DDRB = (1<<CSN)|(1<<MOSI)|(1<<SCK)|(1<<CE);      //  Outputs für Master 
definieren // SCK  MOSI  SS

Da steht =

Damit überschreibst Du alles, was Du vorher in DDRB geschrieben hast.

Vergleiche das mal mit Deiner anderen "Initialisierung" von DDRB, da 
verwendest Du nicht =

von Martin W. (tschini)


Lesenswert?

oh ok verstehe damit wird meine bitmaske zugewiesen und nicht mit dem 
vorherigen stand verglichen

vielen Dank!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Um einen Vergleich geht es nicht.

Sieh Dir einfach mal in Deinem C-Buch (das Du ja wohl hoffentlich schon 
aufgeschlagen hast) den Unterschied zwischen

  a = b

und

  a |= b

sowie

  a &= b

an.

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.