mikrocontroller.net

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


Autor: stairzup (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
        while(1){                                   //messen
            Dat[MessNr]=ADR1H*2.5-420;              //Berechnung der Temperatur
            MessNr=MessNr+1;                                    
            for(i=1;i<=20;i++){                     //Schleife für Pause und Abbruch bei T2
                DelayXms(50);
                if (PORTD==2){
                    break;
                }
            }
        }
Hier das gesammte Programm:
#include <hc12.h>         /* Registerdefinitionen HC12 */  
#include <lbios_gcc.h>    /* Interface zu LBIOS Assemblerprogrammen */
#include <stdio.h>        /* C Standard I/O-Funktionen */

int main(void){
    int  MessNr,MessNrb, rzeit, i;
    unsigned char Dat[1000];
    LcdInit(&PORTH,&DDRH);                      //Initialisierung Lcd am PORTH
    LcdCursOff();                               //Cursor unsichtbar
    LcdCursSet(0x80);                           //Cursor Zeile 1 Spalte 1
    DDRD=0;                                     //Initialisierung
    DDRJ=0xff;
    AtdInit();
    
    while(1){                                    
        PORTJ=0;
        LcdClr();
        LcdCursSet(0x80);                                    
        LcdWrite("Taste 0 druecken");
        LcdCursSet(0xC0);                                    
        LcdWrite("um die Messung");
        LcdCursSet(0x90);                                    
        LcdWrite("zu starten...");
        
        while(PORTD!=1);                            //warte auf T0
        
        PORTJ=1;                                    //Kontrollleuchte=An
        MessNr=0;
        Zeichen='*';              
        while(1){                                   //messen
            Dat[MessNr]=ADR1H*2.5-420;              //Berechnung der Temperatur
            MessNr=MessNr+1;                                    
            for(i=1;i<=20;i++){                     //Schleife für Pause und Abbruch bei T2
                DelayXms(50);
                if (PORTD==2){
                    break;
                }
            }
        }
        
        LcdClr();
        LcdCursSet(0x80);                                    
        LcdWrite("Messung beendet.");
        PORTJ=0;
        while(PORTD!=128);                          //warte auf T7
        PORTJ=128;                                  //ausgeben
        printf("\n\n\n%u Lemps12 Messwerte\n",MessNr-1);
        printf("\nMW Nr:\t\n\n");
        for(MessNrb=1;MessNrb<MessNr;MessNrb++){
            printf("%u:\t%u Grad\n",MessNrb,Dat[MessNrb-1]);
        }
    }
    return 0;
}


Autor: Magnus Müller (Gast)
Datum:

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

Autor: Magnus Müller (Gast)
Datum:

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

Autor: stairzup (Gast)
Datum:

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

Autor: Mark Brandis (markbrandis)
Datum:

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

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.