Durchgangsprüfer: Hier ein paar Experimente um Widerstände im Bereich 0-10 Ohm praktisch strom- und spannungslos zu signalisieren

Version1: einfach aufgebaut, aber Widerstandswerte kaum zu unterscheiden

Version2: Tonhöhe gibt Aufschluss über den Widerstand. Komplizierter Abgleich erforderlich

 

Version3: Tonhöhe in 10 Stufen. Programmierung erforderlich

Eagle Dateien:

V1.rar

V2.rar

V3.rar

C-Firmware für ATMEGA 6 bei 1MHz

/**************************************************************************


im AVR müssen CKSEL0, SUT0, BOOTSZ0, BOOTSZ1 und SPIEN gesetzt werden


; ================================================
; Hardware connections
; ================================================
;
; Hardware
; ___________
; __ / |
;+5V O-|__|--|RESET PC5|--O
; | |
; O--|PD0 PC4|--O
; | |
; O--|PD1 PC3|--O
; | |
; O--|PD2 PC2|--O
; | |
; O--|PD3 ADC1|--O
; | A T |
; O--|PD4 ADC0|--O
; | mega |
; +5V O--|VCC GND|--O GND
; | 8 |
; GND O--|GND AREF|--O
; | |
; O--|XTAL1 AVCC|--O
; | |
; O--|XTAL2 PB5SCK|--O
; | |
; O--|PD5 PB4MISO|--O
; | |
; O--|PD6 PB3MOSI|--O
; | |
; O--|PD7 PB2OC1B|--O
; | |
; O--|PB0 PB1OC1A|--O
; |____________|
;
;
*/

/* Deklarationen */
/**************************************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>


#include <util/delay.h>

typedef unsigned char byte;


#define SYSCLK 1000000 // timer clock 1Mhz
#define freq1 100
#define ton1 0 - (SYSCLK/freq1/2) // Timer value
#define freq2 200
#define ton2 0 - (SYSCLK/freq2/2) // Timer value
#define freq3 300
#define ton3 0 - (SYSCLK/freq3/2) // Timer value
#define freq4 400
#define ton4 0 - (SYSCLK/freq4/2) // Timer value
#define freq5 500
#define ton5 0 - (SYSCLK/freq5/2) // Timer value
#define freq6 600
#define ton6 0 - (SYSCLK/freq6/2) // Timer value
#define freq7 700
#define ton7 0 - (SYSCLK/freq7/2) // Timer value
#define freq8 800
#define ton8 0 - (SYSCLK/freq8/2) // Timer value
#define freq9 900
#define ton9 0 - (SYSCLK/freq9/2) // Timer value
#define freq10 1000
#define ton10 0 - (SYSCLK/freq10/2) // Timer value


// PIN-definition for Servos

#define LOW_SERVO PORTC&=~(1<<5)
#define HIGH_SERVO PORTC|=(1<<5)


volatile uint16_t ton;



/* INIT */
/************************************************************************

void init(void)
initialize the prozessor registers

***************************************************************************/

void init(void)
{

/* initialize ports */

DDRC = 0b00100000; // PORTC 5 als Ausgang
DDRD = 0b00000110;
DDRB = 0b00000000;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0xff;

// init timer1
TCNT1 = 0-16000;
TCCR1A=0;
TCCR1B=0x01;
TIMSK |= _BV(TOIE2) | _BV(TOIE1);

}

void ad_init(void){ // initialize ad-wandler
ADMUX = 0x00; // Kanal0
ADMUX |= (1<<REFS1) | (1<<REFS0); //interne Referenzspannung 2,5V nutzen
ADCSR=0b11000111; // enable ADC
}


/* Routinen */
/************************************************************************

SIGNAL(SIG_OVERFLOW1)
timer1 interrupt, Pulserzeugung

***************************************************************************/


SIGNAL(SIG_OVERFLOW1)
{
static byte index=0;

if (index==0)
{

HIGH_SERVO;
TCNT1 =ton; // time to next Int

}

if (index==1)
{
LOW_SERVO;
TCNT1 =ton; // time to next Int
}

index++;
if (index==2) index=0;


}


//lese ad0
int leseAD(void)
{
uint16_t wert;
uint8_t highwert;
ADCSR |= (1<<ADSC); // eine Wandlung starten
while ( ADCSR & (1<<ADSC) ) {;} // auf Abschluss der Konvertierung warten
wert = ADCL; // Low auslesen
highwert = ADCH; // High auslesen
wert = wert + highwert*256;//
return wert;
}




/************************************************************************

Hauptprogramm

***************************************************************************/

int main()
{
uint16_t adWert; // AD-Wert

init(); // Ports und Timer initialisieren
ad_init();
sei(); // Interrupts freigeben



for(;;){

adWert=leseAD(); // lese Spannungswert
if (adWert < 100) ton = 0;

if ((adWert>=100) & (adWert<200)) ton = ton1;
if ((adWert>=200) & (adWert<300)) ton = ton2;
if ((adWert>=300) & (adWert<400)) ton = ton3;
if ((adWert>=400) & (adWert<500)) ton = ton4;
if ((adWert>=500) & (adWert<600)) ton = ton5;
if ((adWert>=600) & (adWert<700)) ton = ton6;
if ((adWert>=700) & (adWert<800)) ton = ton7;
if ((adWert>=800) & (adWert<900)) ton = ton8;
if ((adWert>=900) & (adWert<1000)) ton = ton9;
if (adWert>=1000) ton = ton10;



}
}