Moin,
Hat schon mal jemand den TSL201 (64 X 1 LINEAR SENSOR ARRAY) mit einem
AtMega angesteuert?
Ich habe einen AtMega88 der mit dem internen Taktgenerator arbeitet
(ohne /8 Prescaler).
Den Takt des TSL201 erzeuge ich mit dem TIMER2 im Phase-Correct PWM und
den SI Impuls direkt:
1 | TCCR2A = (0 << COM2A0) | (3 << COM2B0) | ((wgm & 0x03) << WGM20);
|
2 | TCCR2B = (((wgm >> 2) & 0x01) << WGM22) | (2 << CS20);
|
3 | TCNT2 = 0;
|
4 | OCR2A = 64;
|
5 | OCR2B = 32;
|
6 | TIMSK2 = 0; /* Disable all interrupts or (1 << OCIE2B)?? */
|
7 | DDRD |= (1 << 3) | (1 << 2);
|
8 |
|
9 | /* Clear TOV1 */
|
10 | TIFR2 |= (1 << TOV2);
|
11 | /* Wait for TOV1 */
|
12 | while ((TIFR2 & (1 << TOV2)) == 0)
|
13 | ;
|
14 | /* set PD2 */
|
15 | PORTD |= (1 << 2);
|
16 | /* Wait for TCNT2 to decrease */
|
17 | do {
|
18 | tcnt2 = TCNT2;
|
19 | } while (TCNT2 >= tcnt2);
|
20 | /* clear PD2 */
|
21 | PORTD &= ~(1 << 2);
|
Den ADC habe ich so initialisiert:
1 | ADMUX = (0 << REFS0) | (1 << ADLAR) | (0 << MUX0);
|
2 | USART_send_hex(ADMUX); USART_Transmit('\n');
|
3 | ADCSRA = (1 << ADEN) | (0 << ADSC) | (0 << ADATE) | (1 << ADIF) | (0 << ADIE) | (6 << ADPS0);
|
4 | USART_send_hex(ADCSRA); USART_Transmit('\n');
|
5 | DIDR0 = (1 << ADC0D);
|
Dann starte ich den ADC:
1 | for (i = 0; i < 64; i++)
|
2 | {
|
3 | /* Clear OCF2B */
|
4 | TIFR2 |= (1 << OCF2B);
|
5 | /* Wait for OCF2B */
|
6 | while ((TIFR2 & (1 << OCF2B)) == 0)
|
7 | ;
|
8 | /* start conversion */
|
9 | ADCSRA |= (1 << ADSC) | (1 << ADIF);
|
10 | PORTD |= (1 << 4);
|
11 | /* wait for conversion to finish */
|
12 | while ((ADCSRA & (1 << ADIF)) == 0)
|
13 | ;
|
14 | PORTD &= ~(1 << 4);
|
15 | /* read converted value into array */
|
16 | array[i] = ADCH;
|
17 | }
|
Seltsamerweise sehe ich keinen Unterschied in den Daten, egal ob der
Sensor angestrahlt oder im Dunkeln ist!