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
|