Guten Abend, alle
nach zwei, fast drei Tagen (eher Nächten) bringe ich den externen Interrupt nicht ingang.
Aktuelle Aufgabe: im tiny13 wird der INT0 (PB1, pin 6) mit 10k auf GND gezogen. Durch einen Tastenkontakt wird auf den Pin kurz Vcc geschaltet. Damit soll der Interrupt zu beliebiger Zeit (beliebig oft) ausgelöst werden -rising edge.
MCU tiny13
9,6 MHz interner Takt
Experimentierplatine (Lernpaket Franzis)
auszugsweise:
Code:
/* ============================================================================== */
; Deklarationen für den Praeprozessor und Konstanten (s.auch oben Speicherbelegung)
#include "tn13def.inc"
#define a r16 ;Kurzbezeichung für Allzweckregister r16
#define ac r17 ;Kurzbezeichung für ISR-Allzweckregister r17
;===================================================================================
/* Interrupthandler-Tabelle (aus ATTiny13_doc2535.pdf, Seite 42)
Address Code Labels ; Comments */
.org 0x0000 rjmp RESET ;Reset Handler, power-on, brown-out, watchdog
.org 0x0001 rjmp xt_int0 ; EXT_INTO IRQO Handler
.org 0x0002 reti ; PCINTO PCINTO Handler
.org 0x0003 reti ; TIMO_OVF ;Timer0 Overflow Handler
.org 0x0004 reti ; EE_RDY ;EEPROM Ready Handler
.org 0x0005 reti ; PITAL_COMP ;Analog Comparator Handler
.org 0x0006 reti ; TIMO_COMPA ;Timer0 CompareA Handler
.org 0x0007 reti ; TIMO_COMPE ;Timer0 CompareE Handler
.org 0x0008 reti ; WATCHDOG ;Watchdog Interrupt Handler
.org 0x0009 reti ; ADC ;ADC Conversion Handler */
;===================================================================================
; Hauptprogramm
;===================================================================================
;
RESET: ;=== Generelle Initialisierung
; Zuerst RAMEND und Stack definieren;
ldi a,RAMEND ;Ram Ende des tiny13
out SPL,a ;Stack Pointer tiny13 setzen
anfang: ;=== Nur ein Dummy-Hauptprogramm
rcall init_mc ;Initialisiere den Mikrocontroller
rcall ini_xti0 ;Initialisiere die ISR für external Interrupt
sei ; .. und Interrupts allgemein zulassen
a2:
rcall tiw ;Tu irgend etwas
rjmp a2
;
;===================================================================================
; Prozeduren
;===================================================================================
;
tiw: ;=== tuirgendwas ... ein bisschen code muss ja abgearbeitet werden
;Reaktion: Setze ein Byte im Statusbit stbpci. Das wird im
;Hauptprogramm ausgewertet mit entsprechenden LED´s
push a
in a,SREG
push a
push ac ;AUCH das ISR-Allzweckbyte - auf alle Fälle
tiw_pop:
pop ac
pop a
out SREG,a
pop a
ret ;=====----->>>>>
;
;===================================================================================
; Initialisierungen für µC und ISR
;===================================================================================
;
init_mc: ;=== Initialisiere Mikrocontroller
;ALLE Register initialisieren hier := pull-ups einschalten
ldi a,0b00111111 ;
out ddrb,a ;Datenrichtung "Ausgabe" für alle ports
ldi a,0b00000000
out portb,a ; und alle ports ausschalten = low = sink
ret ;=====----->>>>>
;
ini_xti0: ;=== Initialisiere external Interrupt
;
;(1<<ISC01 | 1<<ISC00)
ldi a,0b00000011 ;Init. extern. Interrupt0 auf rising edge
out MCUCR,a ; d.h. MCUCR ISC00,01 auf 1 (doc2535,S 55)
ldi a,0b01000000 ;(1<<INT0)
out GIMSK,a ; und erlaube diese I´s in GIMSK
ret ;=====----->>>>>
;
;===================================================================================
; Interrupt-Service-Routine #######>>>>>
;===================================================================================
;
xt_int0: ;=== Markiere Arbeit dieser ISR
push a
in a,SREG
push a
ldi a,0b00001000 ;Bit3 (PB3) einschalten
out portb,a
int0_pop:
pop a
out SREG,a
pop a
reti ;=====----->>>>>
;
;===================================================================================
; Ende des Quellcodes
;===================================================================================
Die LED geht nie an . . .
Ursprüngliches Ziel war es, am mega16 in C zwei Drehzahlsignale von Gabellichtschranken zu erfassen mit den externen Interrupts 0 und 1. Meine Versuche dabei sind fehlgeschlagen, daher habe ich das am tiny13 in einfachster Art "nachempfunden" - und das geht auch nicht
Kann bitte jemand hier weiterhelfen?
Ist mein Programm falsch? Ich fürchte, ich habe das doc2535 (noch immer) nicht verstanden.
Danke im Voraus.
Lesezeichen