www.mikrocontroller.net

Forum: Compiler & IDEs einfache Motorsteuerung Atmega und C


Autor: Rocco L. (kaufparkangucker)
Datum:

Bewertung
0 lesenswert
nicht 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)
//C0 cw in vom Mainframe
//C1 ccw in vom Mainframe
//
//C2 Taster K?ltebad
//C3 Taster W?rmebad
//
//D0 cw out zum Motor  -> Richtung K?ltebad
//D1 ccw out zum Motor  -> Richtung W?rmebad
//D2 LED on als Anzeige das mit dem Beladen begonnen werden kann

//#define F_CPU 1000000UL

//#include <inttypes.h>
#include <stdint.h>
#include <avr/io.h>
//#include <util/delay.h>
//#include <avr/interrupt.h>

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//****************************************
//Einstiegspunkt
int main(void)
{

        DDRC = 0x00;    //Eing?nge
        DDRB = 0x00;    //Eing?nge
        DDRD = 0xFF;    //Ausg?nge

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

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

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

                //=> Motor anhalten
                PORTD &= ~(1<<PIND0);          //D0 low
        }
        
        // Hauptroutine
        while(1)
        {
                //Mainframe: Wenn Signal f?r Richtung W?rmebad anliegt
                if((PINC & (1<<PINC1)) && !(PINC & (1<<PINC0)))         //C1 high && C0 low
                {
                        //=> Motor Richtung W?rmebad fahren.
                        PORTD |= (1<<PIND1);              //D1 high
                }
                //Mainframe: Wenn Signal f?r Richtung K?ltebad anliegt
                else if((PINC & (1<<PINC0)) && !(PINC & (1<<PINC1)))  //C0 high // C1 high
                {
                        //=> Motor Richtung K?ltebad fahren.
                        PORTD |= (1<<PIND0);              //D0 high
                }
                //Taster: K?ltebad ODER W?rmebad gedr?ckt
                else if( ( (PINC & (1<<PINC2)) || (PINC & (1<<PINC3)) )
                                                //und wenn Motor noch nicht angehalten wurde
                                                && ( PORTD & (1<<PIND0) || PORTD & (1<<PIND1) ) )
                {
                        //Motor anhalten (cw und ccw Pin f?r Motor auf Low setzen)
                        PORTD &= ~( (1<<PIND0) | (1<<PIND1) );
                }

        }//Hauptroutine / while(1)

}//main()


Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rocco L. (kaufparkangucker)
Datum:

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

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Portdx statt Pindx

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Rocco L. (kaufparkangucker)
Datum:

Bewertung
0 lesenswert
nicht 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?:
#include <stdint.h>
#include <avr/io.h>

#define PD1     1
#define PD0     0

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

   while(1){
    PORTD |= (1<<PD1);
   }
}

Autor: Rocco L. (kaufparkangucker)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rocco L. (kaufparkangucker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habe jetzt alles noch mal aufgehübscht und es funzt.

Dank an alle Helfer.

vG Rocco

Autor: Michael Buesch (mb_)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.