-
        

Ergebnis 1 bis 5 von 5

Thema: Ich wieder: 16bit Timer1 will nich (Mega128)

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Beiträge
    1.607

    Ich wieder: 16bit Timer1 will nich (Mega128)

    Anzeige

    Servus

    Ich wieder Folgende Aufgabe gilt es zu lösen (ist gelöst, ich such nur den Fehler ): Die LEDs solen Binär zählen und zwar per 10bit geteiltem 16bit Timer1, Zeit einstellbar (0...255 entsprechen dann 2,22 bis 5,xms). Geschrieben haben wir folgenden Code

    Code:
    	.nolist							; include-file nicht in Listing
    	.include	"m128def.inc"		; Definitionen für ATmega 128 einbinden
    
    
    	.list							; Listing erstellen
    
    
    	.def	akku		= r16		; r16 als Rechenregister "akku" definieren
    	.def	msTimer		= r23		; r23 als Zeit-Einstellungsregister
    			; r24 als Zählregister
    	.def	templ		= r17		; Zwischenspeicher 1
    	.def	temp2		= r18		; Zwischenspeicher 2
    	.def	PulsCounter	= r19
    	.equ	key_pin		= PINA		; Tasterpins
    	.equ	key_port	= PORTA		; Datenregister (Taster)
    	.equ	key_ddr		= DDRA		; Datenrichtungsregister (Taster)
    
    	.equ	led_port	= PORTB		; Datenregister (LED)
    	.equ	led_pin		= PINB
    	.equ	led_ddr		= DDRB		; Datenrichtungsregister (LED)
    
    
    	.cseg
    
    ;-------Adress Tabelle für Interrupt-Vektoren-----------------------------
    
    	.org		0x0000				; Interrupt-Vektor für RESET
    	rjmp		Init
    	
    	.org		0x0002				; Interrupt-Vektor für externen Interrupt 1
    	rjmp		Extint1
    
    	.org		0x0018				; Interrupt-Vektor für Timer/Counter-0-Interrupt
    	rjmp		TC1int
    
    	.org		0x0045				; Ende der Interrupt-Vektor-Tabelle
    
    ;-------Macros-------------------------------------------------------------
    ; Pin Toggeln
    .macro TogPin
    	SBIS		@0,@1				; Wenn Bit (@1) in I/O-Reg. (@2) gesetzt, überspringe nächsten Befehl
    	rjmp		SetPin
    ClrPin:
    	cbi			@0,@1
    	rjmp		TogPinx
    SetPin:
    	SBI			@0,@1
    TogPinx:
    .endmacro
    ;--------------------------------------------------------------------------
    	
    Init:							; Beginn des Hauptprogrammes
    
    	ldi			r16,LOW(RAMEND)		; Stack Initialisieren
    	out			SPL,r16
    	ldi			r16,HIGH(RAMEND)
    	out			SPH,r16
    
    	ser			akku				; Alle Bits in Akku setzen
    	out			DDRB,akku			; PORTB als Ausgang (alle Bits 1)
    
    	ldi			msTimer,0x99
    	out			OCR1AL,msTimer
    
    	ldi			templ,0
    	out			OCR1AH,templ	
    
    	ldi			templ,0x0
    	out			TCNT1L,templ
    
    	ldi			templ,0x0
    	out			TCNT1H,templ
    
    	ldi			akku,0b00011000
    	out			TIMSK,akku
    
    	ldi			akku,0b00000100
    	out			TCCR1B,akku			; Übertrage auf Timer Counter Control Register
    
    	
    	ldi			PulsCounter,255
    
    
    	
    
    Prog:
    	
    	in			templ,TIFR
    	SBRC		templ,4
    	rcall		Count
    	rjmp		Prog
    
    
    ;-------Unterprogramme----------------------------------------------------
    Extint1:							; ISR für externen Interrupt 1
    
    	reti
    
    Count:
    	TogPin		led_port,0
    
    	ret
    
    TC1int:								; ISR für Timer/Counter 1 Interrupt	
    	
    	reti
    .exit
    Der tuts aber nicht! Wenn ich den Makro Aufruf statt in Count in TC1int schreibe funktioniert alles Tadellos, die LED wird umgeschaltet.. .Ich gehe damit davon aus das der Timer sowie die einstellung von OCR funktionieren.

    Wenn ich den eigentlichen Zähl Code
    Code:
    	dec PulsCounter
    	out led_port,PulsCounter
    irgendwohin, also entweder in Count, die Programmschleife selbst (das Dekrementieren dann hinter den SBRC Befehl) oder in den Interrupt selbst packe funktioniert es auch nicht.
    Die LED sind Low Aktiv.

    Die überprüfung des Bits im TIFR Register hat der ING genauso in der Musterlösung, bei ihm soll es funktionieren (ebenfalls Mega12.

    Weder der LaborING noch mein Laborpartner noch ich wissen was wirklih los ist ...


    Findet jemand den Fehler?


    Grüße

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    10.02.2005
    Ort
    eastside, L.E.
    Alter
    46
    Beiträge
    104
    Ohne mich genauer mit Deinem Programm zu befassen denke ich, das das Problem darin besteht, das Du die ISR im TIMSK freigegeben hast, darum springt er die ISR ja auch an. Dabei wird aber (hardwareseitig) das Interuptflag zurückgesetzt.

    Wenn Du es per polling auswerten willst mußt Du es über eine Hilfsvariable in der ISR lösen bzw die ISR ganz deaktivieren. Dann mußt Du aber daran denken, das Interupt-Flag per Software zurücksetzen.

    Rajko

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Beiträge
    1.607
    Die Globalen Interrupts sind aber Deaktiviert, ergo sollte er da nicht reinspringen. Abgesehen davon läuft ein anderes Programm in der die Globalen Interrupts Aktiviert sind ebenfalls über Polling... Das komplette entfernen der Sprungadresse + Unterprogramm half übrigens auch nicht.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    10.02.2005
    Ort
    eastside, L.E.
    Alter
    46
    Beiträge
    104
    Zitat Zitat von bax
    Dann musst Du aber daran denken, das Interupt-Flag per Software zurücksetzen.

    Rajko

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Beiträge
    1.607
    Warum tuts das aber beim 8bit Timer von alleine trotz aktiviertem sei und angegebener Routine und beim 16bit Timer nicht?

Berechtigungen

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