Forum: Mikrocontroller und Digitale Elektronik Schrittmotor mit Atmega 8 warum geht PD0 als Eingang nicht?


von Martin e. C. (eduardo)


Lesenswert?

Hallo ich möchte über ein ganz einfache Schaltung ein Unipolares 
Schrittmotor über 2 Taster ansteuern so dass z.B. Taster 1 gedruckt dann 
dreht der Motor in eine Richtung, Taster 2 gedruckt dann dreht in der 
andere Richtung.

Mein Problem:
Ich habe die zwei Taster am Port D0 und D1 des Atmegas angeschlossen 
(Aktiv Low).
Wenn ich die Taster 1 drucke (Port D0) passiert nichts.
Wenn ich Taster 2 drucke dann dreht der Motor wie gewünscht!

Nehme statt PD0 für Taster 1 z.B PD4 dann funktionieren beide Richtungen 
wie gewünscht warum das??

Gruß
Martin

von hp-freund (Gast)


Lesenswert?

PD0 ist auch RxD. Hast Du in deinem Programm die serielle Schnittstelle 
initialisiert?

Sonst brauchen wir wohl den Quelltext...

von Martin e. C. (eduardo)


Lesenswert?

hp-freund schrieb:
> PD0 ist auch RxD. Hast Du in deinem Programm die serielle Schnittstelle
> initialisiert?

Nein eingentlich nicht!

Quelltext ganz primitiv:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
#include "lcd-routines.h"
5
6
#define NEGRO       _BV(PC0)
7
#define AMARILLO    _BV(PC1)
8
#define GRIS        _BV(PC2)
9
#define NARANJA     _BV(PC3)
10
11
#define DELAY   4
12
#define DELAY2  6 
13
14
15
//const uint8_t rechts[] = {NARANJA, GRIS, AMARILLO, NEGRO}; // rückfahrt
16
//const uint8_t links[] = {NEGRO, AMARILLO, GRIS, NARANJA};
17
18
//uint8_t i;
19
20
void rueck_vor_fahrt (void)
21
{
22
  while(1)
23
  
24
    {
25
    if ( PIND & (1<<PIND1)) {
26
    PORTC = NARANJA;    
27
    _delay_ms(DELAY);    
28
    PORTC = GRIS;    
29
    _delay_ms(DELAY);    
30
    PORTC = AMARILLO;    
31
    _delay_ms(DELAY);    
32
    PORTC = NEGRO;    
33
    _delay_ms(DELAY);
34
    }
35
    
36
    if ( PIND & (1<<PIND4)) {
37
    PORTC = NEGRO;    
38
    _delay_ms(DELAY);    
39
    PORTC = AMARILLO;    
40
    _delay_ms(DELAY);    
41
    PORTC = GRIS;    
42
    _delay_ms(DELAY);    
43
    PORTC = NARANJA;    
44
    _delay_ms(DELAY);
45
    }
46
    
47
    else {
48
      PORTC = 0x00;
49
      break;
50
      }
51
    }
52
}
53
54
//---------------------- 1. versucht ok!
55
56
57
int main(void)
58
59
  {  
60
  DDRC = 0xff;     
61
  PORTC = 0x00;
62
  DDRD = 0x00;     
63
               
64
      while(1)
65
    {
66
        rueck_vor_fahrt();
67
68
    }
69
  }

von Hubert G. (hubertg)


Lesenswert?

PullUp an PortD aktivieren oder externe PullUp verwenden.
Ausserdem fragst du auf 1 ab.

von hp-freund (Gast)


Lesenswert?

Ich fürchte Du musst deine Funktion noch mal überarbeiten. Zur Zeit 
reagiert die if Abfrage auf H am Eingang, also Taste nicht gedrückt.
Dann gibt es für 2 mal if nur ein else? Delay ist auch recht klein.
Schau mal hier:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Tasten_und_Schalter

von Martin e. C. (eduardo)


Lesenswert?

Ich verwende externe PullUp also 10k pro Taster

Hubert G.:
> Ausserdem fragst du auf 1 ab.

Sorry habe ich mich vertipp, Taster sind "HIGH-Aktiv"

von Petrov (Gast)


Lesenswert?

Also Pull-UPs und High aktive Taster ?

von Martin e. C. (eduardo)


Angehängte Dateien:

Lesenswert?

so, für etwas Klarheit Taster sind so wie im Bild

von Tobi (Gast)


Lesenswert?

hp-freund schrieb:
> Dann gibt es für 2 mal if nur ein else? Delay ist auch recht klein.

Was hat Delay damit zu tun? damit dreht er der Motor schnell oder 
langsam.

von Petrov (Gast)


Lesenswert?

Habe das probiert. Funktioniert bei meinem ATmega 8 an PD0 mit 10K 
Pull-down
auch nicht.

Offensichtlich ist der Atmega8 nicht in der Lage diesen Pin mit 10K weit 
genug runter zu ziehen.

man lernt nie aus !!

Mit 1K8 gehts.

besser ist: Interner pullup und Taster gegen Ground - geht immer

Gruß peter

von hp-freund (Gast)


Lesenswert?

Tobi schrieb:
> Was hat Delay damit zu tun? damit dreht er der Motor schnell oder
> langsam.

So lange die Taste noch prellt auch mehrfach mit Pause zwischendurch ;)

von Petrov (Gast)


Lesenswert?

Nun habe ich einen anderen MEGA8 versucht. Und siehe da bei dem gehts.

Offensichtlich haben diese Bastlerdinge so grosse Exemplarstreuungen.

Gruß peter

von Martin e. C. (eduardo)


Lesenswert?

Hallo Petrov,
vielen Dank für das Testen, ich hätte nicht darauf gekommen.

@hp-freund
verstehe nicht ganz was du meins.
Was Tobi sagt ist genau was ich mache, gebe ich z.B 10 an der Delay dann 
dreht der Motor natürlich Langsamer.


Gruß
Martin

von hp-freund (Gast)


Lesenswert?

Wenn Du gute Taster so wie hier hast:
http://de.wikipedia.org/wiki/Prellen
ist nach 16ms der Zustand natürlich schon stabil.

Wenn sie nicht so gut sind, kann es sein das Du bei der if Abfrage mal H 
und mal L erwischst solange die Taste gedrückt ist/prellt.

von hp-freund (Gast)


Lesenswert?

Nachtrag: Das wirst Du nicht sehen, sondern nur messen können...

von Martin e. C. (eduardo)


Lesenswert?

Ok kapiert, normallerweise benutze ich das Routine von Peter Danneger 
zum Entprellen, hier kommt auf alle Fälle auch.

Gruß
Martin

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.