Forum: PC-Programmierung Gleichzeitig Schleife durchlaufen und auf Knopfdruck warten.


von stairzup (Gast)


Lesenswert?

Hallo, ich muss gerade ein Projekt für die Schule machen. Dabei nutze 
ich das Lemps12 Mikrocontroller System. Programmieren tu ich das ganze 
in C. Jetzt will ich ein Programm schreiben, das auf Knopfdruck beginnt 
die Messwerte eines Temperatursensors in einem Array zu Speichern und 
das in Abständen von 1 sek. Soweit so gut. Das Programm soll aber auch 
auf Knopfdruck mit dem Aufzeichnen stoppen. Und da komm ich nicht 
weiter. Das Problem ist das der Knopf ein Taster ist... also nur für 
kurze zeit 1 ist. Jetzt habe ich versucht mit einer for-schleife 
mehrmals hintereinander 50ms Pause zu machen und zu überprüfen ob der 
Taster zum abbrechen betätigt ist. Allerdings klappt das nicht....wäre 
sehr dankbar für jede Hilfe. Hier die Schleife für das Schreiben in das 
Array:
1
        while(1){                                   //messen
2
            Dat[MessNr]=ADR1H*2.5-420;              //Berechnung der Temperatur
3
            MessNr=MessNr+1;                                    
4
            for(i=1;i<=20;i++){                     //Schleife für Pause und Abbruch bei T2
5
                DelayXms(50);
6
                if (PORTD==2){
7
                    break;
8
                }
9
            }
10
        }
Hier das gesammte Programm:
1
#include <hc12.h>         /* Registerdefinitionen HC12 */  
2
#include <lbios_gcc.h>    /* Interface zu LBIOS Assemblerprogrammen */
3
#include <stdio.h>        /* C Standard I/O-Funktionen */
4
5
int main(void){
6
    int  MessNr,MessNrb, rzeit, i;
7
    unsigned char Dat[1000];
8
    LcdInit(&PORTH,&DDRH);                      //Initialisierung Lcd am PORTH
9
    LcdCursOff();                               //Cursor unsichtbar
10
    LcdCursSet(0x80);                           //Cursor Zeile 1 Spalte 1
11
    DDRD=0;                                     //Initialisierung
12
    DDRJ=0xff;
13
    AtdInit();
14
    
15
    while(1){                                    
16
        PORTJ=0;
17
        LcdClr();
18
        LcdCursSet(0x80);                                    
19
        LcdWrite("Taste 0 druecken");
20
        LcdCursSet(0xC0);                                    
21
        LcdWrite("um die Messung");
22
        LcdCursSet(0x90);                                    
23
        LcdWrite("zu starten...");
24
        
25
        while(PORTD!=1);                            //warte auf T0
26
        
27
        PORTJ=1;                                    //Kontrollleuchte=An
28
        MessNr=0;
29
        Zeichen='*';              
30
        while(1){                                   //messen
31
            Dat[MessNr]=ADR1H*2.5-420;              //Berechnung der Temperatur
32
            MessNr=MessNr+1;                                    
33
            for(i=1;i<=20;i++){                     //Schleife für Pause und Abbruch bei T2
34
                DelayXms(50);
35
                if (PORTD==2){
36
                    break;
37
                }
38
            }
39
        }
40
        
41
        LcdClr();
42
        LcdCursSet(0x80);                                    
43
        LcdWrite("Messung beendet.");
44
        PORTJ=0;
45
        while(PORTD!=128);                          //warte auf T7
46
        PORTJ=128;                                  //ausgeben
47
        printf("\n\n\n%u Lemps12 Messwerte\n",MessNr-1);
48
        printf("\nMW Nr:\t\n\n");
49
        for(MessNrb=1;MessNrb<MessNr;MessNrb++){
50
            printf("%u:\t%u Grad\n",MessNrb,Dat[MessNrb-1]);
51
        }
52
    }
53
    return 0;
54
}

von Magnus Müller (Gast)


Lesenswert?

Mach doch einfach
1
        while(!(PORTD&2)){                          //messen und Abbruch bei T2
2
            Dat[MessNr]=ADR1H*2.5-420;              //Berechnung der Temperatur
3
            MessNr=MessNr+1;
4
            for(i=1;i<=20;i++){                     //Schleife für Pause
5
                DelayXms(50);
6
            }
7
        }

von Magnus Müller (Gast)


Lesenswert?

Du solltest dir sowieso angewöhnen, die Portbits der relevanten Taster 
auszumaskieren. Deswegen auch meine Änderung von PORTD==2 nach 
!(PORTD&2).

von stairzup (Gast)


Lesenswert?

oh ja... vielen dank für die schnelle hilfe! das sollte klappen! wieso 
sollte man die denn ausmaskieren, also was bringt das? verzeiht mein 
unswissen aber ich bin erst ganz neu in der materie ;)

von Mark B. (markbrandis)


Lesenswert?

Du willst auf ein bestimmtes Bit prüfen. Vielleicht ändern sich aber 
auch noch andere in dem entsprechenden Port. Sind tückische Biester, 
diese Bits. ;-)

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.