Forum: Compiler & IDEs einfache Motorsteuerung Atmega und C


von Rocco L. (kaufparkangucker)


Lesenswert?

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()

von Peter D. (peda)


Lesenswert?

Rocco L. schrieb:
> mein Programm im Anhang will es einfach nicht tun

Und nun sollen wir erstmal raten, was es nicht tun will?

Eine Fehlerbeschreibung sieht so aus:
- Eingabe
- Ausgabe erwartet
- Abweichung davon


Peter

von Rocco L. (kaufparkangucker)


Lesenswert?

D0 ist während der Initialisierung nicht high - ich verstehe nicht warum

von Philipp (Gast)


Lesenswert?

Portdx statt Pindx

von Stefan E. (sternst)


Lesenswert?

Welcher AVR ist es denn? Vielleicht einer mit JTAG-Interface?
Und wie sind die Taster/Endkontakte überhaupt angeschlossen?

von Rocco L. (kaufparkangucker)


Lesenswert?

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
}

von Rocco L. (kaufparkangucker)


Lesenswert?

ach so es ist ein Atmega48
und die Taster sind gegen Vcc geschalten - also wenn ich sie drücke 
liegt Vcc am Eingangspin des Atmega an

von Stefan E. (sternst)


Lesenswert?

Rocco L. schrieb:
> und die Taster sind gegen Vcc geschalten - also wenn ich sie drücke
> liegt Vcc am Eingangspin des Atmega an

Und was liegt an, wenn der Taster nicht gedrückt ist?
Oder anders gefragt: hast du an die Pull-Downs gedacht?

von Karl H. (kbuchegg)


Lesenswert?

Rocco L. schrieb:
> 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?:

Wenn deine LED tatsächlich so verschaltet sind, wie du sagst, dann ja 
(den Vorwiderstand der LED hast du hoffentlich nicht vergessen).
Was sagt denn dein Voltmter? Ist der Pin auf 5V oder ist er es nicht?

von Rocco L. (kaufparkangucker)


Lesenswert?

So, habe jetzt alles noch mal aufgehübscht und es funzt.

Dank an alle Helfer.

vG Rocco

von Michael B. (mb_)


Lesenswert?

Rocco L. schrieb:
> So, habe jetzt alles noch mal aufgehübscht und es funzt.

WTF? Du willst also nichteinmal sagen wo der Fehler wirklich lag?

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.