- LiFePO4 Speicher Test         
Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte
Ergebnis 41 bis 50 von 59

Thema: Interrupt-Abfrage >>> Routine vereinfachen

  1. #41
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.059
    Anzeige

    Powerstation Test
    Bei solchen Dingen musst du aufpassen. Du kannst einen Kurzschluss erzeugen.

    Wie sieht deine Schaltung aus?

    Der Programmteil ist in Ordnung und sollte so funktioieren. Es kann sein das du es noch irgendwo anders änderst (ungewollt). Was macht "LEDgn_ein();" bzw "LEDgn_aus();" genau (Led ein/ausschalten ist klar, wie sieht aber die Funktion aus).

    Ich würde das aber etwas anders lösen. Du hast einmal das Eingangsbit von PA5 und einmal ein "Merkerbit" mit dem du das einlesen "freigibst". Diese beiden Bits verknüpfst du mit einem "Und".

    MfG Hannes

  2. #42
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    130
    @ceos
    Bei meinem Timer-Interrupt werden innerhalb des ISR die Eingänge PA4, PA5 abgefragt.
    Im main() werden für gewöhnlich die DDR einmalig als Ein- oder Ausgänge konfiguriert.
    Nun möchte ich aber innerhalb der while(1) jeden einzelnen Eingang nach Bedarf "Stumm" schalten, so dass im ISR, if((PINA & (1<<PINA5)) != 0) //1=tu was, ins "leere" läuft.
    Daher meine Idee, den entsprechenden Pin, "mal eben" als Ausgang zu konfigurieren.

    @021aet04
    5V==High==1
    Kurzschluss auf der Ausgangsleitung? Wenn der uC/Out==low==0, uC-intern direkt mit dem Gnd verbunden ist, ist das tatsächlich möglich.
    Geändert von frabe (14.08.2019 um 14:22 Uhr)
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Status: EwigerAnfaenger |

  3. #43
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    wie aus der Doku zitiert, das geht leider nciht, du kannst also nur den
    PCMSK0 umkonfigurieren um deine ISR zu blockieren. Zusätzlich solltest du alelrdings in deinen Abfragen auch den Pin ausmaskieren, sonst löst er trotzdem aus, wenn du beide Taster drückst.

    Du musst also alles maskieren
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #44
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    130
    Zitat Zitat von Ceos Beitrag anzeigen
    PCMSK0 umkonfigurieren um deine ISR zu blockieren.
    PCMSK0 = (1<<PCINT4)|(1<<PCINT5);
    konfiguriere ich nur beim PortChange-Interrupt, nicht aber beim Timer-Interrupt.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Status: EwigerAnfaenger |

  5. #45
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.059
    Das 5V ein High ist, ist normal. Die Frage ist, wie hast du den Taster angeschlossen (gegen 5V oder Masse, Verwendest du einen Widerstand)?

    Normalerweise gibt es kein Problem, solltest du aber versehentlich den Port schalten und du die Taste dürcken, hast du ein Problem (z.B. Ausgang auf high und Taste auf Masse). Es reicht schon wenn du dich verschreibst.

    MfG Hannes

  6. #46
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    130
    Du hast natürlich Recht - in diesem Fall kann nichts passieren - man/ich sollte aber "Narrensicher" entwickeln, könnte ja mal in andere Hände gelangen.
    Mittlerweile halte ich die Lösung mit der Ein/Ausgangs-Umschaltung für praxisfern.

    Vielleicht ist eine andere Variante mit dem "Stummschalten" durch volatile-Variablen sinnvoll.
    Bsp:
    Im main(), sequneziell PA4 und/oder PA5; Variable "PA4freischalt=1;", "PA5freischalt=1;"
    Innerhalb des ISR (Timer) oder dessen Funktionsaufruf; if (PA4freischalt == 1) {} // Eingangsimpuls wird weiter verarbeitet
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Status: EwigerAnfaenger |

  7. #47
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.059
    Das ist die Variante die ich gemeint habe. Ich würde aber eine Bytevariable nehmen und einzelne Bits einem Eingang zuordnen. Bei dir ist es "Resourcenverschwendung" weil du für jeden Eingang eine Bytevariable verwendest.

    Also z.B. eine Hilfsvariable "char hilfsvariable" => Bit 0 = Freigabe PA4, Bit 1 = Freigabe PA5
    Der Code sieht dann so aus
    Code:
    if ((PINA & (1<<PA4)) && (hilfsvariable & (1<<0))){...}
    Das gleiche gilt auch für PA5. Die Schleife wird nur ausgeführt wenn PA4 == 1 und hilfsvariable == 1.

    MfG Hannes

  8. #48
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    130
    Verstehe, das Prinzip ist ok, aber zu viel Speicherplatz verschwendet wenn zB. 10 Eingänge ins Spiel kommen. Hier ist mir (als Anfänger) die transparenz und einfacherere Lesbarkeit wichtig!
    Ich hatte nur bedenken wegen der Übersicht bei mehreren volatile-Variablen. Sehe hier aber keinen Ausweg.

    - - - Aktualisiert - - -

    Ist es eigentlich normal, dass bei Timer-ISR mehrere volatile-Variable eingesetzt werden?
    Folgend schon wieder eine, nur um einen Intervall-Zähler zu erhalten;
    Code:
    volatile uint8_t EingIntervall=0;									
    																			
    ISR(TIM1_COMPA_vect)
    {
    	OverflowZaehler++;
    	EingIntervall++;
    
    	if(OverflowZaehler >= 60000)		// 1ms*60 000 = 1Min
    	{
    		OverflowZaehlerReset();
    	}
    
    	if (EingIntervall==10)			// alle 10[ms] werden die Eingangskontakte abgefragt
    	{
    		RegA_KontaktAbfrage();  // Eingänge auf Veränderung analysiert
    		EingIntervall=0;
    	}
    }
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Status: EwigerAnfaenger |

  9. #49
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.059
    Meiner Meinung nach ist es nicht besser lesbar. Wie man die Hilfsvariable nennt ist egal, mann kann sie z.B. auch "FreigabeEingaenge" oder sonst wie nennen.
    Ob man 1 Variable benötigt, oder 3 wird egal sein. Wenn man aber mehrere hat und so arbeitet bekommt man irgendwann ein Speicherproblem (z.B. wenn man Eingänge eines ganzen Ports steuern will). Deswegen sollte man sorgsam mit den Resourcen umgehen.

    Man kann auch mit #define arbeiten.
    z.B.
    Code:
    #define  PA4_ein  hilfsvariable |= (1<<0)
    #define  PA4_aus hilfsvariable &= ~(1<<0)
    #define  PA4_freigabe  hilfsvariable & (1<<0)
    Wenn du es nutzen willst schreibst du:

    Code:
    PA4_ein; // PA4 freigeben
    PA4_aus; // PA4 sperren
    
    if ((PINA & (1<<PA4)) && PA4_freigabe) {...}  // Abfrage auf PA4 und Freigabe PA4

    Bei der ISR kann man es so machen wie du und mehrere Variablen nehmen, oder du konfigurierst die ISR so das du alle 10ms einen Interrupt bekommst (geht nicht immer).
    Wenn man z.B. alle 10ms einen Int haben will muss man den Timer so anpassen das du, wenn du den Timer von 0-Max laufen lässt, über die 10ms kommst (Prescaler anpassen). Anschließend musst du einen "Startwert" für den Timer ausrechnen. Den musst du in der ISR jedes mal neu übergeben. Also wenn du z.B. bei einem 8bit Timer jede ISR den Wert 250 in das TCNT Register schreibst zählt er von 250 bis 255 und löst dann wieder einen Int aus.

    MfG Hannes

  10. #50
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    130
    Zitat Zitat von 021aet04 Beitrag anzeigen
    Bei der ISR kann man es so machen wie du und mehrere Variablen nehmen, oder du konfigurierst die ISR so das du alle 10ms einen Interrupt bekommst (geht nicht immer).
    Dieser Timer ist als Generaltaktgeber (1ms) für das gesamte Prog konfiguriert.
    Da hängen später auch Zeitstufen/Countdownzähler etc drann.

    Die Idee mit #define finde ich gut!
    Auch die LED-Steuerungen, LEDgn_ein() etc. könnte ich direkt mit #define bestimmen.
    Wo siehst du die Grenze zw. Funktion() und #define ?

    Code:
    #define LEDgn_ein PORTB |= (1<<PB0)
    #define LEDgn_aus PORTB &= ~(1<<PB0)
    
    // statt
    
    void LEDgn_ein(void)	 // LED einschalten
    {
    	PORTB |= (1<<PB0);
    }
    
    void LEDgn_aus(void)	// LED ausschalten
    {
    	PORTB &= ~(1<<PB0);
    }
    Geändert von frabe (15.08.2019 um 14:01 Uhr)
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Status: EwigerAnfaenger |

Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte

Ä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