Kleines analoges Meßgerät mit AtTiny13



Eine kleine Bargarph-Anzeige (Leuchtbalken-Anzeige) mit dem Attiny13 zu bauen, ist nicht schwer!
Dieses Projekt ist der kleine Bruder von dem hier.

Aufgabe:
Die Höhe einer an PB4 angeschlossenen Spannung von 0V bis 5V wird in Form eines Leuchtbalkens von an PB0 bis PB3 angeschlossenen LEDs ausgegeben. Mit anderen Worten: ein analoges Meßgerät mit LEDs als Zeiger.


Die Eingangsspannung wird hier mit einem 10K-Poti bereitgestellt.
Natürlich ist der tiefere Sinn eines solchen Meßgerätes das Messen einer echten Spannung.
Die kommt dann anstelle des Potis an PB4.


Hier der Ordner zum Programmieren.

In diesem Code-Ordner findest (neben dem üblichen Zeugs) wie immer die Datei "test.c" sowie eine Datei "messen.h", die oben im "test.c" eingebunden wird.

Unser Programmquelltext: test.c


#include <avr/io.h>
#include "messen.h"

int main(void){

  int value=0; 

  //PB0 bis PBD3 sind die LED-Ausgaenge:	
  DDRB = DDRB | _BV(PB0)| _BV(PB1) | _BV(PB2) | _BV(PB3);   
  
  //analoger Eingang: ADC2
  DDRB &= ~_BV(PB4); 

  while(1){
	  value = MESSWERT(2);  // Wert von ADC2 - siehe  "messen.h"
	  
	  if (value > 200)  PORTB &= ~_BV(PB0); else PORTB |= _BV(PB0);
	  if (value > 400)  PORTB &= ~_BV(PB1); else PORTB |= _BV(PB1);
	  if (value > 600)  PORTB &= ~_BV(PB2); else PORTB |= _BV(PB2);
	  if (value > 800)  PORTB &= ~_BV(PB3); else PORTB |= _BV(PB3);
	
   } 

   return 0;
}  



Die im Kopf von "test.c" eingebundene Datei "messen.h":


int MESSWERT (int kanal){

  	int a=1, i=a, j=a;
	//je kleiner a, desto schneller und verrauscheter kommt der Messwert
  	// a darf nicht kleiner 1 sein!
  	
	long int analogwert=0, analogwert1=0, analogwert2=0 ;
	
	while(j){
  		
		while(i){
			ADCSRA=0x80; 		// ADC eingeschaltet, kein Prescale 
			ADMUX=kanal;
			ADCSRA |=_BV(ADSC); // single conversion mode ein
			
			// auf Abschluss der Konvertierung warten
			while (ADCSRA & (1<1<ADSC)) {;}	 

			analogwert+=ADCW;
			i--;
		}
		
		analogwert1 = analogwert / a;
		analogwert2 += analogwert1;
		j--;
	}
	
	analogwert = analogwert2 / a;

	return analogwert;
}


Erklärungen zu "messen.h":

- Die Datei "messen.h" wird in die Datei "test.c" eingebunden (ja ich weiß, das kann man auch besser machen).

- int MESSWERT (int kanal){ ... } ist eine gewöhnliche Funktion, die man auch ohne eine h-Datei
   benutzen könnte.

- Man muß hier keineswegs alles verstehen!!! Man kann die Datei "messen.h" auch einfach benutzen - und gut.

- Zum Aktivieren und Konfigurieren der Analogeingänge werden bestimmte Bits in dafür vorgesehenen Registern gesetzt
   oder gelöscht, z. B.: ADCSRA = 0x80, wobei 0x80 eine Hexadezimalzahl ist.
   Wenn Du es genau wissen willst: siehe Datenblatt.

- der Analogwert wird a mal ermittelt und summiert. Am Ende wird die so entstandene Summe durch a dividiert.
   Diese Vorgehensweise minimiert Rauschen, Brummen und andere Störungen.
   Derzeit ist a auf 1 eingestellt, kann bei Bedarf aber nach Wunsch erhöht werden.



Anmerkungen:

  • Wenn Du statt einer Leuchtbalkenanzeige lieber eine Leuchtpunktanzeige bauen willst, kannst Du die 4 LED-Vorwiderstände auf einen 150 Ohm Widerstand reduzieren. Natürlich mußt Du dann das Programm umschreiben.

  • Wie man auch noch an PB5 eine LED benutzen kann (und die RESET-Funktion deaktiviert), steht hier beschrieben.