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.