ADW0 testen
(EN google-translate)
(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 0-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 0-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 0-3: adwww2.c - Durch die Mittelwertbildung wird die Entfernung zur Tischkante erfaßbar.