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;
}
}