Einzelne Bits lesen und setzen

Hallo, ich muss bei meinen Matrizen die Ansteuerung etwas umschreiben. Angesteuert werden diese über MAX7219. Zum Ansteuern benötige ich die Spaltenadresse sowie ein Byte für die Zeilen.

Jedoch ist bei mir das ganze um 90° gedreht, da es nur so mit den Pinreihen geht. Nun möchte ich gerne Spalten und Zeilen tauschen.

Nun klappt jedoch meine Funktion nicht wie sie soll. Eingelesen werden soll von jeder Spalte der x. Wert (Variable t) und entsprechend neu zusammengesetzt werden.

uint8_t max7219_buffer[MAX7219_NUM_IC*8]  =
/* Spalten zusammenfassen*/
{
	// 0bx Zeile 0 - Zeile 7
	/* Spalte 0 */ 0b11111111, // x x x x x x x x
	/* Spalte 1 */ 0b11010000, // x x - x - - - -
	/* Spalte 2 */ 0b10101000, // x - x - x - - -
	/* Spalte 3 */ 0b10010100, // x - - x - x - -
	/* Spalte 4 */ 0b10001010, // x - - - x - x -
	/* Spalte 5 */ 0b10000101, // x - - - - x - x
	/* Spalte 6 */ 0b10000010, // x - - - - - x -
	/* Spalte 7 */ 0b10000001, // x - - - - - - x
};

void max7219_out()
{
	uint8_t num_ic = 0;
	while(num_ic < MAX7219_NUM_IC)
	{
		uint8_t conv_val = 0;

		for(int t = 0; t < 8; t++)
		{
			conv_val = ((max7219_buffer[t] & (1 << t))) << t;
		}

		max7219_send(num_ic, 1, conv_val);
		max7219_send(num_ic, 2, 0b01000000);
		conv_val = 0;
	}
}

Das würde z.B. so gehen:

void max7219_out()
{
	uint8_t num_ic = 0;
	while(num_ic < MAX7219_NUM_IC)
	{
		uint8_t conv_val = 0;

                
                for(int t = 0; t < 8; t++)
		{
                  bitSet(conVal, t, bitRead(max7219_buffer[t], num_ic));
                }


		max7219_send(num_ic, 1, conv_val);
		max7219_send(num_ic, 2, 0b01000000);
		conv_val = 0;

                num_ic++; // mal ergänzt, da ansonsten die schleife ewig läuft.

	}
}

Wenn du die Bits unbedingt von Hand schieben willst geht es z.B. so:

conVal |= (((max7219_buffer[t] >> num_ic) & 0x01) << t);

Ich halt mich bei sowas immer an die Regel:
Erst die Daten die geschrieben werden sollen ins richtige Format bringen und dann an die richtige Stelle schieben.

Ich mein natürlich
writeBit und readBit anstatt bitRead und bitSet

Wo ist eigentlich die Edit Funktion für Beiträge hin ?

Dank dir. Arduino libs stehen mir nicht zur Verfügung.

Richtig wie folgt

conv_val |= ((max7219_buffer[t] & 0x01) << t);

Keine Ahnung wo die Edit Funktion hin verschwunden ist.

bitRead und bitWrite sind auch keine Lib Funktionen, sondern Macros die könntest du dir auch selbst definieren:

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))

Man kann nur noch sehr kurz editieren. Wenn man das Thread verlässt kann man auch nicht mehr editieren. Da haben sich schon andere Leute drüber beschwert:
http://forum.arduino.cc/index.php?topic=274838.0

Hallo,

offtopic

Das kann man halten wie man möchte. Damit wird ausgeschlossen, wie es schon der Fall war mit so einem Typen hier, das jemand sein Beitrag total sinnfrei verändert oder löscht und alle folgenden Antworten keinen Sinn mehr ergeben. In anderen Foren hat man zum Bsp. 15min Zeit zum editieren oder bis zur Antwort darauf. Je nachdem was zuerst eintritt. Halte ich schon für sinnvoll.

Was mir auffällt ist, ich bekomme keine Benachrichtigungsmails mehr auf Antworten.

Ich finde das mit der Editierfunktion recht mies. Ist im mcnet Forum so, dass man nach 60Minuten nichts mehr editieren kann. Dann muss man lange in den Antworten nach einer Lösung suchen.

Sinnvoller wäre es, wenn man seinen ersten Beitrag wieder ändern könnte, um den derzeitigen Stand oder die Lösung mit hinzuzufügen. Oder das man zumindest etwas unter seinen eigenen Beitrag nachsetzen könnte. Solche Pappenheimer, wie von der beschrieben, gehen garnicht.

Damit der Thread auch als solches erledigt ist,
gelöst nun wie folgt.

/*
* max7219.c
*
* Created: 22.10.2014 18:57:03
*  Author: sschultewolter
*/


#include "max7219.h"
#include "font.h"

#define bit_read(value, bit) (((value) >> (bit)) & 0x01)
#define bit_set(value, bit) ((value) |= (1UL << (bit)))
#define bit_clear(value, bit) ((value) &= ~(1UL << (bit)))
#define bit_write(value, bit, bitvalue) (bitvalue ? bit_set(value, bit) : bit_clear(value, bit))

uint8_t max7219_buffer[MAX7219_MAX_COL+1];
[...]

void max7219_out(void)
{
	uint8_t num_ic = 0;
	while(num_ic < MAX7219_NUM_IC)
	{
		uint8_t value = 0;
		for(int8_t i = 0; i <  8; i++)
		{
			for(int8_t t = 0; t < 8; t++)	bit_write(value, t, bit_read(max7219_buffer[(num_ic * 8) + 7 - t], 7 - i));
			
			if(max7219_buffer_invert) value = 255 - value; 
			max7219_send(num_ic, (i % 8) + 1, value);
			value = 0;
		}
		num_ic++;
	}
}

[...]

void max7219_puts_scroll(char *s)
{
	const uint8_t width = 8;
	uint8_t size_str = strlen(s);
	
	int i = 0;
	static int j = 0;
	
	while(i <= MAX7219_MAX_COL)
	{
		uint8_t x = s[((i + j) / width) % size_str];
		uint8_t y = ((i + j) % width);
		max7219_write_buffer(i, pgm_read_byte(&font_bold[x][y]));
		i++;
	}
	if(++j > (size_str * width) - 1) j = 0;
}