Hallo, ich bastel gerade an einem "Thermomixer". Der Größte Teil funzt auch schon nur mit der Motorsteuerung stelle ich mich irgendwie doof an. Das ganze Projekt ist um einen Mega 16 aufgebaut, den ich als "Mainframe" bezeichne. An diesem Mega 16 hängen 4 Stück Mega 48. Drei davon messen mit einem 1 wire Sensor die Temperatur und einer kümmert sich um den Motor. Das Arbeitsprinzip ist so das es ein Wärmebad und ein Kältebad gibt in denen jeweils die Temperatur gemessen wird. Außerdem wird die Temperatur einer Probe gemessen. Es wird zuerst verglichen ob die Temperatur der Probe mit der Temperatur des Kältebads übereinstimmt - wenn ja wird der Motor gestartet und die Probe fährt ins Wärmebad. Nun wir wieder die Temperatur zw. Probe und Wärmebad verglichen und wenn die Temperaturen gleich sind wird wieder ins Kältebad gefahren. Am Kälte und am Wärmebad gibt es je einen Anschlagschalter der dem Atmega 48, der den Motor Steuert, ein Signal gibt, das dazu führt das der Motor stoppt. Diese Anschlagschalter sind zusätzlich noch mit dem Mainframe verbunden. Der Teil, wo der Motor zur initialisierung erst mal ins Kältebad fährt funktioniert einwandfrei, aber ab da an kommt nur noch Unsinn heraus. Ich traue mich jetzt mal die beiden Quelltexte hier mit anzuhängen: Also erst mal die Motoransteuerung:
1 | //C0 cw in vom Mainframe
|
2 | //C1 ccw in vom Mainframe
|
3 | //
|
4 | //C2 Taster K?ltebad
|
5 | //C3 Taster W?rmebad
|
6 | //
|
7 | //D6 cw out zum Motor -> Richtung K?ltebad
|
8 | //D7 ccw out zum Motor -> Richtung W?rmebad
|
9 | //D2 LED on als Anzeige das mit dem Beladen begonnen werden kann
|
10 | |
11 | #define F_CPU 1000000UL
|
12 | |
13 | //#include <inttypes.h>
|
14 | #include <stdint.h> |
15 | #include <avr/io.h> |
16 | #include <util/delay.h> |
17 | //#include <avr/interrupt.h>
|
18 | |
19 | |
20 | #define MOTOR_DDR DDRD //MOTOR und LED
|
21 | #define TASTER_DDR DDRC //Anschlagtaster und Mainframe
|
22 | #define MOTOR_PORT PORTD //PORTD
|
23 | #define STROMVERSORGUNG PD5 //LED
|
24 | #define MOTORCW_PORTPIN PD6 //Richtung Kältebad
|
25 | #define MOTORCCW_PORTPIN PD7 //Richtung Wärmebad
|
26 | |
27 | #define MAIN_CW PC0 //cw vom Mainframe -> Richtung Kältebad
|
28 | #define MAIN_CCW PC1 //ccw vom Mainframe -> Richtung Wärmebad
|
29 | #define TASTER_KALT PC2 //Anschlagtaster Kältebad
|
30 | #define TASTER_WARM PC3 //Anschlagtaster Wärmebad
|
31 | |
32 | |
33 | |
34 | |
35 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
36 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
37 | |
38 | //****************************************
|
39 | //Einstiegspunkt
|
40 | int main(void) |
41 | {
|
42 | |
43 | TASTER_DDR = 0x00; //Eing?nge |
44 | MOTOR_DDR = 0xFF; //Ausg?nge |
45 | MOTOR_PORT = 0x00; //D-PINs alle auf low |
46 | |
47 | //Initialisierung : erst mal zum Kältebad fahren
|
48 | for(int a=0; a<20; a++){ _delay_ms( 1000 ); } |
49 | //Wenn Taster vom K?ltebad aus,
|
50 | if(!(PINC & (1<<TASTER_KALT))) |
51 | {
|
52 | //=> Motor Richtung K?ltebad fahren.
|
53 | MOTOR_PORT |= (1<<MOTORCW_PORTPIN); |
54 | MOTOR_PORT |= (1<<STROMVERSORGUNG); |
55 | |
56 | //warten bis Taster vom K?ltebad durch Motor gedr?ckt wurde
|
57 | while(!(PINC & (1<<TASTER_KALT))) |
58 | {}
|
59 | |
60 | //=> Motor anhalten
|
61 | MOTOR_PORT &= ~(1<<MOTORCW_PORTPIN); |
62 | MOTOR_PORT &= ~(1<<STROMVERSORGUNG); |
63 | }
|
64 | |
65 | // Hauptroutine
|
66 | while(1) |
67 | {
|
68 | //Mainframe: Wenn Signal f?r Richtung W?rmebad anliegt
|
69 | if((PINC & (1<<MAIN_CCW)) && !(PINC & (1<<MAIN_CW))) |
70 | {
|
71 | //=> Motor Richtung W?rmebad fahren.
|
72 | MOTOR_PORT |= (1<<MOTORCCW_PORTPIN); |
73 | MOTOR_PORT |= (1<<STROMVERSORGUNG); |
74 | |
75 | //warten bis Taster vom K?ltebad durch Motor gedr?ckt wurde
|
76 | while(!(PINC & (1<<TASTER_WARM))) |
77 | {}
|
78 | |
79 | //=> Motor anhalten
|
80 | MOTOR_PORT &= ~(1<<MOTORCCW_PORTPIN); |
81 | MOTOR_PORT &= ~(1<<STROMVERSORGUNG); |
82 | }
|
83 | //Mainframe: Wenn Signal f?r Richtung K?ltebad anliegt
|
84 | else if((PINC & (1<<MAIN_CW)) && !(PINC & (1<<MAIN_CCW))) |
85 | {
|
86 | //=> Motor Richtung K?ltebad fahren.
|
87 | MOTOR_PORT |= (1<<STROMVERSORGUNG); |
88 | MOTOR_PORT |= (1<<MOTORCW_PORTPIN); |
89 | |
90 | //warten bis Taster vom K?ltebad durch Motor gedr?ckt wurde
|
91 | while(!(PINC & (1<<TASTER_KALT))) |
92 | {}
|
93 | |
94 | //=> Motor anhalten
|
95 | MOTOR_PORT &= ~(1<<MOTORCW_PORTPIN); |
96 | MOTOR_PORT &= ~(1<<STROMVERSORGUNG); |
97 | }
|
98 | //Taster: K?ltebad ODER W?rmebad gedr?ckt
|
99 | //else if( ( (PINC & (1<<TASTER_KALT)) || (PINC & (1<<TASTER_WARM)) )
|
100 | //und wenn Motor noch nicht angehalten wurde
|
101 | //&& ( PORTD & (1<<MOTORCW_PORTPIN) || PORTD & (1<<MOTORCCW_PORTPIN) ) )
|
102 | //{
|
103 | //Motor anhalten (cw und ccw Pin f?r Motor auf Low setzen)
|
104 | // MOTOR_PORT &= ~( (1<<MOTORCW_PORTPIN) | (1<<MOTORCCW_PORTPIN) | (1<<STROMVERSORGUNG) );
|
105 | //}
|
106 | |
107 | }//Hauptroutine / while(1) |
108 | }//main() |
Hier noch der Mainframe:
1 | //B2 Taster K?ltebad
|
2 | //B3 Taster W?rmebad
|
3 | |
4 | |
5 | |
6 | #include <avr/io.h> |
7 | #include <avr/interrupt.h> |
8 | #define F_CPU 2000000
|
9 | #include <util/delay.h> |
10 | #include <inttypes.h> |
11 | #include <stdint.h> |
12 | |
13 | #define TRUE 1
|
14 | #define FALSE 0
|
15 | |
16 | // Anchlussbelegung:
|
17 | |
18 | #define KTEMP_DDR DDRD //Temperatur Input vom Kältebad
|
19 | #define WTEMP_DDR DDRC //Temperatur Input vom Wärmebad
|
20 | #define PTEMP_DDR DDRA //Temperatur Input von Probe
|
21 | |
22 | #define MOTOR_DDR DDRB //Datenrichtung zum Motor-Steuer-Atmega festlegen
|
23 | #define MOTOR_OUT PORTB //Ausgänge zum Motor-Steuer-Atmega
|
24 | #define MOTOR_IN PINB
|
25 | |
26 | #define WTEMP_IN PINC //Wärmebad abfragen
|
27 | #define KTEMP_IN PIND //Kältebad abfragen
|
28 | #define PTEMP_IN PINA //Probentemperatur abfragen
|
29 | |
30 | #define CW PB0 //Motor cw richtung Kältebad
|
31 | #define CCW PB1 //Motor ccw richtung Wärmebad
|
32 | #define KB PB2 //Taster Kältebad abfragen
|
33 | #define WB PB3 //Taster Wärmebad abfragen
|
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | int main(void) |
43 | {
|
44 | uint8_t w_temp = 0; //Variable zum speichern der Zustände vom Wärmebad |
45 | uint8_t k_temp = 0; //Variable zum speichern der Zustände vom Kältebad |
46 | uint8_t p_temp = 0; //Variable zum speichern der Zustände von der Probe |
47 | |
48 | const uint16_t pause = 200; |
49 | const uint16_t pause_2 =80; |
50 | |
51 | |
52 | KTEMP_DDR = 0x00; //Eing?nge |
53 | WTEMP_DDR = 0x00; //Eing?nge |
54 | PTEMP_DDR = 0x00; //Eing?nge |
55 | //B0 und B1 als Ausgänge, B2 und B3 als Eingänge:
|
56 | MOTOR_DDR = DDRB = (1 << DDB0) | (1 << DDB1) | (0 << DDB2) | (0 << DDB3); |
57 | |
58 | |
59 | |
60 | //Pause für 20 Sekunden damit alles andere initialisieren kann
|
61 | //for(int a=0; a<10; a++){_delay_ms( 1000 )};
|
62 | |
63 | |
64 | do
|
65 | {
|
66 | k_temp = KTEMP_IN; //Temp vom Kältebad abholen |
67 | p_temp = PTEMP_IN; //Temp der Probe abholen |
68 | w_temp = WTEMP_IN; //Temp vom Wärmebad abholen |
69 | |
70 | //Wenn Taster vom K?ltebad an (d.h. Probe ist im Kältebad)
|
71 | if((PINB & (1<<KB)) && (p_temp <= k_temp + 1)) |
72 | {
|
73 | //ins Wärmebad fahren)
|
74 | PORTB &= ~ (1<<CCW); |
75 | PORTB |= (1<<CW); |
76 | }
|
77 | |
78 | //Wenn Taster vom Wärmebad an (d.h. Probe ist im Wärmebad)
|
79 | else if((PINB & (1<<WB)) && (p_temp >= w_temp - 1)) |
80 | {
|
81 | //ins Kältebad fahre
|
82 | PORTB &= ~ (1<<CW); |
83 | PORTB |= (1<<CCW); |
84 | }
|
85 | } //ENDE do |
86 | while(1); |
87 | |
88 | } //ENDE main |
danke Rocco