Forum: Mikrocontroller und Digitale Elektronik TSL201 und AtMega


von Josef M. (Firma: Privat) (jmoellers)


Lesenswert?

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!

von Josef M. (Firma: Privat) (jmoellers)


Lesenswert?

Problem gelöst:

Ich hatte zwei Durchläufe programmiert: einmal um den Sensor (durch 
Auslesen) zu löschen und einmal um den Sensor dann definiert auszulesen.
Natürlich muß man beim zweiten Durchlauf erneut ein SI geben, sonst 
sieht man nix ;-)

Jetzt erkenne ich, wenn ich den Sensor teilweise abdecke: nur ein Teil 
ist ff, der andere ist kleiner!

Josef

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.