shopper.c


1
/*
2
Atmel Prozessor ATTiny45  @ 8  MHz
3
4
Bremsshopper-Steuerung
5
6
Copyrighr by Axel Jeromin
7
8
9
Ein- und Ausgänge
10
PORT B 0 (5) = DC Kreis OK + LED 2
11
PORT B 1 (6) = LED 1
12
PORT B 2 (7) = Relais Kondensatoren laden
13
PORT B 3 (2) = Shopper IN
14
PORT B 4 (3) = ADC2 Uzk
15
16
17
3,50V  entspricht Uzk nenn   = 100% Uzk  = 716 Einheiten der Analogmessung = 325V
18
3,85V Start Shoppen     = 110% Uzk  = 787 Einheiten der Analogmessung = 357V
19
4,27V max Shoppen       = 122% Uzk  = 887 Einheiten der Analogmessung = 398V
20
4,40V entspricht Uzk max   = 125% Uzk  = 900 Einheiten der Analogmessung = 408V
21
2,63V entspricht Uzk min   =  75% Uzk  = 537 Einheiten der Analogmessung = 243V
22
23
24
25
26
*/
27
28
29
30
31
#include <inttypes.h>
32
#include <avr/io.h>
33
#include <avr/interrupt.h>
34
35
volatile unsigned char ausg=0;
36
volatile unsigned char soll=00;
37
volatile unsigned char shoppen=0;
38
39
// ******************************************************************* 
40
//                       PWM Zykluszeit = 6,656ms ==> Frequenz = 150Hz
41
SIGNAL(SIG_OVERFLOW0)           
42
{        
43
44
if (soll>100) soll =100;
45
if (ausg) ausg=0; else ausg=1;
46
if (ausg && shoppen) PORTB |= _BV(3); else PORTB &=~_BV(3);
47
if (ausg) (TCNT0=(255-soll)); else (TCNT0=(255-(100-soll)));
48
  
49
50
51
}
52
53
54
// ******************************************************************* 
55
//                       Initialisierung          
56
// ******************************************************************* 
57
void initial(void)
58
{    
59
60
TCNT0 = 255;          //  TCNT0 Timer auf 126µs einstellen 
61
TCCR0B = 3;          // count with cpu clock/64
62
TIMSK = (1<<TOIE0);   // enable TCNT0 overflow
63
64
sei();      // enable interrupts
65
66
ADMUX=0x02;    // PortB4 = ADC2 = Analog Eingang
67
ADCSRB=0x00;
68
ADCSRA=0x84;  // ADEN =1 / Prescaler = 16
69
70
DDRB = 0x0f;      // PortB  Ausgang, PortB3 =Analog Eingang
71
72
73
74
shoppen=0;
75
76
77
}
78
79
80
81
// ******************************************************************* 
82
//                       Hauptprogramm          
83
// ******************************************************************* 
84
85
void main(void)
86
{ 
87
88
// ******************************************************************* 
89
//              Variablen für das Hauptprogramm       
90
// ******************************************************************* 
91
unsigned char i=0;
92
unsigned int sample=0;
93
unsigned int value=0;
94
95
96
97
initial();  // Initialisierung Ports, Timer
98
99
for (;;) {;             /* loop forever */ // Bearbeitungszeit =  µs
100
  
101
    sample=0;  // setzt den Samplewert auf 0
102
    // Schleife zum Sammeln von 30 Meßwerten
103
    for(i=0;i<30;i++)  
104
    {
105
      ADCSRA |= _BV(6);  // single conversion mode ein
106
      while(ADCSRA & (1<<6));  // warten bis Konvertierung abgeschlosen
107
108
      sample+=ADCW;  // Aufsummierung der Samplewerte
109
    }
110
    value=sample/30;  // Aritmethisches Mittel der Samplewerte (alle 8025µsec @ 1Mhz)
111
     
112
    // Auswertung der Meßdaten
113
    if ((value>537) && (value<900))  PORTB |= _BV(0); else PORTB &=~_BV(0); // Uzk OK
114
    if (value>787)  PORTB |= _BV(1); else PORTB &=~_BV(1); // shoppen ein
115
    if (value>537)  PORTB |= _BV(2); else PORTB &=~_BV(2); // Relais Kondensatorladung brücken
116
117
118
    if (value>787)  shoppen=1; else shoppen =0;
119
  if (value>787)  soll=value-787; else soll = 0; // 787 = 110% Uzk
120
121
122
    }      //Ende Loop for ever        
123
}     //Ende Hauptprogramm