/* 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-8 | 0
|