kramann.info
© Guido Kramann

Login: Passwort:










Mikrocontroller
1 Einfuehrung
..1.1 Entwicklungsgeschichtliches
..1.2 Maschinensprache
..1.3 Assemblerbeispiel
..1.4 Sprachwahl
..1.5 Praxis
....1.5.1 Digital_IO
....1.5.2 Byteoperationen
....1.5.3 AVR_Studio
....1.5.4 Testboard
....1.5.5 Aufgaben
....1.5.6 Do_it_yourself
......1.5.6.1 Ampel
......1.5.6.2 Programmierer
..1.6 Literatur
..1.7 Programmierer
....1.7.1 Bauverlauf
....1.7.2 KurzreferenzLow
....1.7.2 Kurzreferenz_16PU
..1.8 Uebung1
..1.9 BoardAtHome
....1.9.1 Software
....1.9.2 Hardware
....1.9.3 Knoppix
....1.9.4 Aufbau
....1.9.5 LED
2 Oszillator
..2.1 Assembler
..2.2 Interner_RC
..2.3 Quarz
..2.4 Taktgenerator
3 DigitalIO
..3.1 Elektrische_Eigenschaften
..3.2 Pullup_Widerstaende
..3.3 Bitmasken_Eingang
..3.4 Bitmasken_Ausgang
..3.5 Tic_Tac_Toe
....3.5.1 DuoLEDs
....3.5.2 Schaltplan
....3.5.3 Spielfeld
....3.5.4 Anwahl
....3.5.5 Kontrolle
..3.6 Laboruebung2
..3.7 Laboruebung2_alt
4 PWM
..4.1 Prinzip
..4.2 Nutzen
..4.3 Generierung
..4.4 Programmierung
..4.5 Servos
..4.7 Laboruebung3
..4.8 LoesungUE3
..4.9 Uebung6
5 LichtKlangKugeln
..5.1 LED
..5.2 RGB
..5.3 Sensoren
..5.4 lautsprecher
..5.5 tonerzeugung
6 UART
..6.1 Bussysteme
..6.2 UART
..6.3 RS232
..6.4 Hardware
..6.5 Senden
..6.6 Hyperterminal
..6.7 Empfangen
..6.8 Broadcast
..6.9 Uebung4
7 Infrarot
..7.1 schalten
..7.2 seriell
..7.3 Uebung
8 OOP
..8.1 Probleme
..8.2 Konzept
..8.3 Statisch
..8.4 Datentypen
..8.5 RS232
....8.5.1 Prozedural
....8.5.2 Analyse
....8.5.3 Umsetzung
....8.5.4 Vererbung
....8.5.5 Statisch
....8.5.6 Performance
..8.6 Fahrzeug
9 ADW
..9.1 ADW
..9.2 Zaehler
10 Peripherie
..10.1 RS232Menue
..10.2 ASCIIDisplay
..10.3 Tastenmatrix
..10.4 Schrittmotor
..10.5 Zaehler
..10.6 Uebung7
11 SPI
..11.1 Testanordnung
..11.2 Register
..11.3 Test1
..11.4 Test2_Interrupt
..11.5 Test3_2Slaves
..11.6 Laboruebung
12 EEPROM
13 I2C
..13.1 MasterSendByte
..13.2 MasterSend2Bytes
..13.3 MasterReceiveByte
..13.4 MasterReceive2Bytes
14 Anwendungen
..14.1 Mechatroniklabor
....14.1.1 Biegelinie
....14.1.2 Ausbruchsicherung
....14.1.3 Einachser
....14.1.4 AV
....14.1.5 Vierradlenkung
....14.1.6 Kommunikation
..14.2 Sinuserzeugung
....14.2.1 Variante1
....14.2.2 Variante2
....14.2.3 Variante3
....14.2.4 Variante4
..14.3 Laboruebung8
..14.4 Loesung_Ue8
..14.5 SPI_Nachtrag
20 Xubuntu

9.1 Verwendung des Analog/Digital-Wandlers

Nutzen des Beispiels

  • Erfassen eines Sensorsignals und dessen Ausgabe.

Verwendete Befehle und ihre Bedeutung

Befehl Bedeutung
ADCSRA Register zur Konfigurierung des AD-Wandlers
SFIOR Register zur Konfigurierung des AD-Wandlers
ADMUX Auswahl des Pins.
ADCH / ADCL Register auf denen die 10 Bit-Auflösung des AD-Wandlers verteilt ist.

Tabelle 9.1-1: Befehlsübersicht

Beispielprogramm

#include <avr/io.h>

void initADwandler()
{
	        ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);

            //ADEN
	        //  1   AD-Wandler eingeschaltet
	        //ADSC
	        //  1   Konvertierung starten
	        //ADATE
	        //  0   Auto-Trigger aus
            //ADIF (Interrupt-Flag)
	        //ADIE
	        //  0   Interrupt ausgeschaltet
	        //ADPS 2 1 0 Vorteilung der Taktrate (sollte zwischen 50..200kHz liegen, also bei 9,216MHz Teilung=92 ~ 128)
	        //ADPS 2 1 0 Vorteilung der Taktrate (sollte zwischen 50..200kHz liegen, also bei 9,216MHz 144kHz Teilung=64)
	        //     0 0 0    2  
	        //     0 0 1    2  
	        //     0 1 0    4  
	        //     0 1 1    8  
	        //     1 0 0   16  
	        //     1 0 1   32  
	        //     1 1 0   64 (ausgewählt)  
	        //     1 1 1  128  

            //Freilaufmode auswählen:
	        SFIOR &= 255 - ((1<<ADTS2) | (1<<ADTS1) | (1<<ADTS0));

//ACHTUNG: verwendete Pins von PORTA als Eingang wählen!
            //AD-Wandler einstellen und aktivieren:
            //PA0,1,2,3 als Eingänge (DDRA=0b11110000)

    
	        //ADMUX = (0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (1<<MUX1) | (1<<MUX0);
            //REFS1 REFS0 
	        //  0     0     externe Referenzspannung
            //ADLAR
	        //  1           Ergebnis in ADCH und ADCL links ausgerichtet (so kann man leicht die höhren 8 Bits lesen)
            //MUX 4 3 2 1 0
	        //    0 0 0 0 0 ADC0  //hier ausgewählt 
	        //    0 0 0 0 1 ADC1
	        //    0 0 0 1 0 ADC2
	        //    0 0 0 1 1 ADC3  
	        //    0 0 1 0 0 ADC4
	        //    0 0 1 0 1 ADC5
	        //    0 0 1 1 0 ADC6
	        //    0 0 1 1 1 ADC7

            //AD0 / Pin 40 als Eingang wählen
	        ADMUX = (0<<REFS1) | (0<<REFS0) | (1<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);
}


int main(void)
{
    unsigned char akku,akku2;
    int i,k;
	long int x;

    DDRC = 0b11111111; //PORTC alle Bits als Ausgang
    DDRD = 0b00000000; //PORTD alle Bits als Eingang

    initADwandler();

        while(true)
	{
	        x = 0;
                for(i=0;i<100;i++)
                {
		     akku2 = ADCH; //muss erst ausgelesen werden, damit ADCL verfügbar ist.
		     akku  = ADCL;
                     x+=akku2;		    

		     for(k=0;k<100;k++);
		}
                x/=100;
		PORTC = (unsigned char)x;
	}
	return 0;
}
 

Code 9.1-1: Beispiel

Projekt herunterladen
Übung 4a)
  • Schreiben Sie ein Programm, mit dem Sie über Tastendruck zwischen zwei Entfernungssensoren hin und her schalten können.
  • Schreiben Sie ein Programm, bei dem die Motorgeschwindigkeit über einen Entfernungssensor beeinflußt wird.