Schrittmotor mit Atmega 8 warum geht PD0 als Eingang nicht?

OP #2080686
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
OP #2080718
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
  }
Gast #2080766
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren