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:
#define F_CPU 8000000UL
#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;
}
}
}
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;
sei();
TCCR1B |= (1 << WGM12);
TIMSK |= (1 << OCIE1A) | (1 << OCIE1B) ;
OCR1A = 32000;
OCR1B = 100;
UCSRA = (1 << MPCM);
UCSRB = (1 << RXEN) | (1 << TXEN)| (1 << UCSZ2);
UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
UBRRH = (BAUD_PRESCALE >> 8);
UBRRL = BAUD_PRESCALE;
for(;;)
{
while ((UCSRA & (1 << RXC)) == 0) {};
receivedbyte = UDR;
if (receivedbyte == 21)
{
UCSRA &=~(1 << MPCM);
while ((UCSRA & (1 << RXC)) == 0) {};
receivedbyte = UDR;
if (receivedbyte == 0b11110000)
{
_delay_ms(3);
start_scan = 1;
column_counter_byte_1 = 0;
column_counter_byte_2 = 0;
column_counter_byte_3 = 0;
}
if (receivedbyte == 0b00000001)
{
_delay_ms(5);
start_send_data_byte_1 = 1;
}
if (receivedbyte == 0b00000010)
{
_delay_ms(5);
start_send_data_byte_2 = 1;
}
if (receivedbyte == 0b00000011)
{
_delay_ms(5);
start_send_data_byte_3 = 1;
}
while ((UCSRA & (1 << RXC)) == 0) {};
receivedbyte = UDR;
if (receivedbyte == 0b11111111)
{
UCSRA = (1 << MPCM);
}
}
while (start_scan == 1)
{
TCCR1B |= (1 << CS10);
}
if (start_scan == 0)
{
TCCR1B &= ~(1 << CS10);
byte_1 = 0;
}
while (start_send_data_byte_1 == 1)
{
PORTD |= (1 << PIND3);
PORTD |= (1 << PIND2);
for (shift_byte_out = 0; shift_byte_out < 302; shift_byte_out ++)
{
while ((UCSRA & (1 << UDRE)) == 0) {};
bytetosend = columns_byte_1[shift_byte_out];
UDR = bytetosend;
}
start_send_data_byte_1 = 0;
PORTD &= ~(1 << PIND3);
}
while (start_send_data_byte_2 == 1)
{
PORTD |= (1 << PIND4);
PORTD |= (1 << PIND2);
for (shift_byte_out = 0; shift_byte_out < 302; shift_byte_out ++)
{
while ((UCSRA & (1 << UDRE)) == 0) {};
bytetosend = columns_byte_2[shift_byte_out];
UDR = bytetosend;
}
start_send_data_byte_2 = 0;
PORTD &= ~(1 << PIND4);
}
while (start_send_data_byte_3 == 1)
{
PORTD |= (1 << PIND7);
PORTD |= (1 << PIND2);
for (shift_byte_out = 0; shift_byte_out < 302; shift_byte_out ++)
{
while ((UCSRA & (1 << UDRE)) == 0) {};
bytetosend = columns_byte_3[shift_byte_out];
UDR = bytetosend;
}
start_send_data_byte_3 = 0;
PORTD &= ~(1 << PIND7);
}
if (start_send_data_byte_3 == 0)
{
PORTD &= ~(1 << PIND2);
}
}
}
[Bericht gewijzigd door
trix
op dinsdag 4 augustus 2020 17:39:02
(100%)