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

Thema: C-Code für Windmesser

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.08.2012
    Beiträge
    8
    Okay, dann werde ich mich da die Tage mal "ranwagen" und software-technisch entprellen... werde da aber erst Mitte nächster Woche zu kommen, da ich ein paar Tage im Center Parc bin... also nicht wundern, dass bis dahin nichts von mir kommt.

    Sobald ich das Entprellen software-technisch realisiert habe, werde ich den Code hier mal hochladen und eure Meinung abwarten...

    Schönes We,

    Daniel

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    27.08.2012
    Beiträge
    8
    Moin zusammen,

    ich habe mir nun ein paar Gedanken gemacht und mich ein wenig eingelesen: Das Software-Entrprellen (scheint) ja am sinnvollsten zu sein, wenn man es über Timer realisiert, um unnötige Warteschleifen zu verhindern und das Programm kurze Zeit zu "blocken".
    Jedoch habe ich bereits 2 Timer in Verwendung: Sprich, wenn ich nun so programmieren würde, dass der Reed-Kontakt einen externen Interrupt auslöst, würde meine Int-Routine ausgeführt.
    Angenommen, ich würde dann eine Variable hochzählen. Meinetwegen bis 5 Zeiteinheiten. Wenn diese 5 Zeiteinheiten erreicht sind, soll nochmal geschaut werden, ob das Signal (in meinem Fall) immer noch "high" ist. Wenn das der Fall ist, soll die Geschwindigkeit errechnet werden.
    ABER: Um diese Zeiteinheiten hochzuzählen, würde die Software aus der Int-Routine rausgehen, um zum Beispiel die Timer0-Overflow-Routine aufrufen, um die Variable hochzuzählen. Wenn dies erledigt ist, springt er wieder in die Int-Routine vom Reed-Kontakt zurück. Oder wird dieser Zähler hardwaremäßig hochgezählt, ohne dass die Int-Routine dafür verlassen werden muss?

    ISR(INT0_vect){
    volatile unsigned long int us = 0;
    volatile unsigned long int millisekunde = 0;

    //Entprellzeit
    _delay_ms(10);

    //Interrupt an INT0 -> PD2
    //alter Wert 32
    us = (volatile unsigned long int) TCNT1 * 32;
    TCNT1 = 0;

    millisekunde = us / 1000;

    // v = s/t
    // Durchmesser Schale Mitte = 92mm
    //Umfang = 92mm * pi = 2890mm
    //laut Datenblatt Windweg = 0,4m
    //Wert 1445

    wind = 2890 / millisekunde; //*10 für Kommastelle
    GIFR |= (1 << INTF0);
    }
    Eine einfache Wartezeit von nun beispielsweise 10ms wäre doch auch eine Entprellung? 10ms sind aber sehr wahrscheinlich zu hoch gegriffen...

    Ich habe gerad irgendwie einen "Knoten im Kopf"...
    Hoffentlich ist das nun auch rübergekommen, wo gerad mein Problem ist.

    Gruß
    Geändert von daniel031287 (03.04.2014 um 16:28 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die ISR von der Flanke muss man schon zu ende kommen lassen, denn sonst geht es auch mit dem Hauptprogramm nicht weiter. Was man machen kann, ist etwa in der ISR vom Int0 erst einmal Int0 zu deaktivieren und dann beim Timer das Compare register so zu programmieren, dass nach etwa 5 ms ein Timer interrupts kommt, denn man dann auch Einschalter. Die ISR für den Start ist dann schon fertig. In der Timer ISR deaktiviert man dann den Timer Interrupt wieder und erlaubt dafür wieder den Int0. Die Flanke auf die er reagiert muss man dabei ggf. je nach Zustand des Eingangs noch anpassen. Das Ende der Messung macht dann wieder die ISR zu Int0. Dabei kann dann ggf. auch gleich die Nächste Messung gestartet werden.

    Ein Problem bekommt man ggf. noch bei sehr niedriger Geschwindigkeit: da kann der eine Pulse schon länger als 5 ms sein, und man hat es schwer das Ende des Pulses (mit ggf. Prellen als Störung) vom Anfang des nächsten Pulse zu unterscheiden.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Hallo,

    Man kann eine ISR aufsetzen, welche z.B. alle 1ms den Eingang abfrägt.

    Der aktuelle Wert wird dann in ein Schieberegister eingeschoben.

    Wenn man 8 Bit verwendet (8ms) und das Schieberegister den Wert 0xFF hat, stand am Eingang für mindestens 8ms eine 1 an.

    Bei 0xFF wird dann der Impuls ausgewertet und ein Flag gesetzt. Ist das Flag schon gesetzt wird nicht ausgewertet.
    Das Flag setzt man bei != 0xFF zurück.


    Bei Tasten habe ich meistens einfach nur alle 20ms den Eingang abgefragt und dann nur den aktuellen mit dem vorigen Zustand verglichen.
    Wenn man die Tasten dann noch in ein Bit-Array packt, kann man alle Tasten gleichzeitig entprellen.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    27.08.2012
    Beiträge
    8
    Sooo, ich habe nun mal eine Funktion key_scan programmiert. Diese wertet jede Millisekunde die Taste aus und zählt dabei eine Variable count um einen hoch. Wenn die Variable bei 8 ist, also für 8ms die Taste bzw. der Reedkontakt "1" war, wird request = 1 und in der ISR dann die Bedingung für die Auswertung wahr.

    Kann sich das einer von euch bitte mal anschauen, ob das so überhaupt logisch erscheint? Ich verwende nun 3 Timer und 4 Interrupts... es stellt sich da auch gerade für mich die Frage, welche Variablen da als volatile deklariert werden sollten.
    Ich hoffe, dass ich da keinen mit auf die Nerven gehe, aber da mir die Programmier-Routine fehlt, kommt da die ein oder andere vllt. "dumme" Frage auf...

    PS: Eigentlich kann ich den Tastenport doch gar nicht so abfragen, da mein Reedkontakt auch mal bei keinem Wind so stehen bleiben kann, dass permament High-Signal anliegt und damit die Bedingung wahr wird, obwohl eigentlich gar kein Wind anliegt...?

    Vielen Dank und Gruß
    Daniel
    Angehängte Dateien Angehängte Dateien
    Geändert von daniel031287 (04.04.2014 um 18:43 Uhr)

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    27.08.2012
    Beiträge
    8
    Hallo zusammen,

    ich habe das Problem lösen können... ich habe einfach den externen Interrupt deaktiviert, sobald er einmal aufgerufen worden ist. Nach 3ms anschließend wieder aktiviert...

    Frohe Ostern,

    Gruß
    Daniel

Ähnliche Themen

  1. Code+Schaltpläne für einige I²C/SPI ADCs, DACs, LED-Treiber, ... für AVR, ARM, AVR32
    Von kruemeltee im Forum Eigene fertige Schaltungen und Bauanleitungen
    Antworten: 0
    Letzter Beitrag: 22.08.2011, 19:34
  2. Code-Schloss mit Tastatur, LCD und Logger. Code-Beispiel
    Von Stray_Cat im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 2
    Letzter Beitrag: 05.06.2009, 10:31
  3. Mal wieder die Windmesser ;-)
    Von Björn im Forum Elektronik
    Antworten: 102
    Letzter Beitrag: 31.12.2005, 13:40
  4. Code für Interrupt?
    Von Felixx87 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 22.09.2005, 16:41
  5. Suche C-Code für Matrixtastaturabfrage für PIC µC
    Von the_Ghost666 im Forum Software, Algorithmen und KI
    Antworten: 0
    Letzter Beitrag: 25.02.2005, 18:25

Berechtigungen

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

Solar Speicher und Akkus Tests