Forum: Mikrocontroller und Digitale Elektronik Interrupts beim ATmega16


von Karlheinz Druschel (Gast)


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

von Frank Linde (Gast)


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

von Stefan (Gast)


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

von Karlheinz Druschel (Gast)


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

von Frank Linde (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.