Forum: Mikrocontroller und Digitale Elektronik Probleme bei Programm


von Matthias S. (Firma: asdf) (mks)


Lesenswert?

Hiho!

Das is ein vorläufiges Testprogramm welches auf dem PORTD ein Bitmuster 
(für eine 7segment anzeige) ausgibt und auf dem PORTB ein paar eingänge 
(PB5 & PB6 sind relevant) hat.
Mit PB5 erhöhe ich die zahl die ausgegeben werden soll um eins mit PB6 
erniedrige ich sie.
Mein Problem ist, dass das genau 1 mal funktioniert und danach nicht 
mehr, sprich es tut sich nichts mehr wenn ich drauf drücke.

Außerdem hab ich festgestellt wenn ich PB0 als als eingang verwende um 
höher zu schalten (z.b.) dann kann ich auch öfter erhöhen als einmal 
(also so wie es eigentlich funktionieren sollte).

thx for help schon mal

mfg mks
1
#include <90s2313.h>
2
#include <delay.h> 
3
                                  
4
#define PB0 (((PINB)&(1<<0)))     
5
#define PB1 (((PINB)&(1<<1)))   
6
#define PB2 (((PINB)&(1<<2)))   
7
#define PB3 (((PINB)&(1<<3)))   
8
#define PB4 (((PINB)&(1<<4)))   
9
#define PB5 (((PINB)&(1<<5)))   
10
#define PB6 (((PINB)&(1<<6))) 
11
#define PB7 (((PINB)&(1<<7)))
12
#define tast_sek (((PINB)&(1<<5))) 
13
#define tast_sek2 (((PINB)&(1<<6)))                                
14
15
void main(void) {    
16
        unsigned char count;       
17
        unsigned char hold;     
18
        unsigned char hold2;
19
        unsigned char numbers[] = {     00111111,       //0
20
                                        01100000,       //1
21
                                        11011010,       //2
22
                                        11110010,       //3
23
                                        01100110,       //4
24
                                        10110110,       //5
25
                                        10111110,       //6
26
                                        11100000,       //7
27
                                        11111110,       //8
28
                                        11110110        //9
29
                                  };  
30
        unsigned char numbers_h[] = {   0x3f,       //0
31
                                        0x06,       //1
32
                                        0x5b,       //2
33
                                        0x4f,       //3
34
                                        0x66,       //4
35
                                        0x6d,       //5
36
                                        0x7d,       //6
37
                                        0x07,       //7
38
                                        0x7f,       //8
39
                                        0x6f        //9
40
                                  };
41
42
        DDRB=0b10001111;   
43
        //DDRB=0x00;
44
        DDRD=0b11111111;
45
        PORTB=0b10001111;
46
47
     
48
        count = 0;              
49
        hold = 0;            
50
        hold2 = 0;
51
        while (1) {  
52
                if(count == 10) {
53
                        count = 0;
54
                }
55
                if(count == -1) {
56
                        count = 9;
57
                }
58
                
59
                PORTD = ~numbers_h[count];   
60
                
61
                if(tast_sek == 0 && hold == 0) {
62
                        count = count + 1;
63
                        hold = 1;
64
                }
65
                else if(tast_sek == 1 && hold == 1) {
66
                        hold = 0;
67
                }
68
                if(tast_sek2 == 0 && hold2 == 0) {
69
                        count = count - 1;
70
                        hold2 = 1;
71
                }
72
                else if(tast_sek2 == 1 && hold2 == 1) {
73
                        hold2 = 0;
74
                }
75
        };
76
}

von Karl H. (kbuchegg)


Lesenswert?

Wenn du hier

                else if(tast_sek == 1 && hold == 1) {

mal die Makro Expansion vornimmst, dann ergibt das

           else if( (((PINB)&(1<<5))) && hold == 1 ) {

nun ist das Ergebnis von PINB & (1<<5) aber nicht 1, wenn
die Taste nicht gedrückt ist. Wenn das 5. te Bit am PINB
auf 1 ist, dann hast du die Binärzahl  0010 0000 und das
ist Dezimal 32 und nicht 1.

Wenn schon, dann ist es sicherer abzuprüfen, ob das Ergebnis
von PINB & ( 1 << 5 ) ungleich 0 ist. Dann spielt der exakte
Zahlenwert keine Rolle. Die Hauptsache er ist nicht 0, denn
0 kann er nur dann sein, wenn die Taste gedrückt wurde.

Aber auch so, wirst du mit dieser Form der Entprellung keine
Freude haben. Sie wird schlicht und ergreifend nicht richtig
funktionieren, je nachdem wie alt und abgenutzt deine Taster
bereits sind.

von Matthias S. (Firma: asdf) (mks)


Lesenswert?

Thx für die Antwort - das war das Problem.

Das mit den entprellten tasten weiß ich schon. Aber zur zeit bin ich 
noch am testen und "wiedereinarbeiten" nach ner längeren uC pause...

mfg mks

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.