Source file: /~heha/basteln/Konsumgüter/Funkuhr/AD-Bandbreite.zip/Band.c

/* FunkUsb: Bandbreiten-Test des A/D-Wandlers, auf USB2LPT-Testplatine
 */

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <stdio.h>

/* Hardware:
PB2	(16)	(OC1B)	LED
PC0	(23)	ADC0	A/D-Wandler-Eingang
PD6	(12)	OC0A	PWM-Ausgang (Frequenz Rechteck 1:1), verbunden mit (23)
PD3	(5)	OC2B	Gemessene Differenzspannung
PD1	(3)	TxD	Report-Ausgang
*/
#define BAUD 9600

typedef unsigned char BYTE;

register BYTE adc_min asm("r2");
register BYTE adc_max asm("r3");
register BYTE adc_cnt asm("r4");

ISR(ADC_vect) {	// mit 7,2 kHz
 register BYTE adc asm("r5");
 adc=ADCH;
 if (adc_min>adc) adc_min=adc;
 if (adc_max<adc) adc_max=adc;
 adc_cnt++;
}

static int uart_putchar(char c, FILE *stream) {
 if (c == '\n') uart_putchar('\r', stream);
 loop_until_bit_is_set(UCSR0A, UDRE0);
 UDR0 = c;
 return 0;
}

static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);

/*******************
 * Initialisierung *
 *******************/
 
static void hardwareInit(void) {
 PORTD|=1<<1;		// TxD aktivieren
 UBRR0=F_CPU/16/BAUD-1;
 UCSR0B=0x08;
 adc_min=0xFF;
 adc_max=0;
 adc_cnt=0;
 DDRD|=1<<6;
 OCR0A=255;		// langsam anfangen
 TCCR0A=0x42;		// CTC bis OCR0A mit Toggle
 TCCR0B=0x01;		// Volle Taktfrequenz: f = 6 MHz .. 23 kHz
 DDRD|=1<<3;
 OCR2B=128;
 TCCR2A=0x21;		// Fast-PWM mit Ausgabe auf OC2B
 TCCR2B=0x01;
 ADMUX=0x60;		// 5V, linksbündig
 ADCSRA=0xBF;		// EI, Teiler 128 -> 7,2 kHz
 ADCSRA=0xEF;		// Start
 DIDR0=0x01;
 DDRB|=1<<2;
 PORTB|=1<<2;		// LED
}

/*****************
 * Hauptprogramm *
 *****************/
int main(void) __attribute__((noreturn));
int main(void) {
 BYTE t=255;
 ACSR |= 0x80;		// Analogvergleicher abschalten: - 70 µA
 SMCR=0x01;		// SLEEP_MODE_STANDBY
 hardwareInit();
 sei();

 for(;;){
  sleep_cpu();		// 7,2 kHz = 140µs
  if (!adc_cnt) {	// 28 Hz = 35 ms
   cli();
   ADCSRA=0xBF;		// A/D Stopp
   BYTE d=OCR2B=adc_max-adc_min;	// Ergebnis ausspucken
   adc_min=0xFF;		// neu messen
   adc_max=0;
   PINB|=1<<2;		// LED blinken lassen
   fprintf(&mystdout,"%d %d\n",t+1,d);
   OCR0A=--t;		// Frequenz erhöhen, 0,11 Hz = 9 s Sweepzeit
   ADCSRA=0xEF;		// A/D Start
   sei();
  }
 }
}
Detected encoding: UTF-80