einfache Motorsteuerung Atmega und C

OP #2054290
Hallo,

mein Programm im Anhang will es einfach nicht tun - ich sehe den Fehler 
nicht.

ich habe Testweise LED's an D0 und D1. Später soll da eine H-Brücke hin 
mit der ich einen Motor in seiner Laufrichtung beeinflussen kann.

Es gibt zwei Anschlagtaster so das der Motor jeweils nach einer halben 
Runde mit einem Arm an einen Taster anstößt und dadurch weis das er da 
angekommen ist wo er hin soll.

Am Anfang wird eine Initialisierung gemacht. D.h. es wird geguckt ob der 
Anschlagtaster C2 gedrückt ist - wenn nicht wird in Richtig dieses 
Tasters gefahren (D0 high) bis C2 ein high von sich gibt.

Nach der Initialisierung wird auf ein high an C0 oder C1 gewartet und je 
nach dem in die eine Richtung oder die andere Richtung gedreht (D0 oder 
D1 high) bis der jeweilige anschlagtaster ausgelöst wurde (C2 oder C3 
high)
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
//D0 cw out zum Motor  -> Richtung K?ltebad
8
//D1 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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
21

22
//****************************************
23
//Einstiegspunkt
24
int main(void)
25
{
26

27
        DDRC = 0x00;    //Eing?nge
28
        DDRB = 0x00;    //Eing?nge
29
        DDRD = 0xFF;    //Ausg?nge
30

31
        PORTD = 0x00; //D-PINs alle auf low
32

33
        //Wenn Taster vom K?ltebad aus,
34
        if(!(PINC & (1<<PINC2)))            //C2 low
35
        {
36
                //=> Motor Richtung K?ltebad fahren.
37
                PORTD |= (1<<PIND0);          //D0 high
38

39
                //warten bis Taster vom K?ltebad durch Motor gedr?ckt wurde
40
                while(!(PINC & (1<<PINC2)))        //C2 low -> warten auf high
41
                {}
42

43
                //=> Motor anhalten
44
                PORTD &= ~(1<<PIND0);          //D0 low
45
        }
46
        
47
        // Hauptroutine
48
        while(1)
49
        {
50
                //Mainframe: Wenn Signal f?r Richtung W?rmebad anliegt
51
                if((PINC & (1<<PINC1)) && !(PINC & (1<<PINC0)))         //C1 high && C0 low
52
                {
53
                        //=> Motor Richtung W?rmebad fahren.
54
                        PORTD |= (1<<PIND1);              //D1 high
55
                }
56
                //Mainframe: Wenn Signal f?r Richtung K?ltebad anliegt
57
                else if((PINC & (1<<PINC0)) && !(PINC & (1<<PINC1)))  //C0 high // C1 high
58
                {
59
                        //=> Motor Richtung K?ltebad fahren.
60
                        PORTD |= (1<<PIND0);              //D0 high
61
                }
62
                //Taster: K?ltebad ODER W?rmebad gedr?ckt
63
                else if( ( (PINC & (1<<PINC2)) || (PINC & (1<<PINC3)) )
64
                                                //und wenn Motor noch nicht angehalten wurde
65
                                                && ( PORTD & (1<<PIND0) || PORTD & (1<<PIND1) ) )
66
                {
67
                        //Motor anhalten (cw und ccw Pin f?r Motor auf Low setzen)
68
                        PORTD &= ~( (1<<PIND0) | (1<<PIND1) );
69
                }
70

71
        }//Hauptroutine / while(1)
72

73
}//main()
OP
Also vom Pin D0 und D1 geht es jeweils zur Anode einer LED und von der 
LED Kathode weiter zu GND.

follgendes sollte do eine LED einschalten - oder?:
1
#include <stdint.h>
2
#include <avr/io.h>
3

4
#define PD1     1
5
#define PD0     0
6

7
int main(void)
8
{
9
        DDRD = 0xFF;    //Ausg?nge
10
        PORTD = 0x00; //D-PINs alle auf low
11

12
   while(1){
13
    PORTD |= (1<<PD1);
14
   }
15
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.