mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupts werden nicht alle ausgelöst


Autor: Carsten Ulrich (garsten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hab mit einem kleinen Projekt auf einem AT90S8515 angefangen. Das 
Programm soll mehrere Drehgeber auswerten und die aktuelle Position über 
den UART an den PC weiterreichen. Dazu arbeite ich mit 3 
Interrupt-gesteuerten Routinen.
Die erste auf Timer0 Überlauf wertet die Drehgeber aus.
Die zweite auf Timer 1 Compare Match A soll die Daten regelmäßig in 
einen Puffer schreiben
Die dritte soll bei UART Data Register Empty ausgelöst werden um das 
nächste Byte aus dem Puffer zu senden.
Das ganze funktioniert auch wenn ich es im AVR-Studio im Simulator 
laufen lasse.
Wenn ich es aber auf den Controller lade, dann wird nur die 
Interruptroutine für Timer 1 aufgerufen.
Ich habe das Programm auf das Grundgerüst reduziert und im Controller 
getestet. Immer noch das gleiche Problem.

Ich bedanke mich jetzt schon mal bei allen die mir weiterhelfen möchten.
:-)

MfG.
Carsten
.include "8515def.inc"
 
.def temp1 = r16
.def temp2 = r17

.equ F_CPU = 1843200
.equ BAUD = 9600
.equ TIMER1FREQ = 10

.equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1)
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
 
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif

; Timer1MatchInterrupt Für 10 Hz mit clock/8 und match bei 23040
.equ TIMER1MATCH = F_CPU / 8 / TIMER1FREQ

; Reset Handler
.org 0x000
    rjmp main
; Timer0Interrupt
.org OVF0addr
    rjmp timer0_handler
.org OC1Aaddr
    rjmp timer1match_handler
.org UDREaddr
    rjmp udre_handler

.org $00d
;***********************************************************************
; Hauptprogramm
main:
        ldi temp1, LOW(RAMEND)
        out SPL, temp1
        ldi temp1, HIGH(RAMEND)
        out SPH, temp1
  
    ;Timer 0 mit CK/8 
    ;ldi  temp1, 0b00000010 ; 
    ldi temp1, 1 << CS01
    out TCCR0, temp1
    
      ; Timer 1 Konfigurieren    
    ; CK/8 setzen
    ldi temp1, 1 << CS01
    ; Clear on Compare Match
    sbr temp1, 1 << CTC1
    out TCCR1B, temp1
    ; Compare Match A seten
    ldi temp1, Low(TIMER1MATCH)
    out OCR1AL, temp1
    ldi temp1, High(TIMER1MATCH)
    out OCR1AH, temp1

    ; TIMSK setzen damit Timer aktiv sind
    ; Timer 0 overflow aktivieren
    ldi temp1, 1 << TOIE0    
    ; Timer 1 compare match a aktivieren
    sbr temp1, 1 << OCIE1A
    out TIMSK, temp1
        
    ;UART Konfigurieren
    ; Baudrate einstellen 
    ldi     temp1, UBRR_VAL
    out     UBRR, temp1
    ; TX aktivieren
    sbi     UCR, TXEN

    ; Zum test ob Interrupt ausgelöst wird
    sbi UCR, UDRIE
    ldi temp1, 'X'
    out UDR, temp1
    
    ; Interrupts allgemein aktivieren 
    sei                   

    ; In einer Schleife prüfen, ob neue Werte übertragen werden müssen
  main_loop:   
    rjmp main_loop



;***********************************************************************
; Handler für Timer0
timer0_handler:
    ;verwendete Register sichern
    sbi PORTB, 0
    reti

;***********************************************************************
; Handler für Timer1Match
timer1Match_handler:
    ;Wert von Drehgeber als Hexzahl in Puffer schreiben
    sbi PORTB, 1
    sbi UCR, UDRIE
    reti

;***********************************************************************
; Handler für UART Data Register Empty
udre_handler:
    sbi PORTB, 2
    cbi UCR, UDRIE
    reti

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.