Atmega_16_test.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
enum { RESET, CW_AN, CCW_AN, BREAK, IM_WAERMEBAD, IM_KAELTEBAD };
24
25
26
//Funktion für die Tastenentprellung aufrufen über >>entprellung( &PINB, (1<<PINB2) );<<
27
void entprellung( volatile uint8_t *port, uint8_t maske ) {
28
  uint8_t   port_puffer;
29
  uint8_t   entprellungs_puffer;
30
 
31
  for( entprellungs_puffer=0 ; entprellungs_puffer!=0xff ; ) {
32
    entprellungs_puffer<<=1;
33
    port_puffer = *port;
34
    _delay_us(150);
35
    if( (*port & maske) == (port_puffer & maske) )
36
      entprellungs_puffer |= 0x01;
37
  }
38
}     
39
40
int main(void)
41
{
42
    uint8_t w_temp = 0;          //Variable zum speichern der Zustände vom Wärmebad
43
    uint8_t k_temp = 0;          //Variable zum speichern der Zustände vom Kältebad
44
    uint8_t p_temp = 0;          //Variable zum speichern der Zustände von der Probe
45
     uint8_t state = RESET;    
46
    
47
    KTEMP_DDR = 0x00;    //Eing?nge D
48
        WTEMP_DDR = 0x00;    //Eing?nge C
49
    PTEMP_DDR = 0x00;    //Eing?nge A  
50
    MOTOR_DDR = (1 << DDB0) | (1 << DDB1);//B0 un B1 als Ausgänge, B2 und B3 als Eingänge:
51
52
    PORTB &= ~ (1<<CCW);  //Motor aus
53
    PORTB &= ~ (1<<CW);    //Motor aus
54
55
    for(int a=0; a<2; a++){_delay_ms( 1000 );}
56
57
         for(;;){// Main-Loop
58
59
      k_temp = 0;          
60
      p_temp = 0;          
61
      w_temp = 0;
62
    
63
      uint8_t bcd2bin( uint8_t val ) //Temperatur Abholen
64
      {
65
        return (val & 0x0F) + (val >> 4) * 10;
66
      }
67
68
      k_temp = bcd2bin( PIND );
69
      p_temp = bcd2bin( PINA );
70
      w_temp = bcd2bin( PINC );
71
      
72
          //Temperatur konvertieren 
73
      p_temp = ~p_temp;
74
      w_temp = ~w_temp;
75
      k_temp = ~k_temp;  
76
77
      switch( state ){
78
              case CW_AN:
79
                        PORTB |= (1<<CW);
80
                        PORTB &= ~(1<<CCW);
81
                        if((PINB & (1<<KB)) && !(PINB & (1<<WB)))
82
                          state = IM_KAELTEBAD;
83
                        break;
84
              case IM_KAELTEBAD:
85
                        // Motor anhalten
86
                        PORTB &= ~(1<<CW);
87
                        PORTB &= ~(1<<CCW);
88
                        // Temp abfragen
89
                        if(p_temp <= k_temp)
90
                          state = CCW_AN;
91
                        break;
92
              case CCW_AN:
93
                        PORTB |= (1<<CCW);
94
                        PORTB &= ~(1<<CW);
95
                        if(!(PINB & (1<<KB)) && (PINB & (1<<WB)))
96
                          state = IM_WAERMEBAD;
97
                        break;
98
              case IM_WAERMEBAD:
99
                        // Motor anhalten
100
                        PORTB &= ~(1<<CW);
101
                        PORTB &= ~(1<<CCW);
102
                        // Temp abfragen
103
                        if(p_temp >= w_temp)
104
                          state = CW_AN;
105
                        break;
106
              case RESET:
107
             if(!(PINB & (1<<KB)))
108
                          // Wenn nicht im Kältebad, dann fahre dort hin
109
                          state = CW_AN;
110
                        else
111
                          // Endschalter schon gedrückt, also bleibe an dieser Stelle
112
                          state = IM_KAELTEBAD;
113
                        break;
114
                  
115
              default:
116
                        if((PINB & (1<<WB)) && !(PINB & (1<<KB)))
117
                          state = CCW_AN;
118
                        if(!(PINB & (1<<WB)) && (PINB & (1<<KB)))
119
                          state = CW_AN;
120
                        break;
121
        }//Ende Switch-Case
122
     }//Ende Main-Loop
123
} //ENDE main