www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme bei Programm


Autor: Matthias Schlögl (Firma: asdf) (mks)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <90s2313.h>
#include <delay.h> 
                                  
#define PB0 (((PINB)&(1<<0)))     
#define PB1 (((PINB)&(1<<1)))   
#define PB2 (((PINB)&(1<<2)))   
#define PB3 (((PINB)&(1<<3)))   
#define PB4 (((PINB)&(1<<4)))   
#define PB5 (((PINB)&(1<<5)))   
#define PB6 (((PINB)&(1<<6))) 
#define PB7 (((PINB)&(1<<7)))
#define tast_sek (((PINB)&(1<<5))) 
#define tast_sek2 (((PINB)&(1<<6)))                                

void main(void) {    
        unsigned char count;       
        unsigned char hold;     
        unsigned char hold2;
        unsigned char numbers[] = {     00111111,       //0
                                        01100000,       //1
                                        11011010,       //2
                                        11110010,       //3
                                        01100110,       //4
                                        10110110,       //5
                                        10111110,       //6
                                        11100000,       //7
                                        11111110,       //8
                                        11110110        //9
                                  };  
        unsigned char numbers_h[] = {   0x3f,       //0
                                        0x06,       //1
                                        0x5b,       //2
                                        0x4f,       //3
                                        0x66,       //4
                                        0x6d,       //5
                                        0x7d,       //6
                                        0x07,       //7
                                        0x7f,       //8
                                        0x6f        //9
                                  };

        DDRB=0b10001111;   
        //DDRB=0x00;
        DDRD=0b11111111;
        PORTB=0b10001111;

     
        count = 0;              
        hold = 0;            
        hold2 = 0;
        while (1) {  
                if(count == 10) {
                        count = 0;
                }
                if(count == -1) {
                        count = 9;
                }
                
                PORTD = ~numbers_h[count];   
                
                if(tast_sek == 0 && hold == 0) {
                        count = count + 1;
                        hold = 1;
                }
                else if(tast_sek == 1 && hold == 1) {
                        hold = 0;
                }
                if(tast_sek2 == 0 && hold2 == 0) {
                        count = count - 1;
                        hold2 = 1;
                }
                else if(tast_sek2 == 1 && hold2 == 1) {
                        hold2 = 0;
                }
        };
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Schlögl (Firma: asdf) (mks)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.