- Labornetzteil AliExpress         
Ergebnis 1 bis 6 von 6

Thema: Interrupt benötigt zu viel Zeit

  1. #1
    fRIeD
    Gast

    Interrupt benötigt zu viel Zeit

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    mit folgendem Code wollte ich einmal die Interrupts ausprobieren,

    an PortB hängen 8 Leds zur Ausgabe, die werden anfangs alle angeschaltet und bei Tastendruck soll dann das hohe Nibble ausgeschaltet werden.

    Das ganze wird über den INT0 am PortD2 gemacht.

    Das ganze funktioniert auch eigentlich,

    allerdings brauchen die Leds nach dem Tastendruck ca. eine Sekunde bis sie aus sind.

    Verstehe nicht warum da soviel Zeit verstreicht? Im Simulator vom AVR Studio sehe ich nicht wo so eine Verzögerung herkommen könnte.

    Liegt es eventuell an einer fehlenden Tastenentprellung? Obwohl ich in dem Beispiel dafür keinen Sinn sehen würde.

    Vielen Dank für die Hilfe.

    Hier der Code:

    Code:
    	
    rjmp	main	;1   POWER ON RESET
    	rjmp 	meinint	;2   Int0-Interrupt
    	reti		;3   Int1-Interrupt
    	reti		;4   TC2 Compare Match
    	reti		;5   TC2 Overflow
    	reti		;6   TC1 Capture
    	reti		;7   TC1 Compare Match A
    	reti		;8   TC1 Compare Match B
    	reti		;9   TC1 Overflow
    	reti		;10  TC0 Overflow
    	reti		;11  SPI, STC Serial Transfer Complete
    	reti		;12  UART Rx Complete
    	reti		;13  UART Data Register Empty
    	reti		;14  UART Tx Complete
    	reti		;15  ADC Conversion Complete
    	reti		;16  EEPROM Ready
    	reti		;17  Analog Comparator
    	reti		;18  TWI (I²C) Serial Interface
    	reti		;19  Store Program Memory Ready
    ;------------------------------------------------------------------------
    ;Start, Power ON, Reset
    main:	
    		
    		;Stack init:
    		ldi	r16,LOW(RAMEND) 
    		out	SPL,r16
    		ldi	r16,HIGH(RAMEND)
    		out	SPH,r16
    		
    		;Programm init:
    		ldi r16,0xff	; Port B as output
    		out DDRB, r16
    
    		ldi r16, (1<<ISC00) | (1<<ISC01)	; set interrupt bits
    		out MCUCR, r16
    
    		ldi r16, (1<<INT0) 			; enable INT0
    		out GICR, r16
    
    		sei					; enable interrupt		
    
    		ldi r17,0xff 				; init output register
    		
    ;------------------------------------------------------------------------
    mainloop:	wdr
    		out PORTB,r17
    		rcall wait	
    		
    		rjmp	mainloop
    
    meinint:    push r16
    		in r16, SREG
    		push r16
    		
    		ldi r17, 0x0f
    	
    		;in r16, GIFR
    		;cbr r16, INTF0
    		;out GIFR, r16 
    	
    		pop r16
    		out SREG,r16
    		pop r16
    		reti
    
    
    wait:	push r15		
    		push r16
    
    		clr r15
    		clr r16
    
    skip:		dec r15
    		brne skip
    		dec r16
    		brne skip
    
    		pop r16
    		pop r15
    
    		ret

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo,
    wie lange dauert die wait Routine ?
    ich würd mal sagen, es liegt daran, Dein
    out PORTB,R17
    kommt ja immer zwischen zwei rcall wait

    oder sehe ich das falsch ?

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    fRIeD
    Gast
    hm, daran kann es eignetlich nicht liegen, hab das nämlich auch schon ohne wait ausprobiert, da hatte ich das gleiche Problem. Und die wait Routine braucht auch nur etwas unter 20 ms bei 4 MHz.

  4. #4
    Gast
    und warum änderst Du den Port nicht direkt in der ISR ?

  5. #5
    Cheeco2
    Gast
    Ich könnte mir eine mögliche Antwort vorstellen!
    Dein Code sollte korrekt sein; er läuft ja auch im Studio.
    Bei einem Mega8 oder größer (und du verwendest einen größeren AVR, weil du einen großen Stack hast) ist standardmäßig der integrierte Schwinger aktiviert, der auf 1MHz läuft. Auch wenn du einen externen Quarz dransteckst, muss der erst noch in den Fusebits aktiviert werden. Ich hoffe das könnte dein Problem gewesen sein!

    Stefan

  6. #6
    fRIeD
    Gast
    Erstmal danke für die Antworten, die Fuses sind richtig gesetzt.

    Nachdem ich den Port nochmal explizit auf Eingang gesetzt und die PullUps aktiviert habe gings dann.

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

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

12V Akku bauen