kramann.info
© Guido Kramann

Login: Passwort:










5.3 ADW0 testen

5.3 (EN google-translate)

5.3 (PL google-translate)

Einfacher Test des Entfernungssensors bei ADW0: Die Nähe eines Hindernisses wird als Helligkeit der LEDs umgesetzt, indem ein PWM-Signal "selber programmiert" wird.

Einfacher Test mit LEDs
//   avr-gcc -O2 -mmcu=atmega32 adww.c -o adww.elf 
//   avr-objcopy -O ihex -j .text -j .data adww.elf adww.hex 

//   Upload über RobotLoader_20100712



#include<avr/io.h>

int main()
{
    int wert;
    int x=0;
    unsigned char akku, akku2;
    unsigned long pause=0;

    ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
    ADMUX = (0<<REFS1) | (1<<REFS0) | (1<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);
    DDRA &= 0b11111110;

    while(1)
    {
        akku2 = ADCL; //muss erst ausgelesen werden, damit ADCL verfügbar ist.
	akku  = ADCH;
        wert = akku*4;

        PORTC |=  0b01110000;
        for(pause=0;pause<wert;pause++)
            DDRB|=0;

        PORTC &= ~0b01110000;
        for(pause=0;pause<1023 - wert;pause++)
            DDRB|=0;
    }
}

Code 5.3-1: adww.c

Verwendung des seriellen Terminals
//   avr-gcc -O2 -mmcu=atmega32 adwww.c -o adwww.elf 
//   avr-objcopy -O ihex -j .text -j .data adwww.elf adwww.hex 

//   Upload über RobotLoader_20100712



#include<avr/io.h>

#define TAKTFREQUENZ 8000000
#define BAUDRATE 38400

int main()
{
    int sensor;
    unsigned char akku, akku2;
    unsigned long pause=0;

    //Merken des in UBRR zu speichernden Wertes.
    unsigned int baudregister = TAKTFREQUENZ/8/BAUDRATE-1;

    //ADW konfigurieren
    ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
    ADMUX = (0<<REFS1) | (1<<REFS0) | (1<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);
    DDRA &= 0b11111110;

    //Seriell konfigurieren:
    //Aktivieren der RS232-Schnittstelle des Mikrocontrollers:
    
    //setzen der Baudrate
    UBRRH = (unsigned char) (baudregister>>8); //Setzen des HIGH-Bytes des Baudraten-Registers
    UBRRL = (unsigned char)  baudregister;     //Setzen des LOW -Bytes des Baudraten-Registers
	
    //Einschalten des Senders und des Empfängers
    UCSRB = (1<<TXEN) | (1<<RXEN);
		        
    //Setzen des Nachrichtenformats: 8 Datenbits, 1 Stopbits
    UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
    UCSRA = (1<<U2X);


    while(1)
    {
        akku2 = ADCL; //muss erst ausgelesen werden, damit ADCL verfügbar ist.
	akku  = ADCH;
        sensor = (akku<<2) | (akku2>>6); 

        if(sensor>600)    //ca. maximaler Wert, der tazsächlich auftritt, allg. 10 Bit: 0..1023
            sensor = 600;

        PORTC |=  0b01110000;
        for(pause=0;pause<sensor;pause++)
            DDRB|=0;

        PORTC &= ~0b01110000;
        for(pause=0;pause<600 - sensor;pause++)
            DDRB|=0;

        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0; //Warten bis der Uebertragungspuffer leer ist
        UDR = 48 + sensor/1000;                    //Daten in den Puffer schreiben und übertragen
        sensor%=1000;
        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0; //Warten bis der Uebertragungspuffer leer ist
        UDR = 48 + sensor/100;                    //Daten in den Puffer schreiben und übertragen
        sensor%=100;
        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0; //Warten bis der Uebertragungspuffer leer ist
        UDR = 48 + sensor/10;                    //Daten in den Puffer schreiben und übertragen
        sensor%=10;
        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0; //Warten bis der Uebertragungspuffer leer ist
        UDR = 48 + sensor;                    //Daten in den Puffer schreiben und übertragen
        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0;
	UDR = '\n';
        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0;
	UDR = '\r';

    }
}

Code 5.3-2: adwww.c - Verwendung des seriellen Temrinals.

Mittelwertbildung - Entfernung zur Tischkante wird sichtbar
//   avr-gcc -O2 -mmcu=atmega32 adwww2.c -o adwww2.elf 
//   avr-objcopy -O ihex -j .text -j .data adwww2.elf adwww2.hex 

//   Upload über RobotLoader_20100712



#include<avr/io.h>

#define TAKTFREQUENZ 8000000
#define BAUDRATE 38400

#define MAXARR 200

int main()
{
    int sensor;
    unsigned char akku, akku2;
    unsigned long pause=0;

    int index=0;

    int arr[MAXARR];

    //Merken des in UBRR zu speichernden Wertes.
    unsigned int baudregister = TAKTFREQUENZ/8/BAUDRATE-1;

    //ADW konfigurieren
    ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
    ADMUX = (0<<REFS1) | (1<<REFS0) | (1<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);
    DDRA &= 0b11111110;

    //Seriell konfigurieren:
    //Aktivieren der RS232-Schnittstelle des Mikrocontrollers:
    
    //setzen der Baudrate
    UBRRH = (unsigned char) (baudregister>>8); //Setzen des HIGH-Bytes des Baudraten-Registers
    UBRRL = (unsigned char)  baudregister;     //Setzen des LOW -Bytes des Baudraten-Registers
	
    //Einschalten des Senders und des Empfängers
    UCSRB = (1<<TXEN) | (1<<RXEN);
		        
    //Setzen des Nachrichtenformats: 8 Datenbits, 1 Stopbits
    UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
    UCSRA = (1<<U2X);


    while(1)
    {
        akku2 = ADCL; //muss erst ausgelesen werden, damit ADCL verfügbar ist.
	akku  = ADCH;
        sensor = (akku<<2) | (akku2>>6); 

        if(sensor>600)    //ca. maximaler Wert, der tazsächlich auftritt, allg. 10 Bit: 0..1023
            sensor = 600;


        arr[index]=sensor;

        PORTC |=  0b01110000;
        for(pause=0;pause<sensor;pause++)
            DDRB|=0;

        PORTC &= ~0b01110000;
        for(pause=0;pause<600 - sensor;pause++)
            DDRB|=0;

        index++;

        if(index>=MAXARR)
        {

            sensor=0;
            for(index=0;index<MAXARR;index++)
                sensor+=arr[index];
            sensor/=MAXARR;
            index=0;

        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0; //Warten bis der Uebertragungspuffer leer ist
        UDR = 48 + sensor/1000;                    //Daten in den Puffer schreiben und übertragen
        sensor%=1000;
        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0; //Warten bis der Uebertragungspuffer leer ist
        UDR = 48 + sensor/100;                    //Daten in den Puffer schreiben und übertragen
        sensor%=100;
        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0; //Warten bis der Uebertragungspuffer leer ist
        UDR = 48 + sensor/10;                    //Daten in den Puffer schreiben und übertragen
        sensor%=10;
        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0; //Warten bis der Uebertragungspuffer leer ist
        UDR = 48 + sensor;                    //Daten in den Puffer schreiben und übertragen
        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0;
	UDR = '\n';
        while( !(UCSRA & (1<<UDRE)) ) DDRB|=0;
	UDR = '\r';
       
        }
    }
}

Code 5.3-3: adwww2.c - Durch die Mittelwertbildung wird die Entfernung zur Tischkante erfaßbar.