-         

Ergebnis 1 bis 9 von 9

Thema: Problem mit Interrupt

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473

    Problem mit Interrupt

    Anzeige

    Hallo da,
    ich versuche mich gerade am Interrupt mittels Comparematch im CTC Mode.
    Das läuft aber nicht so ganz. Ich weiß vorallem nicht, was mir diese Fehlermeldung sagen will.
    Vielleicht kann mir jemand sagen, was ich falsch mache.
    Danke
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken reset_148.jpg  

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Ich seh da auf Anhieb keine Fehlerquelle.

    Hast Du das Programm schon mal im Simulator getestet ?
    Was passiert wenn der Counter 2 den Zählerstand 255 erreicht ?
    Was passiert wenn du das Comparematch Interrupt Flag des Timers 2 manuell im Simulator auf 1 setzt ?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    Hallo nochmal,
    hab noch etwas rumexperimentiert und die fehlermeldungen sind weg.
    Vorallem die meldung mit dem "odd" ist weg.
    Nur tun, tut sich nix.
    Kann da jemand helfen?
    Code:
    .include	"AVR.H"
    ;------------------------------------------------------------------------
    ;Reset and Interrupt vector             ;VNr.  Beschreibung
    
    ;Start, Power ON, Reset
    
    
    
    ;-----------------------------------------------------------------------
    
    
    .org 3
    
    	rjmp	interrupt
    
    	rjmp	reset
    reset:	ldi	r16,hi8(RAMEND)
    	out	SPL,r16
    	ldi	r16,lo8(RAMEND)
    	out	SPH,r16
    	ldi	r16,0b11111111
    	out	DDRB,r16
    	
    	ldi	r16,255	;compare value
    	out	OCR2,r16
    	ldi	r16,0b00100010	;CTC - PRS 8
    	out	TCCR2,r16
    	ldi	r16,0b10000000	;Interrupt enable
    	out	TIMSK,r16
    	sei		;global int. enable
    	ldi	r17,0b00000000
    	ldi	r18,0b11111111
    	;Hier Init-Code eintragen.
    ;------------------------------------------------------------------------
    
    mainloop:	wdr
    
    
    	rjmp	mainloop
    
    interrupt:
    ;toggle Port B
    	in	r16,PINC
    	ori	r16,255
    	breq	interrupt1
    	out	PORTB,r18
    interrupt1:
    	out	PORTB,r17
    interrupt2:
    	reti

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    10.02.2005
    Ort
    eastside, L.E.
    Alter
    46
    Beiträge
    104
    Hi,

    zwei Sachen fallen mir da auf:

    1. Du springst mit Deinem ersten Befehl sofort in die Interruptroutine, und beim Reti weiß der Prozessor nicht, wohin er zurückspringen soll. Die Reihenfolge wie im ersten Post ist da schon richtig.

    2. bei der Definition des Stackpointers hast Du SPL und SPH vertauscht. Das war auch schon mal richtiger im ersten Beispiel

    Ergo, ich weiß auch nicht, warum Dein erstes Beispiel nicht geht ^^

    greetz Rajko

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Probier mal den CODE für AVR Studio 4.
    Dein Code schaltet zwar Portb kurz ein aber dann sofort wieder aus!
    Der Interrupt wird also durchlaufen, nur Du merkst ausser einem sehr kurzen Impuls an PORTB nichts davon. Dein Interrupt wird bei einer Quarzfrequenz von 4MHz alle 512 µsec aufgerufen, was einer Frequenz von ca. 1000 Hz entspricht.
    Ich hab auch noch die verwendeten Register auf dem Stack gesichert.
    PORTB,3 has Du anscheinend mit einer Sonderfunktion belegt, der ist bei mir dauerhaft 0 im simulator!
    Code:
    .include    "m8def.inc"
    
    
    ;------------------------------------------------------------------------
    ;Reset and Interrupt vector             ;VNr.  Beschreibung
    
    ;Start, Power ON, Reset
    
    
    
    ;-----------------------------------------------------------------------
    .cseg
    .org 0
    
    	rjmp   reset
    
    .cseg
    .org 3
    
       rjmp   interrupt
    
       
    reset:   ldi   r16,low(RAMEND)
       out   SPL,r16
       ldi   r16,high(RAMEND)
       out   SPH,r16
       ldi   r16,0b11111111
       out   DDRB,r16
       
       ldi   r16,255   ;compare value
       out   OCR2,r16
       ldi   r16,0b00100010   ;CTC - PRS 8
       out   TCCR2,r16
       ldi   r16,0b10000000   ;Interrupt enable
       out   TIMSK,r16
       sei      ;global int. enable
       ldi   r17,0b00000000
       ldi   r18,0b11111111
       ;Hier Init-Code eintragen.
    ;------------------------------------------------------------------------
    
    mainloop:   wdr
    
    
       rjmp   mainloop
    
    interrupt:
    ;toggle Port B
    	PUSH r16
    	IN R16,SREG
    	PUSH r16
       	PUSH r18
       	LDI r18,0xFF
    	In   r16,PORTB
       	EOR   r16,r18
       	out   PORTB,r16
    	POP r18
    	POP r16
    	OUT SREG,r16
    	POP r16
       reti

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    NICHT SCHON WIEDER EIN USERPROBLEM!!!!!!!!!!!

    Also ich hab´s jetzt und der Fehler lag in meiner Bedienung vom AVR Studio.
    Man muss den Code eben erst "build"-en bevor man ihn brennt

    Und danke, an alle, die was geschriben haben.

    The Man

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Manchmal kann ich es wirklich nicht verstehn -

    Da arbeitet man mit AVR Studio und nutzt den Simulator nicht, lieber ärgert man sich tagelang mit irgendwelchen lapidar Problemen rum, anstatt das fehlerhafte Stück Code mal im Simulator zu testen.

    Hättest Du auf meinen 1sten Post hin deinen Code getestet, hättest Du ihn auf jeden Fall "builden" müssen und das Problem wäre gegessen.

    Aber manche brauchen halt "Die harte Tour"

    Sicher - der Simulator ist nicht perfekt.
    Falsch eingestellte Fuse Bits können nicht erkannt werden.
    Die Simulation von Datenaustausch über Peripherieschnittstellen (SPI, seriell, TWI) ist schwierig bis unmöglich.

    Nichts destotrotz ist der Simulator ein mächtiges Werkzeug um einen Quellcode zu debuggen, aber sehr viele Leute nutzen das einfach nicht, wie hier einige Posts beweisen !

    Ich progge jetzt seit ein paar Monaten in C (Codevision AVR) und nutze auch hier den Simulator vom Studio zum debuggen der Software.
    Das klappt vorzüglich und ich krieg sehr oft eine sofort laufende Software in den Controller.

    Sicher ist ein JTAG Hardware Debugger noch besser, aber mein schmales Hobby Budget gestattet so eine Anschaffung halt nicht.
    Ausserdem ist die Anzahl der ATMEL- Controller mit JTAG Interface sehr Übersichtlich.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    Ist ja nicht so, dass ich den Simulator nicht genutzt hätte.
    Ich hab mich nur eben gewundert, dass es da lief und auf dem AVR nicht.

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Das wundert mich aber.
    Wenn man "built" macht wird doch das .hex File neu generiert.
    Oder hast Du dann immer wieder eine alte umbenannte Variante in den Chip eingespielt?
    Das läuft dann unter der Rubrik "blöd gelaufen" und ich entschuldige mich hiermit für meine Äußerungen.

Berechtigungen

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