- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Interrupt + Timer

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330

    Interrupt + Timer

    Grüß euch,


    Habe wiedermal eine Frage:


    Ich versuche den Timer eines Chips zu benutzen, dazu brauche ich interrupt...


    Kann mir jemand helfen, wie ich zum Beispiel in folgende einfache Funktion ein Interrupt einbaue?

    Code:
    main ()
    {
    while (true)
    {
    waitMs(500)
    }
    }
    Was ich hier http://www.mikrocontroller.net/artic...mit_Interrupts
    so mitbekommen habe,

    brauche ich erstmal

    #include <avr/interrupt.h>

    und dann

    sei;


    danach nur mehr

    ISR(Vectorname)? Und den Vectornamen bekomme ich aus dem Datasheet?

    Der muss je nach Interrupttp gewählt werden, hab ich verstanden(?)

    (Also wenn ein Eingang high wird, heißt er xyz; wenn der Timer schreit heißt er xxxy, .... ... )

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Je nach Version (3.xx vs. 4.xxx) von GCC unterscheidet sich die Syntax etwas. Für details siehe z.B. hier :
    http://www.rn-wissen.de/index.php/Avr-gcc#Interrupts

    Die Namen für die Interruptsvektoren liest man besser in den Include Files nach. Als z.B. in iom32.h oder ähnliches. Da sollte das selbe stehen wie im Datenblatt - wirklich ausschlaggebend ist aber das io....h file.

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Die ISR gehört nicht ins main.
    Den Vectorname holst du dir am Besten aus deinem WinAVR Verzeichnis, dort sollte es ein avr-libc-user-manual geben.
    Unter Library Reference und dann interrupts findest du die Vectorname.
    Wenn du das AVR-Studio hast, dann unter Help.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Die ISR gehört nicht ins main.
    Woher weiß sie dann, was sie unterbrechen soll?

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Woher weisst du wo der Program-Counter steht, wenn der Interrupt aufgerufen wird?
    Die ISR ist eine Funktion die nicht in der main-Schleife aufgerufen wird, sonder durch den Interrupthandler.
    Was möchtest du genau machen?
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von runner02
    Die ISR gehört nicht ins main.
    Woher weiß sie dann, was sie unterbrechen soll?
    Sieht so aus, als ob du das Konzept des Interrupts noch nicht so ganz verstanden hast. Ein Interrupt unterbricht nicht irgendeine spezielle Funktion, er unterbricht den Programmablauf im Allgemeinen, egal welche Funktion gerade ausgeführt wird.
    MfG
    Stefan

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Das heißt, ich rufe den Interrupt auf wie eine Funktion?

    Oder definiere ich die Interruptbedingungen vorher, und dann unterbricht er einfach alles, was er macht?



    Wenn sich jemand die Mühe machen könnte, und mein simples Programm in Post 1 mit einem Interrupt ausstatten könnte wäre ich sehr dankbar Ich denke, am besten lernt es sich noch, wenn man einen einfachen Quellcode mit Kommentaren dabei hat

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Code:
    ISR(TIMER0_OVF_vect){
    Zahl++;
    }
    
    main ()
    {
    while (1)
    {
    if(Zahl>=100){
     Mach was
    }
    }
    }
    Jedes mal wenn der Timer0 überläuft, wird die ISR aufgerufen, Zahl wird um eins erhöht.
    In der main wird die Zahl bei jedem Durchlauf abgefragt, wenn sie >= 100 ist, dann wird das gemacht was du da hinschreibst.
    Es fehlen hier natürlich alle #include, definitionen usw.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Danke, das verstehe ich schon mal. Nicht definiert ist hier aber der Timer, wenn meine Logik stimmt??

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Der Timer ist nicht initialisiert, die Variablen nicht definiert, das ist nur ein Ausschnitt aus einem Programm.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad