Forum: Mikrocontroller und Digitale Elektronik Komisches Verhalten beim Tastendruck


von Daniel (Gast)


Lesenswert?

Nabend,

Ich habe hier einen Tiny2313 an dem sind drei Taster ein MosFed, ein 
Summer und ein LCD. Der Tiny soll meinen LED Belichter steuern und zwar 
habe ich zwei Taster mit dennen ich die Zeit einstellen kann. Das wäre 
bei checkButtons() die ersten zwei PIND3 u. PIND2.

Die beiden funktionieren einwandfrei. Der dritte Button auf PIND6 aber 
nicht. Wird die Variabel status auf 0 gesetzt steht die Zeitschaltuhr 
still. Bei status 1 läuft die Zeitschaltuhr.

Sobald ich Strom draufgebe Startet die Zeitschaltuhr sofort und das LED 
Array ist an. Das sollte es aber nicht! Sobald ich den Taster an PIND6 
drücke geht es aus. Ich kann mir nicht erklären da die drei Taster 
indentisch eingebaut sind.

THX 4 Help
Daniel

1
#include "LEDBelichter.h"
2
3
uint8_t status;
4
uint8_t beep;
5
volatile unsigned long Sekunden=30;
6
volatile unsigned long Minuten=8;
7
ISR(TIMER1_COMPA_vect)
8
{
9
  if(status == 1)
10
  {
11
    if(Minuten == 0 && Sekunden == 0)
12
    {
13
      status = 2;
14
    } 
15
    else 
16
    {
17
      if(Sekunden == 0)
18
      {
19
        Minuten--;
20
        Sekunden = 59;
21
      }
22
      else
23
      {
24
        Sekunden--;
25
      }  
26
    }
27
  }
28
}
29
30
// PIND0 MosFet [Ausgang]
31
// PIND1 Summer [Ausgang]
32
// PIND2 JP2 -> [Eingang]
33
// PIND3 JP1 -> [Eingang]
34
// PIND6 JP3 -> [Eingang]
35
void init()
36
{
37
  status = 0;
38
  beep = 1;
39
  lcd_init(LCD_DISP_ON);
40
  //Registerinitialisierung
41
  TCCR1A = 0b00000000;                      //Timer im CTC-Mode; Prescaler 256; CPU-Clock
42
  TCCR1B = 0b00001100;                      //Timer im CTC-Mode; Prescaler 256; CPU-Clock
43
  TCCR1C = 0b00000000;                      //Timer im CTC-Mode; Prescaler 256; CPU-Clock
44
  TIMSK  = 0b01000000;                      //Interrupt bei Compare Match
45
  OCR1A  = 62499;                          //genau eine Sekunde; Comparematch-Register
46
47
  DDRD &= ~((1<<DDD2)|(1<<DDD3)|(1<<DDD6));
48
  DDRD |= (1<<DDD1) | (1<<DDD0);    
49
  PORTD = ((1<<PD2) | (1<<PD3) | (1<<PD6));
50
  sei();
51
52
53
}
54
55
int main(void)
56
{
57
58
    init();
59
  
60
  for (;;) 
61
  { 
62
     if( (!(PORTD & (1 << PD0))) && status == 1) // LED-Array
63
     {
64
      PORTD |= (1<<PD0);
65
66
     } else if (status == 0 || status == 2){
67
      PORTD &= ~(1<<PD0);
68
     }
69
     if(status == 2 && beep == 1) //beep
70
     {
71
       cli();
72
      uint8_t i;
73
      for(i=0;i<4;i++)
74
      {
75
        PORTD |= (1<<PD1);
76
        _delay_ms(1000);
77
        PORTD &= ~(1<<PD1);  
78
        _delay_ms(1000);
79
      }
80
      beep = 0;
81
      sei();
82
     }
83
     
84
     checkButtons();
85
     _delay_ms(100);
86
     updateLcd();
87
  }
88
}
89
90
void checkButtons()
91
{
92
    if(PIND & (1<<PIND3))
93
  {
94
    cli();
95
    status = 0;
96
    if(Sekunden <= 55)
97
    {
98
      Sekunden += 5;
99
    } 
100
    else 
101
    {
102
      Sekunden = 0;
103
      if(Minuten <= 30)
104
        Minuten++; 
105
    }
106
107
    sei();
108
  }
109
  if(PIND & (1<<PIND2))
110
  {
111
    cli();
112
    status = 0;
113
    if(Sekunden >= 5)
114
    {
115
      if(Sekunden == 59)
116
      {
117
        Sekunden -= 4;
118
      } 
119
      else
120
      {
121
        Sekunden -= 5;
122
      }
123
    } 
124
    else 
125
    {
126
      Sekunden = 59;
127
      if(Minuten > 0)
128
        Minuten--; 
129
    }
130
131
    sei();
132
  }
133
  if(PIND & (1<<PIND6))
134
  {
135
  
136
    if(status == 0)
137
    {
138
      cli();
139
      status = 1;  
140
      beep = 1;
141
      sei();
142
    }
143
    
144
  }
145
}
146
147
148
149
void updateLcd()
150
{
151
  lcd_clrscr();
152
    lcd_gotoxy(0,0);
153
  lcd_puts("Status: ");
154
  switch(status)
155
  {
156
    case 0:
157
      lcd_puts("STOP");
158
    break;
159
    case 1:
160
      lcd_puts("RUN");
161
    break;
162
    case 2:
163
      lcd_puts("END");
164
    break;
165
    default:
166
      lcd_puts("NDEF");
167
  }
168
  lcd_gotoxy(0,1);
169
    lcd_puts("Zeit: ");
170
  lcd_puts(getCharFromInt(Minuten/10));
171
  lcd_puts(getCharFromInt(Minuten%10));
172
  lcd_puts(":");
173
  lcd_puts(getCharFromInt(Sekunden/10));
174
  lcd_puts(getCharFromInt(Sekunden%10));
175
}
176
char *getCharFromInt(uint8_t index){
177
  switch(index)
178
  {
179
    case 0:
180
      return "0";
181
    break;
182
    case 1:
183
      return "1";
184
    break;
185
    case 2:
186
      return "2";
187
    break;
188
    case 3:  
189
      return "3";
190
    break;
191
    case 4:
192
      return "4";
193
    break;
194
    case 5:
195
      return "5";
196
    break;
197
    case 6:
198
      return "6";
199
    break;
200
    case 7:
201
      return "7";
202
    break;
203
    case 8:
204
      return "8";
205
    break;
206
    case 9:
207
      return "9";
208
    break;
209
  }
210
  return "?";
211
}

von Walter (Gast)


Lesenswert?

ich hab mir nur die ersten Zeilen angeschaut;
status sollte auf jeden Fall volatile sein!

von Walter (Gast)


Lesenswert?

ach ja, google mal nach entprellen

von Daniel (Gast)


Lesenswert?

@Werner
Prellen kann ein Taster nur wenn er betätigt wird.

Aber ich hab das Problem gelöst. Manchmal hilft einfach etwas Abstand.

Ich bin davon ausgegangen das 2 Taster funktionieren und einer nicht. 
Das war nicht richtig! Alle 3 haben getriggert, nur hat sich 1 und 2 
gegenseitig neutralisiert. Hätte ich die Uhr > 1 Min eingestellt hätte 
ich gesehen das es bei 59 Sekunden stopt.

thx 4 help war mir aber klar das ich irgendwo wieder dünpfiff produziert 
habe^^

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.