-         

Ergebnis 1 bis 7 von 7

Thema: Suche Code für externen Interrupt tiny13 (bzw. mega16)

  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554

    Suche Code für externen Interrupt tiny13 (bzw. mega16)

    Anzeige

    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.
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    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

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    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.
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    @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

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    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.
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Zitat Zitat von Besserwessi
    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.
    Ciao sagt der JoeamBerg

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •