PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche Code für externen Interrupt tiny13 (bzw. mega16)



oberallgeier
20.12.2007, 17:51
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:

/* ================================================== ============================ */
; 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.

linux_80
20.12.2007, 18:06
Hallo,

könnte sein, das die LED nicht geht, weil die Ports alle auf Ausgang gestellt werden, und dann ein INT0 nicht erkannt werden kann :-k

oberallgeier
20.12.2007, 18:32
Na ja, das Handbuch schreibt ja:

Observe that, if enabled, the interrupts will trigger even if the INT0 or PCINT5..0 pins are configured as outputs.

Also sollte es nix ausmachen. Denke ich.

Besserwessi
20.12.2007, 18:48
Wenn die Ausgänge als Ausgang geschaltet sind braucht man schon recht viel Strom (ca. 50-100 mA) um die Ausgangsspannung zu ändern, was nicht unbedingt im Sinne des Erfinders ist. Es macht also schon einen Unterschied ob man den Pin auf Ausgang stellt.

linux_80
20.12.2007, 18:56
@oberallgeier
das ist schon richtig,
aber wenn Du auf das Signal das aussen anliegt reagieren willst, wirst Du auf Eingang stellen müssen, ansonsten kannst Du mal probieren, PB1 auf 1 zu stellen, von innen ;-)

oberallgeier
20.12.2007, 19:39
Hallo linux_80 - ich muss mich entschuldigen. Ein kurzer Test (unterbrochen von einem längeren Telefonat - auswärts, Tochter) und schon LEUCHTEN (LED und meine Augen). Nur leider in der C-Routine sind die Eingänge für´s INT0 und INT1 als EINGÄNGE deklariert, und es läuft trotzdem nicht :(.

Aber immerhin - die aktuelle Frage - Assemblercode - hast Du mir nun gelöst. Danke. Nach NÄCHTEN ein Fortschritt.

oberallgeier
20.12.2007, 23:41
Wenn die Ausgänge als Ausgang geschaltet sind braucht man schon recht viel Strom (ca. 50-100 mA) um die Ausgangsspannung zu ändern ...Nachdem meine C-Lösung auf der RNControl mit dem mega16 mittlerweile läuft (Hubert.G hatte meine vergessene Initialisierung bemerkt), habe ich das mal nachgemessen. Nicht dass ich Dir nicht glauben würde, aber der Unterschied hat mich interessiert.

Bei MEINEM Mega16 auf MEINER RNcontrol messe ich bei Initialisierung des Pins INT0 als Ausgang einen Strom von 72 mA ! bei 5V und bei der Initialisierung als Eingang 0,48 mA. Der Pulldown-Strom ohne +Signal durch einen 10k Widerstand war mit meiner Ausrüstung nicht messbar, irgendwo (keine Ahnung wie tief) unter 8 µA.