- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 59

Thema: Interrupt-Abfrage >>> Routine vereinfachen

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #32
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Hallo Leute.
    Habe an meinem Code weiter gearbeitet, hänge aber gerade an Tasten-/Kontaktentprellung fest.

    Bis auf folgende Anweisung mit "i"-Schleife, funktioniert alle einwandfrei - dank Eurer anregungen!
    "i" in RegA_Abfrage() sollte die 10ms-Schleifen hoch zählen. Sind 30ms (Entprellzeit) keine Veränderung vorgekommen, werden die veränderten Eingänge ausgewertet und verarbeitet.

    Irgendwo scheint sich hier ein Logikfehler zu verstecken, da RegA_Auswertung() nicht mehr angesprochen wird.

    Code:
    ISR(TIM1_COMPA_vect)
    {
    	OverflowZaehler++;
    	EingIntervall++;
    	
    	if(OverflowZaehler >= 60000)				// 1ms*60 000 = 1Min // uint16_t 0…65.535
    	{
    		OverflowZaehlerReset();
    	}
    	if (EingIntervall==10)					// alle 10[ms] werden die Eingangskontakte abgefragt
    	{
    		RegA_Abfrage();					// Eingänge auf Veränderung analysiert
    		EingIntervall=0;
    	}
    }
    
    void RegA_Abfrage(void)
    {	
    	uint8_t RegA_neu;
    	uint8_t RegA_dif;
    	uint8_t i;
    
    	RegA_neu = PINA;						// PINA-Regist. wird ausgelesen
    	if(((RegA_dif = RegA_akt ^ RegA_neu) !=0) && i>=3) // Änderungen gegenüber Vor-Interrupt=1 UND >=30ms
    	{
    		RegA_Auswertung(RegA_dif, RegA_neu);		// Pins einzeld auswerten
    		i=0;
    	}
    	i++;
    	RegA_akt = RegA_neu;						// akt. PINA in Vor-Interrupt speichern, für den nächsten ISR
    }
    
    void RegA_Auswertung (uint8_t RegA_dif, uint8_t RegA_neu)  // Pins einzeld auswerten
    {
    	uint8_t RegA_high;
    	uint8_t RegA_low;
    	uint8_t Zuweisung=0;
    	
    	RegA_high = RegA_dif & RegA_neu;		// Pins von 0 auf 1 = 1
    	RegA_low = RegA_dif & ~RegA_neu;	// Pins von 1 auf 0 = 1
    
    	if(((RegA_high & (1<<PINA4)) != 0) && (PA4frei==1))	Zuweisung=41;		// PA4 wurde high
    	if(((RegA_low & (1<<PINA4)) != 0) && (PA4frei==1))	Zuweisung=40;		// PA4 wurde low		
    	if(((RegA_high & (1<<PINA5)) != 0) && (PA5frei==1))	Zuweisung=51;		// PA5 wurde high
    	if(((RegA_low & (1<<PINA5)) != 0) && (PA5frei==1))	Zuweisung=50;		// PA5 wurde low
    
    	switch(Zuweisung)
    	{
    		case 41:	LEDrt_ein;	Zuweisung=0;	break;	// PA4 high
    		case 40:	LEDrt_aus;	Zuweisung=0;	break;	// PA4 low
    		case 51:	SUM_ein;	Zuweisung=0;	break;	// PA5 high
    		case 50:	SUM_aus;	Zuweisung=0;	break;	// PA5 low
    	}
    }
    Bemerkung:
    - OverflowZaehler ist static und wird mit 1ms, über Timer-Interrupt getaktet/hoch gezählt.
    - PA4frei, PA5frei static-Var., kommen aus dem main und schalten die jeweiligen Pin ein/aus.
    - RegA_akt, RegA_neu, EingIntervall sind static-Var.

    - - - Aktualisiert - - -

    Fehler gefunden!
    "i" muss eine static-Variable sein!
    Klappt jetzt prime - was haltet ihr von der Struktur?
    Geändert von frabe (20.08.2019 um 14:28 Uhr)
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

Ähnliche Themen

  1. [ERLEDIGT] Interrupt Routine
    Von Saturas077 im Forum Assembler-Programmierung
    Antworten: 8
    Letzter Beitrag: 23.04.2014, 12:46
  2. Codebeispiel für Lesen von RC5 Code mit Interrupt-Routine
    Von -tomas- im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 19
    Letzter Beitrag: 25.05.2011, 12:54
  3. Interrupt Routine
    Von luvat im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 4
    Letzter Beitrag: 16.03.2008, 20:54
  4. Interrupt in ISR-Routine freigeben
    Von dj5am im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 10.08.2007, 08:44
  5. uart interrupt routine
    Von Computerkora im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 25.11.2006, 13:45

Berechtigungen

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

12V Akku bauen