-
        

Ergebnis 1 bis 4 von 4

Thema: Denkfehler beim Programmieren

  1. #1
    Neuer Benutzer
    Registriert seit
    29.10.2007
    Alter
    30
    Beiträge
    4

    Denkfehler beim Programmieren

    Anzeige

    Hallo Leute!

    Mein Name ist Daniel und bin neu hier im Forum.
    Werde euch ab heute mit meinen Fragen belästigen.

    und da ist mir dann auch schon eine eingefallen.
    und zwar versuche ich mit einem PIC-16F877 einen Blinktakt zu
    überprüfen.
    Hab also mal ein Unterprogramm geschrieben das quasi überprüfen soll das deras Blinksignal kommt, d.h. nicht immer 1 bzw. nicht immer 0 ist.
    Wie würdet ihr das Problem angehen???

    mfg Daniel

    Code:
    void Blinker(void)
    {
    	while(Taster == 0)
    	{
    		unsigned char a;
    		a = 6;
    	
    		if((PORTB & 0b00001000) == 0b00001000)
    		{
    			a = a + 1;
    		}
    	
    		if(a >= 5)
    		{
    			blink_test = 1;
    		}
    		
    	}
    }

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Zuverlässig kannst Du das wohl nur überprüfen, wenn Du das ganze per Interrupt machst. Du hängst das Signal also an einen Interrupteingang und kannst dann in der ISR zählen, wie oft z.B. eine positive Flanke kommt und so das Blinken registrieren.

    Mit der Polling-Lösung hast Du immer das Risiko, dass Du beim abfragen immer nur den High- bzw. den Low-Pegel des Signal triffst.

    askazo

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    habe leider keinen pic zum testen da und in letzter zeit eher pc software gebastelt, deshalb ohne gewähr (bei den atmegas fragt man PINB ab). ich habe angenommen, dass Taster während der "messung" = 0 ist und seinen zustand auch innerhalb der funktion ändern kann (sonst läuft die funktion, bis ein flankenwechsel erfasst wird).
    Code:
    int check()
    {
      int state=PINB&0b00001000;
      while(Taster==0&&(PINB&0b00001000==state);
      if(Taster==0)return 1;
      else return 0;
    }
    gruesse

  4. #4
    Neuer Benutzer
    Registriert seit
    29.10.2007
    Alter
    30
    Beiträge
    4
    Danke @askazo und robocat;
    Hab mich für die Interrupt variante entschieden und hat auf anhieb funktioniert.

    das sieht dann wie folgt aus:

    Code:
    void interrupt isr(void)
    { 
    
    	GIE=0;
    	
    
    
        if (RBIF)                  // Am port B hat sich etwas geändert
        {
    	  
          if ((PORTB & 0b00010000) == 0b00010000)
    		{
    			a = a + 1;   // variable a die bei jeder high flanke um 1             
                                              // erhöht wird
    		}
    		
    		if (a >= 15)
    		{
    			Blink_test = 1;
    		}
       }

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •