ATMega 48, Pinchange Interrupt, ASM

OP #8101112
Lesenswert?
• ▲
▼

Hallo,

ich habe mal wieder ein Problem bei dem ich nicht weiterkomme. Ich versuche bei einem ATMega48 den Pinchange Interrupt mit einer ganz einfachen Schaltung zu testen. Am Pin PC5 hängt eine LED, die durch einen Interrupt an PB2 geschaltet werden soll.

1
.cseg                    
2
.org 0  
3
    rjmp  start                
4
.org PCI0addr
5
    rjmp  PCI0_handler      ; Interrupt Handler
6

7
;**********************************************************************************
8
PCI0_handler:
9
  clr    count
10
loop:
11
  sbi    PORTC, 5    ;Portbit setzen
12
  rcall  wait
13
  cbi    PORTC, 5    ;Portbit löschen
14
  rcall  wait
15
  inc    count
16
  cpi    count, 5
17
  breq  exit
18
rjmp  loop          ;Programmschleife neu beginnen
19

20
exit:
21
reti            ;rückkehr zur normalsituation
22

23
;***********************************************************************************
24
start:
25
  ldi    temp, low(ramend)
26
  out    spl, temp    
27
  ldi    temp, high(ramend)
28
  out    sph, temp      
29
  
30
;PortB; B2 = Interruptpin; PortC; C5 = LED
31
  ldi    temp, 0x00    ;PortB auf Eingang
32
  out    DDRB, temp    ;setzen
33
  ldi    temp, 0xFF    ;PortC auf Ausgang
34
  out    DDRC, temp    ;setzen
35

36
  ldi    temp, 1<<PCIE0    ;Pin Change Interrupt Enable 0
37
  sts    PCICR, temp
38
  ldi    temp, 1<<PCINT2    ;Pin Change Mask Register 0
39
  sts    PCMSK0, temp    ;PCINT2 wird gesetzt
40
        
41
  sei
42

43
warten:
44
rjmp  warten

Ohne Interrupt funktioniert alles wie erwartet. Füge ich die Interruptroutinen ein, passiert nach dem Einschalten erst nichts (es gibt ja noch keinen Interrupt) aber nach wenigen Sekunden fängt die LED an ununterbrochen zu blinken, ohne daß ein Interrupt ausgelöst wurde.

#8101185
Lesenswert?
• ▲
▼

Bruno M. schrieb:

Eigentlich ist er offen, da der Interrupt Spannung hat.

...mit "Interrupt" ist im allgemeinen die/eine Unterbrechung gemeint - die kann sowieso keine "Spannung" haben...und wenn schon Spannung, dann bitte mal anschauen welche Spannungen im gültigen Toleranzbereich der Pegel "high" und "low" liegen da es ja gerade bei dieser Sache um definierte Zustände und den Wechsel zwischen diesen geht.

https://de.wikipedia.org/wiki/Logikpegel

https://www.google.com/search?q=avr+logikpegel+definition

https://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen

Wenn du mit Interrupt in dem Zusammenhang den Pin change Interrupt meintest - woher sollte der zugehörige Pin ohne Beschaltung eine "Spannung" und damit einen definierten festen Zustand/Pegel bekommen, wenn die internen Pullups aus sind?

Bitte auch mit bedenken, in den meisten Fällen ist es völlig "übertrieben gar falsch" einen Interrupt zu nutzen. Das macht man nur wenn es um absolut zeitkritische Reaktionen im kleinsten Zeitbruchteil geht - da man sich damit eventuelle Störungen direkt in den Prozessor holt... Also erstmal aufführen worum es überhaupt geht - in den meisten Fällen reicht es den Pin im ms Bereich zu pollen und ggf. sogar mit einer Entprellung auf ein Ereignis zu triggern...

: Bearbeitet durch User

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