Forum: Compiler & IDEs Anfänger: Motorsteuerung funktioniert nicht richtig - mal bitte drüber sehen


von Rocco L. (kaufparkangucker)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Rocco L. schrieb:

> 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.

Dann schaff dir als aller erstes erst mal Möglichkeiten, wie du dir 
Variablenwerte ansehen kannst und dir der µC Werte, die er empfangen hat 
ausgeben kann. Alles andere ist stochern im Nebel, vor allen Dingen dann 
wenn du mehrere µC einsetzt.


> 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.

Man kann also so kompiliziert aufbauen, dass man selber nicht mehr 
durchschaut was da vor sich geht und sich selbst in der selbstgebauten 
Komplexität verliert.

von fff (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Man kann also so kompiliziert aufbauen
lol, nette Wortverschmelzung, muss ich mir merken.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.