main.c


1
// benötigte Headerdateien
2
#include <avr/io.h>
3
#include <stdio.h>
4
#include <util/delay.h>
5
#include "lcd.h"
6
7
/*
8
  LCD ansteuerungscode weggelassen, da irrelevant
9
*/
10
11
const uint16_t pwmtable[64] = {
12
0, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5,
13
5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17,
14
19, 21, 23, 26, 29, 32, 36, 40, 44, 49, 55,
15
61, 68, 76, 85, 94, 105, 117, 131, 146, 162,
16
181, 202, 225, 250, 279, 311, 346, 386, 430,
17
479, 534, 595, 663, 739, 824, 918, 1023};
18
19
20
// Funktion für die PWM initialisierung
21
void pwm_init(void)
22
{
23
  DDRD = (1 << PD5);  // PWM pin als ausgang
24
  
25
  TCCR1A = (1 << COM1A1) | (1 << COM1A0) | (1 << WGM10) | (1 << WGM11);  // 10-bit Fast PWM mode
26
  TCCR1B = (1 << WGM12) | (1 << CS10) | (1 << CS10);    // Prescaler: F_CPU/64
27
  OCR1A = 0x0000;
28
}
29
30
// Funktion zum auslesen des ADCs
31
uint16_t adc_read(uint8_t mux)
32
{
33
  uint8_t i;
34
  uint16_t result;
35
  
36
  ADMUX = mux;                    // Kanal wählen  
37
  ADMUX |= (1<<ADLAR);
38
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
39
  
40
  // Dummy readout
41
  ADCSRA |= (1<<ADSC);                // eine ADC-Wandlung 
42
  while(ADCSRA & (1<<ADSC));              // auf Abschuss der Wandlung warten
43
  result = ADCH;                    // ADCW lesen
44
  
45
  // Eigentliche Messung - Mittelwert aus 5 aufeinanderfolgenden Wandlungen
46
  result = 0; 
47
  for(i=0; i<5; i++)
48
  {
49
    ADCSRA |= (1<<ADSC);              // eine Wandlung
50
    while(ADCSRA & (1<<ADSC));            // auf Abschuss der Wandlung warten
51
    result += ADCH;                  // Wandlungsergebnisse aufaddieren
52
  }
53
  ADCSRA &= ~(1<<ADEN);                // ADC deaktivieren
54
  
55
  result /= 4;                    // Summe durch vier teilen = arithm. Mittelwert
56
  
57
  return result;
58
}
59
60
61
// Hauptfunktion
62
int main(void)
63
{
64
  // initialisierungen
65
    lcd_init();
66
  lcd_string("Initializing...");
67
  pwm_init();
68
  _delay_ms(500);
69
  
70
  char buffer[20];
71
  uint16_t ldr, pwm;
72
  
73
  // endlose Hauptschleife
74
    while(1) 
75
  {    
76
    ldr = adc_read(PA7);                // adc auslesen
77
    pwm = (ldr>>2);                    // 8-bit => 6-bit
78
    OCR1A = pwmtable[64-pwm];              // pwm Wert setzen
79
    sprintf(buffer, "LDR: %3d PWM: %2d", ldr, pwm);    // Werte anzeigen
80
    lcd_clear();
81
    lcd_string(buffer);
82
    sprintf(buffer, "PWMTABLE: %4d", pwmtable[64-pwm]);
83
    set_cursor(0, 2);
84
    lcd_string(buffer);
85
    _delay_ms(500);
86
    };
87
  
88
    return 0;
89
}