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

Thema: Interrupt TIMER

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153

    Interrupt TIMER

    Hallo leute!

    Ich ahbe eine frage zu den uC ATMEGA8535!
    Wie kann ich eine interruptroutine ablaufen lassen, wenn beim Timer die TOV0 (Überlauf) gesetzt ist?
    Habs mal so probiert:
    .include "m8535def.inc"

    .org 0x000
    rjmp Zeit

    .org $008
    rjmp Start

    Zeit:
    ldi R16, 0b00000001
    out TCCR0, R16
    rjmp Zeit



    Start:
    rjmp Start

    bitte um rückantowrt!

    MFG
    Michi

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Code:
    .include "m8535def.inc"
    
    .org 0x0000   ;mit vier Nullen, ist nen 16bit-Wert
    rjmp Zeit
    
    .org OVF0addr    ;Name für Int-vektor aus der .inc, die 8 war falsch, müsste 9 sein!
    rjmp Start
    
    Zeit:
    
    ;stack einrichten:   (sonst geht gar nichts!)
    ldi mpr, HIGH(RAMEND);
      out SPH, mpr
    ldi mpr, LOW(RAMEND);
      out SPL, mpr
    
    ldi R16, 0b00000001
    out TCCR0, R16
    <<hier müsste noch der Overflow-Interrupt aktiviert werden!>>
    
    rjmp Zeit
    
    
    
    Start:
    <<was im Int passieren soll>>
    reti      ;zurück zum Hauptprogramm

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    also dass heißt den Stackpointer immer vorher initialisieren bevor man ein programm schreibt? und noch was, Ramend Was hat dass zu bedeuten??

    MFG
    Michi

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Der Stack wird benutzt, um die Rücksprungadresse der Interruptroutine abzulegen.
    RAMEND ist ein konstante aus der .inc, die die letze Adresse im SRAM enthält. dort wird der stackpointer plaziert, und der stack wächsts dann zum vorderen ende des SRAMs.

    PS: http://www.avr-asm-tutorial.net/ nicht gründlich genug gelesen?

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    Und wie aktiviere ich den overflow interrupt in TIFR??

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    rtfds!
    In TIMSK... siehe Datenblatt!

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    Kann dass so funktionieren?

    .include "m8535def.inc"

    .org 0x0000
    rjmp Zeit

    .org OVF1addr
    rjmp Start

    ;Stackpointer einrichten
    Zeit:
    ldi R18, HIGH(RAMEND);
    out SPH, R18
    ldi R18, LOW(RAMEND);
    out SPL, R18

    ;Timer einrichten
    ldi R16, 0b00000001
    out TCCR0, R16

    ;Overflow Flag aktivieren
    clr R16
    ldi R16, 0b00000001
    out TIMSK, R16

    ;Hauptprogramm
    Start1:
    rjmp Start1

    ;Unterprogramm
    Start:
    rjmp Start

    mfg Michi

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    ok hab was vergessen! interrupt alle aktivieren mit dem Befehl sei!!

    MFG
    Michi

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    ah noch was muss man egentlich wenn man den Stack einrichten will immer dass schreiben??
    ;Stackpointer initialisieren
    ldi R16, High(Ramend)
    out SPH, R16
    ldi R16, Low(Ramend)
    out SPL, R16

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Zitat Zitat von Exodus
    ok hab was vergessen! interrupt alle aktivieren mit dem Befehl sei!!
    Dafür gibts hier im Forum die Edit-Funktion....

    Sieht schon mal fast richtig aus... nur diese Stelle nicht:
    ;Unterprogramm
    Start:
    rjmp Start

    dort machst du im Unterprogramm eine Endosschleife. Du müsstest stattdessen mit reti wieder zurück zum Hauptprogramm springen, wenn die Interruptroutine vorbei ist.

    [quote]ah noch was muss man egentlich wenn man den Stack einrichten will immer dass schreiben??
    man kann auch ein anderes Register nehmen, aber ansonsten ja. Du musst den stackpointer, der auf SPH und SPL aufgeteilt ist, auf die letzte Adresse im SRAM setzen. (gut, ne andere Adresse geht auch, aber dann hat der Stack wenigerr Platz. Nur sinnvoll, wenn du was dahinter alegen willst.)

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress