Hi m1cha,
hoffentlich treffe ich Dein Problem.
... Zeile1aus z.B. 32Bit lang ... Buchstabe 8Bit und ... an eine ganz bestimmte Stelle schreiben ...
Ich hatte das in meinen PingPong-Projekten gemacht - Bits abfragen, setzen und löschen. Ungefähr so:
Code:
// - - - - - - - - - - - - - - -
//#define SetL (xk,y) ( L[xk] |= ((uint16_t)1 << (y))
// Setzt Bit
volatile uint16_t L[20]; // LED-Reihe 1 bis 10, Rest ist Dummy
// ...
// - - - - - - - - - - - - - - -
// Jetzt altes Rack links löschen und neues setzen
cli(); //
lPr = RKL_POSa ; // Positioniere auf alten LED-Platz
L[lPr] &= ~((uint16_t)1<<15); // Lösche LEDBit lPr (rechtes Poti)
L[lPr-1] &= ~((uint16_t)1<<15); // Lösche LEDBit lPr-1
// - - - - - - - - - - - - - - -
lPr = RKL_POSn + 12; // Unterkante NEUES, rechtes Rack
L[lPr] |= ((uint16_t)1<<15); // Setze LEDBit lPr (rechtes Poti)
L[lPr-1] |= ((uint16_t)1<<15); // Setze LEDBit lPr-1
RKL_POSa = lPr; // Neuwert ist bereits alt
sei(); //// ...
// - - - - - - - - - - - - - - -
Sind nicht sooo lange LED-Bitmuster wie bei Dir, aber das System sollte passen.
Dazu könne man natürlich z.B. mit den Defines
Code:
#define SetBit(ADDR,BIT) ((ADDR) |= (1<<(BIT))) // Setzt Bit
#define ClrBit(ADDR,BIT) ((ADDR) &= ~(1<<(BIT))) // Löscht Bit
#define IsBitSet(ADDR,BIT) (((ADDR) & (1<<BIT))?1:0) // Fragt Bit = 1?
#define IsBitClr(ADDR,BIT) ((!(ADDR) & ~(1<<BIT))) // Fragt Bit = 0
das "Schiebegeschäft" bequem und übersichtlich erledigen. ABER - meine Laufschrift ist wegen anderer Projekte in den Kinderschuhen stecken geblieben.
Lesezeichen