bits van input in een byte zetten.

trix

Golden Member

nog ees de code waar het fout gaat:

c code:


case 7 : { byte_1 |= ((PINC & 0x01) & (check_bit == 1));

als ik het een beetje goed begrijp, dan is het stukje:

c code:


(PINC & 0x01)

goed.

alleen het stukje:

c code:


(check_bit == 1)

is waarschijnlijk fout. ik ken aan check_bit de waarde 1 toe door middel van:

c code:


check_bit = 1;

maar dit hoeft natuurlijk niet gelijk aan 0b00000001 te zijn.
en in b.v. case 5 : moet check_bit 0b00000100 zijn.

dus dit moet ik waarschijnlijk anders doen.

eigenwijs = ook wijs
trix

Golden Member

omdat ik zoals eerder vermeld de code had gecopieerd v/d IR zender (TSAL) en deze had aangepast voor de TSOP-en, zaten er wat onnodige dingen in, die wel werkte, maar onder het motto simpel is beter heb ik die eruit gesloopt (o.a. de 38kHz "draag golf" voor de IR-led's). ook wat dingen eruit gesloopt die eigenlijk voor weergave op de logic-analyzer waren bedoeld, zodat er een code overblijft die alleen het noodzakelijk bevat.

verder heb ik het advies van henri62 overgenomen, dus niet 2 mS lang kijken naar de input pin v/d TSOP, maar in de ISR direkt naar de input pin kijken.
die ISR ga ik 1,5 mS later in om te zorgen dat ik in het midden v/d TSAL puls zit.

ik zou trouwens nog in gewoon mensen taal uitleggen wat nou precies de bedoeling van de code is. deze code is enkel en alleen voor de IR ontvangers (TSOP).

bedoeling code:
- er zitten 24x een TSOP op een atmega32 verdeeld over 3 poorten A B en C.
- na een comando v/d hoofd controller "TSOP start your scan" gaan die 24x input pinnen v/d TSOP-en 1 voor 1 worden afgevraagd ("1" of "0")
- de statussen v/d input pinnen worden in de atmega 32 opgeslagen.
- later, als de hoofd controller daarom vraagt word de data v/d atmega 32 naar de hoofd controller gestuurd.

thats it........niet meer en niet minder.

alles werkt, op een ding na :( en ik zie het voor als nog gewoon niet.

c code:


case 6 : { byte_1 |= (PINC & 0x02); break; }

hier is het de bedoeling dat de status van PINC1 in byte_1 word gezet zonder de overige bits te veranderen.
dekees heeft al gezegd dat dat ook het geval is,.....maar iets gaat er fout. (kan ook gewoon aan mij liggen).

om mijn eigen te overtuigen dat de rest wel werkt, verander ik het in:

c code:


case 6 : { byte_1 = 0b11001100; break; }

en dan zie ik keurig dat bit patroon (11001100), op mijn display (die zit op de hoofd controller).

om niet afhankelijk te zijn v/h infrarood licht v/d IR led's, heb ik de TSOP-en (8x om te testen op POORTC) hardware matig aan +5 en 0V gesoldeerd met het patroon 0b00111100. maar dat krijg ik dus niet op mijn display.

voor de volledigheid post ik nog eens mijn aan gepaste code.

ik hoop dat iemand ziet wat er fout gaat, mijn dank zal groot zijn :)

c code:


//*** 4-8-2020 (2) ******************************************************************************************
// TESTING THE RS485 UART TSOP ***************************************************************************

// fuse: ext. crystal/resonater medium freq. start up 16 64
// fuse: J-tag uitvinken

#define F_CPU 8000000UL // 8 MHz clock speed

#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

	int check_bit		= 0;

	int receivedbyte	= 0;
	int bytetosend	    = 0;
	int column_counter_byte_1	= 0;
	int column_counter_byte_2	= 0;
	int column_counter_byte_3	= 0;	
	
	int byte_1          = 0;
	int byte_2          = 0;
	int byte_3          = 0;			

	uint8_t BitCounter   = 0;		
	
	volatile start_scan = 0;
	int start_send_data_byte_1 = 0;
	int start_send_data_byte_2 = 0;
	int start_send_data_byte_3 = 0;
	int shift_byte_out  = 0;
	 
	uint8_t columns_byte_1 [300]; 
	uint8_t columns_byte_2 [300]; 
	uint8_t columns_byte_3 [300]; 
	 
ISR(TIMER1_COMPA_vect)
{
static uint8_t BitCounter   = 0;
			
	switch(BitCounter++)
	{
				
		case 0 : { byte_1 |= (PINC & 0x80); PORTD |= (1 << PIND3); break; } 				
		case 1 : { byte_1 |= (PINC & 0x40); break; }
		case 2 : { byte_1 |= (PINC & 0x20); break; }
		case 3 : { byte_1 |= (PINC & 0x10); break; }
		case 4 : { byte_1 |= (PINC & 0x08); break; }
		case 5 : { byte_1 |= (PINC & 0x04); break; }
		case 6 : { byte_1 |= (PINC & 0x02); break; }
		case 7 : { byte_1 |= (PINC & 0x01); 
			if(column_counter_byte_1 < sizeof(columns_byte_1) )
			{					
				columns_byte_1 [column_counter_byte_1] = byte_1; 
				column_counter_byte_1 += 1;
			}
				break; 
		}			

		case 8 : { byte_2 |= (PINA & 0x80); PORTD |= (1 << PIND4); PORTD &= ~(1 << PIND3); break; }
		case 9 : { byte_2 |= (PINA & 0x40);  break; }
		case 10: { byte_2 |= (PINA & 0x20);  break; }
		case 11: { byte_2 |= (PINA & 0x10);  break; }
		case 12: { byte_2 |= (PINA & 0x08);  break; }
		case 13: { byte_2 |= (PINA & 0x04);  break; }
		case 14: { byte_2 |= (PINA & 0x02);  break; }
		case 15: { byte_2 |= (PINA & 0x01);
			if(column_counter_byte_2 < sizeof(columns_byte_2) )
			{
				columns_byte_2 [column_counter_byte_2] = byte_2; 
				column_counter_byte_2 += 1;
			}
			break;
		}
			
		case 16: { byte_3 |= (PINB & 0x80); PORTD |= (1 << PIND7); PORTD &= ~(1 << PIND4); break; }
		case 17: { byte_3 |= (PINB & 0x40);  break; }
		case 18: { byte_3 |= (PINB & 0x20);  break; }
		case 19: { byte_3 |= (PINB & 0x10);  break; }
		case 20: { byte_3 |= (PINB & 0x08);  break; }
		case 21: { byte_3 |= (PINB & 0x04);  break; }
		case 22: { byte_3 |= (PINB & 0x02);  break; }
		case 23: { byte_3 |= (PINB & 0x01);
			if(column_counter_byte_3 < sizeof(columns_byte_3) )
			{					  
				columns_byte_3 [column_counter_byte_3] = byte_3; 
				column_counter_byte_3 += 1;
			}
				  break;
		}

		case 24:
		{
		   PORTD &= ~(1 << PIND7);
		   BitCounter = 0;
   		   start_scan = 0;				   
		   break;
		}
	} // from: switch 				
} // from: ISR

ISR(TIMER1_COMPB_vect) 
{
	PORTB = 0;
	PORTA = 0; 
	PORTC = 0;
}	

int main(void)
{
	DDRA = 0b00000000;
	PORTA = 0b11111111; 
		
	DDRB = 0b00000000;
	PORTB = 0b11111111;
	
	DDRC = 0b00000000;
	PORTC = 0b11111111;
		
	DDRD = 0b11111110; // PD0 = RXD
//	PORTD = 0b00000001;		
		
	sei();		
		
	TCCR1B |= (1 << WGM12); // CTC-mode,
	TIMSK  |= (1 << OCIE1A)	| (1 << OCIE1B) ; // timer1 A & B compare match interrupt enabled

	OCR1A = 32000; // 4mS
	OCR1B = 100;		
		
	UCSRA = (1 << MPCM); // enable: multi processor communication mode
	UCSRB = (1 << RXEN) | (1 << TXEN)| (1 << UCSZ2);   // Turn on the transmission and reception circuit
	UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // 9-bit mode, URSEL bit for selecting UCSRC
						
	UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
	UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
						
	for(;;)
	{									
		while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR
		receivedbyte = UDR; // Fetch the received byte value into the variable "ReceivedByte"

//*** adress numbering: TSAL 1-20 and TSOP 21-40 *******************************************************				
		if (receivedbyte == 21) // adress byte
		{					
			UCSRA  &=~(1 << MPCM); // make MPCM "0"
				
			while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR
			receivedbyte = UDR; // Fetch the received byte value into the variable "ReceivedByte"
					
			if (receivedbyte == 0b11110000) // is the data byte: start your scan
			{										
				_delay_ms(3); // to make we look 1 mS after the TSAL puls is started
				start_scan = 1;
				column_counter_byte_1	= 0; // 0, so that the first saved byte comes on 0 in the array
				column_counter_byte_2	= 0;
				column_counter_byte_3	= 0; 					
			}
					
			if (receivedbyte == 0b00000001) // is the data byte: send the data 1e byte to the master
			{
				_delay_ms(5);
				start_send_data_byte_1 = 1;
			}
					
			if (receivedbyte == 0b00000010) // is the data byte: send the data 2e byte to the master
			{
												
				_delay_ms(5);
				start_send_data_byte_2 = 1;
			}
					
			if (receivedbyte == 0b00000011) // is the data byte: send the data 3e byte to the master
			{
				_delay_ms(5);
				start_send_data_byte_3 = 1;
			}
										
			while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR
			receivedbyte = UDR; // Fetch the received byte value into the variable "ReceivedByte"
					
			if (receivedbyte == 0b11111111) // is the stop byte
			{						
				UCSRA = (1 << MPCM); // enable: multi processor communication mode
			}										
		}
				
//********** TSOP ****************************************************************************************				
				
	while (start_scan == 1)
	{					
		TCCR1B |= (1 << CS10); // start timer with prescaler = 0
//	   		PORTA = byte_1;	// for testing ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
								
	}
				
	if (start_scan == 0)
	{									    
		TCCR1B &= ~(1 << CS10); // stop timer with prescaler = 0
		byte_1 = 0;	// waarschijnlijk alleen voor testen^^^^^^^^^^^^^^^^^^				
	}				
					
	while (start_send_data_byte_1 == 1)
	{															
		PORTD |= (1 << PIND3); // for checking rood  = "1" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^					
					
		PORTD |= (1 << PIND2); // switch MAX485 as transmitter pin 2 & 3 = "1"
		
		for (shift_byte_out = 0; shift_byte_out < 302; shift_byte_out ++) //test ^^^^^^^^^^^^^^
		{
			while ((UCSRA & (1 << UDRE)) == 0) {}; // do nothing till the UDR is ready to receive
					
			bytetosend = columns_byte_1[shift_byte_out]; // TEST array ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
						
			UDR = bytetosend;
		}
					
		start_send_data_byte_1 = 0;
		PORTD &= ~(1 << PIND3); // for checking rood  = "0" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	}					
	 				
	while (start_send_data_byte_2 == 1)
	{															
		PORTD |= (1 << PIND4); // // for checking geel  = "1" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^					
					
		PORTD |= (1 << PIND2); // switch MAX485 as transmitter pin 2 & 3 = "1"
										
		for (shift_byte_out = 0; shift_byte_out < 302; shift_byte_out ++)
		{
			while ((UCSRA & (1 << UDRE)) == 0) {}; // do nothing till the UDR is ready to receive
					
			bytetosend = columns_byte_2[shift_byte_out]; // TEST array ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
						
			UDR = bytetosend;
		}
					
		start_send_data_byte_2 = 0;
		PORTD &= ~(1 << PIND4); // for checking geel  = "0" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	}			
					
	while (start_send_data_byte_3 == 1)
	{									
		PORTD |= (1 << PIND7);	// for checking groen  = "1" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^					
					
		PORTD |= (1 << PIND2); // switch MAX485 as transmitter pin 2 & 3 = "1"
								
		for (shift_byte_out = 0; shift_byte_out < 302; shift_byte_out ++)
		{
			while ((UCSRA & (1 << UDRE)) == 0) {}; // do nothing till the UDR is ready to receive
						
			bytetosend = columns_byte_3[shift_byte_out]; // TEST array ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
						
			UDR = bytetosend;
		}
					
		start_send_data_byte_3 = 0;
		PORTD &= ~(1 << PIND7); // for checking groen  = "0" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	}				
					
	if (start_send_data_byte_3 == 0)
	{
		PORTD &= ~(1 << PIND2); // switch MAX485 as receiver pin 2 & 3 = "0"					
					
	}				
				
		} // from: for (;;)
} // from: main	

[Bericht gewijzigd door trix op dinsdag 4 augustus 2020 17:39:02 (100%)

eigenwijs = ook wijs

code:


   case 6 : { byte_1 |= (PINC & 0x02); break; }

Je doet hier een OR operatie zodat bit 2 in byte_1 gezet wordt als PINC.2 hoog is.

Maar ik zie nergens dat er ook bits worden gereset. Je begint wel met byte_1 = 0, maar vervolgens kunnen de bits alleen nog maar omhoog. Iemand zal die toch voor elke scan moeten resetten.

En dat geldt ook voor byte_2 en byte_3 denk ik.

trix

Golden Member

ik test nu met 1 scan (dus niet elke = meerdere).
ik geef het programma maar 1x een start (0b11110000) en dat vult de array dus met maar 1 byte.
dus ik vermoed dat wat je suggereert toch niet DE oplossing is.
bovendien gaat mijn vaste test bit patroon 0b11001100 wel zonder problemen.

neemt niet weg dat er nog gereset moet worden. tnx.

eigenwijs = ook wijs
trix

Golden Member

tussendstand:

het werkt,......de interne pull-up op PORTC (allemaal TSOP-en) was de boosdoener :(. deze dus uitgeschakeld.
nu nog een start timings probleempje.

straks als alles werkt zal ik nog eens de werkende code plaatsen voor de volledigheid. want ik heb er naar aanleiding van dekees & henri62 ook nog wat in veranderd.
bedankt zover _/-\o_

edit:
timings probleempje opgelosd, en de code nog wat opgeschoond:
op naar het volgend probleem :).

c code:


//*** 5-8-2020 *******************************************************************************************
// TESTING THE RS485 UART TSOP ***************************************************************************
// fuse: ext. crystal/resonater medium freq. start up 16 64
// fuse: J-tag uitvinken

#define F_CPU 8000000UL // 8 MHz clock speed

#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)	

	int receivedbyte	= 0;
	int bytetosend	    = 0;
	int column_counter_byte_1	= 0;
	int column_counter_byte_2	= 0;
	int column_counter_byte_3	= 0;	
	
	int byte_1          = 0;
	int byte_2          = 0;
	int byte_3          = 0;			

	uint8_t BitCounter   = 0;		
	
	volatile start_scan = 0;
	int start_send_data_byte_1 = 0;
	int start_send_data_byte_2 = 0;
	int start_send_data_byte_3 = 0;
	int shift_byte_out  = 0;
	 
	uint8_t columns_byte_1 [300]; 
	uint8_t columns_byte_2 [300]; 
	uint8_t columns_byte_3 [300]; 
	 
ISR(TIMER1_COMPA_vect)
{
static uint8_t BitCounter   = 0;
			
	switch(BitCounter++)
	{
				
	case 0 : { byte_1 |= (PINC & 0x80); PORTD |= (1 << PIND3); break; } 				
	case 1 : { byte_1 |= (PINC & 0x40); break; }
	case 2 : { byte_1 |= (PINC & 0x20); break; }
	case 3 : { byte_1 |= (PINC & 0x10); break; }
	case 4 : { byte_1 |= (PINC & 0x08); break; }
	case 5 : { byte_1 |= (PINC & 0x04); break; }
	case 6 : { byte_1 |= (PINC & 0x02); break; }
	case 7 : { byte_1 |= (PINC & 0x01); 
		if(column_counter_byte_1 < sizeof(columns_byte_1) )
		{										
			columns_byte_1 [column_counter_byte_1] = byte_1; 
			column_counter_byte_1 += 1;
		}
			break; 
	}			

	case 8 : { byte_2 |= (PINA & 0x80); PORTD |= (1 << PIND4); PORTD &= ~(1 << PIND3); break; }
	case 9 : { byte_2 |= (PINA & 0x40); break; }
	case 10: { byte_2 |= (PINA & 0x20); break; }
	case 11: { byte_2 |= (PINA & 0x10); break; }
	case 12: { byte_2 |= (PINA & 0x08); break; }
	case 13: { byte_2 |= (PINA & 0x04); break; }
	case 14: { byte_2 |= (PINA & 0x02); break; }
	case 15: { byte_2 |= (PINA & 0x01);
		if(column_counter_byte_2 < sizeof(columns_byte_2) )
		{
			columns_byte_2 [column_counter_byte_2] = byte_2; 
			column_counter_byte_2 += 1;
		}
		break;
	}
			
	case 16: { byte_3 |= (PINB & 0x80); PORTD |= (1 << PIND7); PORTD &= ~(1 << PIND4); break; }
	case 17: { byte_3 |= (PINB & 0x40); break; }
	case 18: { byte_3 |= (PINB & 0x20); break; }
	case 19: { byte_3 |= (PINB & 0x10); break; }
	case 20: { byte_3 |= (PINB & 0x08); break; }
	case 21: { byte_3 |= (PINB & 0x04); break; }
	case 22: { byte_3 |= (PINB & 0x02); break; }
	case 23: { byte_3 |= (PINB & 0x01);
		if(column_counter_byte_3 < sizeof(columns_byte_3) )
		{					  
			columns_byte_3 [column_counter_byte_3] = byte_3; 
			column_counter_byte_3 += 1;
		}
			break;
		}

	case 24:
	{		   
	    PORTD &= ~(1 << PIND7);
	    BitCounter = 0;
   	    start_scan = 0;
	    byte_1 = 0;
	    byte_2 = 0;
	    byte_3 = 0;  				   
	    break;
	}
	} // from: switch 				
} // from: ISR

int main(void)
{
	DDRA = 0b00000000;
	PORTA = 0b11111111; 
		
	DDRB = 0b00000000;
	PORTB = 0b11111111;
	
	DDRC = 0b00000000;
//	PORTC = 0b11111111; // have to be out for the correct working
		
	DDRD = 0b11111110; // PD0 = RXD
//	PORTD = 0b00000001;		
		
	sei();		
		
	TCCR1B |= (1 << WGM12); // CTC-mode,
	TIMSK  |= (1 << OCIE1A); // timer1 A compare match interrupt enabled

	OCR1A = 32000; // 4mS		
		
	UCSRA = (1 << MPCM); // enable: multi processor communication mode
	UCSRB = (1 << RXEN) | (1 << TXEN)| (1 << UCSZ2);   // Turn on the transmission and reception circuit
	UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // 9-bit mode, URSEL bit for selecting UCSRC
						
	UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
	UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
						
	for(;;)
	{									
	        while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR
		receivedbyte = UDR; // Fetch the received byte value into the variable "ReceivedByte"

//*** adress numbering: TSAL 1-20 and TSOP 21-40 *******************************************************				
		if (receivedbyte == 21) // adress byte
		{					
			UCSRA  &=~(1 << MPCM); // make MPCM "0"
				
			while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR
			receivedbyte = UDR; // Fetch the received byte value into the variable "ReceivedByte"
					
			if (receivedbyte == 0b11110000) // is the data byte: start your scan
			{
				start_scan = 1;
				column_counter_byte_1	= 0; // 0, so that the first saved byte comes on 0 in the array
				column_counter_byte_2	= 0;
				column_counter_byte_3	= 0; 					
			}
					
			if (receivedbyte == 0b00000001) // is the data byte: send the data 1e byte to the master
			{
				_delay_ms(5);
				start_send_data_byte_1 = 1;
			}
					
			if (receivedbyte == 0b00000010) // is the data byte: send the data 2e byte to the master
			{
												
				_delay_ms(5);
				start_send_data_byte_2 = 1;
			}
					
			if (receivedbyte == 0b00000011) // is the data byte: send the data 3e byte to the master
			{
				_delay_ms(5);
				start_send_data_byte_3 = 1;
			}
										
			while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR
			receivedbyte = UDR; // Fetch the received byte value into the variable "ReceivedByte"
					
			if (receivedbyte == 0b11111111) // is the stop byte
			{						
				UCSRA = (1 << MPCM); // enable: multi processor communication mode
			}										
		}
				
//********** TSOP ****************************************************************************************				
				
	while (start_scan == 1)
	{					
		TCCR1B |= (1 << CS10); // start timer with prescaler = 0
//	   		PORTA = byte_1;	// for testing ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
								
	}
				
	if (start_scan == 0)
	{									    
		TCCR1B &= ~(1 << CS10); // stop timer with prescaler = 0
		byte_1 = 0;	// waarschijnlijk alleen voor testen^^^^^^^^^^^^^^^^^^				
	}				
					
	while (start_send_data_byte_1 == 1)
	{															
		PORTD |= (1 << PIND3); // for checking rood  = "1" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^					
					
		PORTD |= (1 << PIND2); // switch MAX485 as transmitter pin 2 & 3 = "1"
		
		for (shift_byte_out = 0; shift_byte_out < 302; shift_byte_out ++) //test ^^^^^^^^^^^^^^
		{
			while ((UCSRA & (1 << UDRE)) == 0) {}; // do nothing till the UDR is ready to receive
					
			bytetosend = columns_byte_1[shift_byte_out]; // TEST array ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
						
			UDR = bytetosend;
		}
					
		start_send_data_byte_1 = 0;
		PORTD &= ~(1 << PIND3); // for checking rood  = "0" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	}					
	 				
	while (start_send_data_byte_2 == 1)
	{															
		PORTD |= (1 << PIND4); // // for checking geel  = "1" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^					
					
		PORTD |= (1 << PIND2); // switch MAX485 as transmitter pin 2 & 3 = "1"
										
		for (shift_byte_out = 0; shift_byte_out < 302; shift_byte_out ++)
		{
			while ((UCSRA & (1 << UDRE)) == 0) {}; // do nothing till the UDR is ready to receive
					
			bytetosend = columns_byte_2[shift_byte_out]; // TEST array ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
						
			UDR = bytetosend;
		}
					
		start_send_data_byte_2 = 0;
		PORTD &= ~(1 << PIND4); // for checking geel  = "0" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	}			
					
	while (start_send_data_byte_3 == 1)
	{									
		PORTD |= (1 << PIND7);	// for checking groen  = "1" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^					
					
		PORTD |= (1 << PIND2); // switch MAX485 as transmitter pin 2 & 3 = "1"
								
		for (shift_byte_out = 0; shift_byte_out < 302; shift_byte_out ++)
		{
			while ((UCSRA & (1 << UDRE)) == 0) {}; // do nothing till the UDR is ready to receive
						
			bytetosend = columns_byte_3[shift_byte_out]; // TEST array ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
						
			UDR = bytetosend;
		}
					
		start_send_data_byte_3 = 0;
		PORTD &= ~(1 << PIND7); // for checking groen  = "0" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	}				
					
	if (start_send_data_byte_3 == 0)
	{
		PORTD &= ~(1 << PIND2); // switch MAX485 as receiver pin 2 & 3 = "0"					
					
	}				
				
		} // from: for (;;)
} // from: main
eigenwijs = ook wijs