- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 3 von 3

Thema: [gelöst]Problem mit Interrupt Attiny13

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.11.2005
    Beiträge
    17

    [gelöst]Problem mit Interrupt Attiny13

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo liebe Assembler-Gemeinde,

    ich habe da ein Problem mit dem INT0 des Attiny13. Wenn ich folgendes Programm im Simulator durchlaufen lasse:

    Code:
    .include "tn13def.inc"
    
    .def temp = r16
    
    ;Reset- und Interruptvektoren
    ;
    .CSEG 	;Assembliere in den Programm-Flash-Speicher
    .org $0000	;beginne mit Adresse 0
    ;
    ;Sprungvektoren fuer Reset und Interrupt
    ;
    	
    	rjmp main		;Reset vector
    	rjmp intpc0 			;int0 interrupt vector
    	reti; intpcint	;PCINT0 vector
    	reti 			;TC0 overflow vector
    	reti 			;Eeprom ready vector
    	reti 			;Anaog comperator int vector
    	reti			;TC0 CompA vector
    	reti 			;TC0 CompB vector
    	reti 			;WDT vector
    	reti 			;ADC conversion complete vector
    	
    ;Programmbeginn
    ;internen Prozessortakt durch 32 teilen
    ;Takt = 9,6MHz / 32 = 300kHz
    
          ldi temp,(1<<CLKPCE)
          out CLKPR,temp
          ldi temp, (1<<CLKPS2)|(1<<CLKPS0)
          out CLKPR,temp
    
    main:
    ;
    ; Stapelzeiger setzen fuer Rueckkehr-Adressen vom Interrupt
    ;
    	ldi temp,LOW(RAMEND)	;Stapelzeiger am Ende vom SRAM
    	out SPL,temp
    
          ldi temp,(1<<PB1)
          out DDRB,temp
          ldi temp,(0<<PB1)|(1<<PB4)
          out PORTB,temp          ;LED ausschalten und internen Pull UP von PB4 ein
    
    	ldi temp, 0b00000010  ; INT0 konfigurieren
        out MCUCR, temp
     
        ldi temp, 0b01000000  ; INT0  aktivieren
        out GIMSK, temp
     
             sei           
    	
    loop:   nop rjmp loop             ; eine leere Endlosschleife
    
    intpc0:
    		 
             
    		 sbis PORTB, 1
    		 rjmp intpc1
    		 cbi PORTB,1
    		 reti
     
    intpc1:
             sbi PORTB, 1
             
    		 reti
    und ich einen Interrupt auslöse läuft das Prog ohne Probleme durch und setzt mir die Bits von Portb4. Löse ich dann noch einmal einen Interrupt aus läuft die Interrupt-Anweisung wieder durch und die Bits von Portb4 werden auch wieder gelöscht. Nur wenn jetzt die Interrupt-Anweisung wieder verlassen wird wird sofort wieder zum Interrupt-Handler gesprungen und wieder ein Interrupt ausgelöst, so dass die Bits wieder gesetzt werden. Kann mir das einer erklären?


    Mfg André

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Ich hab jetzt zwar mal nur kurz das Datenblatt des Tiny 13 überflogen, ich würd aber sagen, das stimmt so.
    Du löst nämlich durch das Umschalten des Port B,1 im Interrupt bereits wieder einen neuen Interrupt aus (=Software Interrupt).
    der dann natürlich beim Beenden der Interruptroutine sofort wieder aufgerufen wird.
    Ich würd Dir empfehlen einen anderen Port für die Umschaltung zu benutzen.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    07.11.2005
    Beiträge
    17
    Hallo,
    also der Hinweis mit dem Software-Interrupt hatte mich dazu gebracht noch mal etwas kritisch meinen Code zu betrachten und siehe da, der konnte so nicht funktionieren und das Datenblatt hätte ich mir auch mal richtig ansehen können/sollen. Der Fehler war, dass ja der Int0 Eingang an PB1 ist und da kann dann natürlich auch kein Ausgang mehr sein. War also doppelt belegt und hat somit den zweiten Interrupt ausgelöst. Code abgeändert und siehe da es funktioniert.
    Danke wkrug!

    Mfg André

Berechtigungen

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

Labornetzteil AliExpress