Interrupts beim ATmega16

Gast #52104
Lesenswert?
• ▲
▼
Hi Leuts,

ich habe hier ein paar Zeilen Code für den ATmega 16.
Nur leider wird anscheinend absolut kein Interrupt ausgeloest.
Weiss einer woran das liegen könnte ?

Ach ja, Fuses: BOOTRST = 1, BOOTSZ = 00


.include "m16def.inc"

.def temp1    = r22

; Interrupttabelle
jmp Init    ; Reset
reti      ; External Interrupt Request 0
reti      ; External Interrupt Request 1
reti      ; Timer/Counter2 Compare Match
reti      ; Timer/Counter2 Overflow
reti      ; Timer/Counter1 Capture Event
reti      ; Timer/Counter1 Compare Match A
reti      ; Timer/Counter1 Compare Match B
reti      ; Timer/Counter1 Overflow
rjmp Timer0    ; Timer/Counter0 Overflow
reti      ; Serial Transfer Complete
reti      ; USART, Rx Complete
reti      ; USART Data Register Empty
reti      ; USART, Tx Complete
reti      ; ADC Conversion Complete
reti      ; EEPROM Ready
reti      ; Analog Comparator
reti      ; Two-wire Serial Interface
reti      ; External Interrupt Request 2
rjmp Timer0    ; Timer/Counter0 Compare Match
reti      ; Store Program Memory Ready

Init:

  ; Stack initialisieren
  ldi temp1, high (RAMEND)
  out SPH, temp1
  ldi temp1, low (RAMEND)
  out SPL, temp1


  ; Port A ist Ausgang
  ldi temp1, 0xFF
  out DDRA, temp1
  ldi temp1, 0xFF
  out PORTA, temp1

  ; Comparewert fuer Timer0 laden
  ldi temp1, 36
  out OCR0, temp1

  ; Timer 0 Compare  und Overflow aktivieren
  ldi temp1, 0b00000011
  out TIMSK, temp1

  ; Vorteiler Timer 0 = 1024
  ldi temp1, 0b00000101
  out TCCR0, temp1

  ; Interrupts freigeben
  sei

  rjmp Main


Main:

  rjmp Main


Timer0:

  ; Zaehler zuruecksetzen
  ldi temp1, 0
  out TCNT0, temp1

  ldi temp1, 0x00
  out PORTA, temp1

  reti
Gast #52105
Lesenswert?
• ▲
▼
Hallo Karlheinz,

Deine Interrupt-Tabelle ist falsch. Setze mal die passenden
ORG-Anweisungen vor die Sprünge, also z.B.

.ORG OVF0addr
rjmp Timer0    ; Timer/Counter0 Overflow

Gruß, Frank
Gast #52106
Lesenswert?
• ▲
▼
Hi,

ich hab zwar schon lange nicht mehr in Assembler programmiert aber
müsste nicht vor der Interrupttabelle die Speicherstelle angegeben
werden?

z.B.

.org 0002  //wenn BOOTSTR = 1

;Interruptabelle
....

Schau mal im List-File ob die IRQ Adressen stimmen. Ansonsten im
Debugger prüfen ob alle Bits für die IRQ Behandlung korrekt gesetzt
sind bzw. werden.

Gruss

Stefan
Gast #52107
Lesenswert?
• ▲
▼
Hm,
scheint als hättest Du rechtm, Frank. Bloss kapier ich es nicht, den
Aufbau der Tabelle habe ich dem Atmel Datenblatt entnommen und
abgetippt :-)
Aber nicht dran gedacht, dass beim ATmega16 die Adresse anscheinend 2
Bytes belegt, beim 8515 nur 1 Byte ...


Anyway, danke für die schnelle Hilfe


Greetings
Karlheint
Gast #52108
Lesenswert?
• ▲
▼
>> Aber nicht dran gedacht, dass beim ATmega16 die Adresse anscheinend
2
Bytes belegt, beim 8515 nur 1 Byte ...

So ist es. Habe ich anfangs auch übersehen und gestaunt, warum selbst
simpelste Programme auf einmal nicht mehr funktionierten. ;-)

Anyway, danke für die schnelle Hilfe

Gerne.

Gruß, Frank

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren