Mainframe.c


1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#define F_CPU 2000000
4
#include <util/delay.h>
5
#include <inttypes.h>
6
#include <stdint.h>
7
8
// Anchlussbelegung:
9
10
#define KTEMP_DDR DDRD        //Temperatur Input vom Kältebad
11
#define WTEMP_DDR DDRC        //Temperatur Input vom Wärmebad
12
#define PTEMP_DDR DDRA        //Temperatur Input von Probe
13
14
#define MOTOR_DDR DDRB        //Datenrichtung zum Motor-Steuer-Atmega festlegen
15
#define MOTOR_OUT PORTB        //Ausgänge zum Motor-Steuer-Atmega
16
#define MOTOR_IN  PINB
17
//cw = clockwise = im Uhrzeigersinn; ccw = counter clockwise = entgegen dem Uhrzeigersinn
18
#define CW   PB0          //Motor cw Richtung Kältebad drehen lassen
19
#define CCW  PB1          //Motor ccw Richtung Wärmebad drehen lassen
20
#define KB   PB2          //Endanschlagstaster Kältebad abfragen 
21
#define WB   PB3          //Endanschlagstaster Wärmebad abfragen
22
23
//Funktion für die Tastenentprellung aufrufen über >>entprellung( &PINB, (1<<PINB2) );<<
24
void entprellung( volatile uint8_t *port, uint8_t maske ) {
25
  uint8_t   port_puffer;
26
  uint8_t   entprellungs_puffer;
27
 
28
  for( entprellungs_puffer=0 ; entprellungs_puffer!=0xff ; ) {
29
    entprellungs_puffer<<=1;
30
    port_puffer = *port;
31
    _delay_us(150);
32
    if( (*port & maske) == (port_puffer & maske) )
33
      entprellungs_puffer |= 0x01;
34
  }
35
}     
36
37
int main(void)
38
{
39
    uint8_t w_temp = 0;          //Variable zum speichern der Zustände vom Wärmebad
40
    uint8_t k_temp = 0;          //Variable zum speichern der Zustände vom Kältebad
41
    uint8_t p_temp = 0;          //Variable zum speichern der Zustände von der Probe
42
    uint8_t sc_temp = 0;        //Variable für switch case    
43
    
44
    KTEMP_DDR = 0x00;    //Eing?nge D
45
        WTEMP_DDR = 0x00;    //Eing?nge C
46
    PTEMP_DDR = 0x00;    //Eing?nge A  
47
    MOTOR_DDR = (1 << DDB0) | (1 << DDB1);//B0 un B1 als Ausgänge, B2 und B3 als Eingänge:
48
49
    PORTB &= ~ (1<<CCW);  //Motor aus
50
    PORTB &= ~ (1<<CW);    //Motor aus
51
52
    for(int a=0; a<25; a++){_delay_ms( 1000 );}
53
54
        do
55
        {
56
      k_temp = 0;          
57
      p_temp = 0;          
58
      w_temp = 0;
59
      sc_temp = 1;
60
          
61
  
62
      uint8_t bcd2bin( uint8_t val )
63
      {
64
        return (val & 0x0F) + (val >> 4) * 10;
65
      }
66
67
      k_temp = bcd2bin( PIND );
68
      p_temp = bcd2bin( PINA );
69
      w_temp = bcd2bin( PINC );
70
71
      if (p_temp <= k_temp){sc_temp = 1;}
72
      if (p_temp >= w_temp){sc_temp = 2;}
73
      
74
  
75
76
      switch(sc_temp) {
77
      case 1:          //Richtung Wärmebad
78
          PORTB &= ~ (1<<CW);
79
          PORTB |= (1<<CCW);
80
      while(!(PINB & (1<<WB)));
81
          PORTB &= ~ (1<<CCW);
82
      for(int a=0; a<2; a++){_delay_ms( 1000 );}
83
       sc_temp = 2;
84
        break;
85
86
      case 2:          //Richtung Kältebad
87
          PORTB &= ~ (1<<CCW);
88
          PORTB |= (1<<CW);
89
      while(!(PINB & (1<<KB)));
90
          PORTB &= ~ (1<<CW);
91
      for(int a=0; a<2; a++){_delay_ms( 1000 );}
92
       sc_temp = 1;
93
        break;
94
95
      default:
96
          PORTB &= ~ (1<<CCW);
97
          PORTB &= ~ (1<<CW);
98
        break;
99
100
    }
101
  } //Ende do
102
while(1); 
103
} //ENDE main