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
|