Schrittmotor mit Atmega 8 warum geht PD0 als Eingang nicht?

OP #2080686
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
OP
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
  }
Gast
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.
Gast
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
Gast
Nun habe ich einen anderen MEGA8 versucht. Und siehe da bei dem gehts.

Offensichtlich haben diese Bastlerdinge so grosse Exemplarstreuungen.

Gruß peter
OP
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

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.