PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : atmega32 - Timer1 - Capture Interrupt



Jeluca
24.02.2006, 21:55
Hallo alle zusammen, nachdem ich mich jetzt ausgiebig mit der Asembler Sprache auseinander gesetzt habe, und auch schon recht weit gekommen bin habe ich nun nach einer Woche Testen .... neu schreiben....Testen...neuschreiben,,, überlegen.. Zettel nehmen ...Ablauf schriftlich am Papier verfassen, doch einen richtigen blackpoint.

Ich habe einen Atmega32 den ich in Assembler programmiere.
Damit möchte ich mittels Capture-Eingang die Impulslänge von 5 (fünf) hintereinanderfolgenden Impulslängen messen.
High-Low(kurz)-High-Low(kurz)-High-Low - High-Low - High-Low
1 2 3 4 5
Danach ca eine halbe sekunde Pause und wieder Messen.

Ich habe schon probiert:

1. Jeden rising-Pegel über INT-capture (ISR) Zeit entnehmen- subtrahieren-SRam speichern.
Dabei komme ich aber in konflikt mit meiner Tastatur (I2C-aufwecken über INT0)

2. Timer starten - Risinge Edge - ISR
start:
sbis
rjmp
sbic
rjmp
Zeit lesen
speichern
brne start (bei 5. ten Impuls - End)
Prinzipiel funktioniert es, doch muß ich dies auch syncronisieren, das heißt er muß warten bis die Beiden kurzen Impulse folgen und dann nacheinender werte speichern (zwecks Berechnung)
wie soll ich das bewerkstelligen?
Da wärend der ISR steigende Flanken ankommen muß ich dazu den Interrupt und den Rising edge ausschalten?
(Ab und zu stimmen die Zeiten ab und zu erhalte ich tlw zu kleine Werte).
Ein TOV1 kommt nicht vor, das habe ich über eine erkennbare routine ausgelesen (Led ein bischen einschalten)
Bitte ich um hilfe.
Keinen fertigen asm-code aber Gedankenhilfe würde mich sehr freuen.

Nils[/b]

Jeluca
26.02.2006, 20:55
Ist denn keiner mit irgendwelchen Tips da?

fambi_mail
27.02.2006, 15:39
INT0 hat höchste Priorität, desshalb würde ich die Tastatur auf einen Interrupt hängen, der niedrigere Prio hat!

Jeluca
27.02.2006, 19:48
Danke für Deine Antwort.
Wo kann ich die Prioritäten der Interrupts denn nachlesen?
Im Datenblatt habe ich noch nichts darüber gelesen, allerdings habe ich auch immer nur die Abschnitte gesucht die ich gerade wissen wollte. Ich werde morgen gleich danach suchen.

Ich habe aber heute aus testzwecken den INT0 deaktiviert. (Außschließungsverfahren)
Aber er zählt noch immer falsch!

Sollte ich besser die Fünf Impulse direkt hinereinander messen
steigende Flanke(INT)...Impuls messen(minus Startzeit).....SRAM speichern wenn kurzer Impuls.....Timer auf Null setzten(TCNT1H:TCNT1L)..... sbic....sbis..eventuell rücksprung wenn erster IMpuls nicht klein.....zweiter IMpuls messen....SRam...dritter IMpuls......bis fünfter IMpuls und dann .....RETI
oder lieber
steigende Flanke abwarten (INT)....Impuls messen (minus Startzeit)....SRam speichern......reti / 5 mal und dann die Zeiten auswerten (nach denkleinsten suchen und dann rechnen.

izaseba
27.02.2006, 20:00
Die Prioritäten sind ganz einfach, schau mal in *def.inc ganz unten nach,
ganz oben geschriebene haben höchste Priorität.
Auszug aus m8def.inf:

.equ INT0addr=$001 ; External Interrupt0 Vector Address

.equ INT1addr=$002 ; External Interrupt1 Vector Address

.equ OC2addr =$003 ; Output Compare2 Interrupt Vector Address

.equ OVF2addr=$004 ; Overflow2 Interrupt Vector Address

.equ ICP1addr=$005 ; Input Capture1 Interrupt Vector Address

.equ OC1Aaddr=$006 ; Output Compare1A Interrupt Vector Address

.equ OC1Baddr=$007 ; Output Compare1B Interrupt Vector Address

.equ OVF1addr=$008 ; Overflow1 Interrupt Vector Address

.equ OVF0addr=$009 ; Overflow0 Interrupt Vector Address

.equ SPIaddr =$00a ; SPI Interrupt Vector Address

.equ URXCaddr=$00b ; USART Receive Complete Interrupt Vector Address

.equ UDREaddr=$00c ; USART Data Register Empty Interrupt Vector Address

.equ UTXCaddr=$00d ; USART Transmit Complete Interrupt Vector Address

.equ ADCCaddr=$00e ; ADC Interrupt Vector Address

.equ ERDYaddr=$00f ; EEPROM Interrupt Vector Address

.equ ACIaddr =$010 ; Analog Comparator Interrupt Vector Address

.equ TWIaddr =$011 ; Irq. vector address for Two-Wire Interface

.equ SPMaddr =$012 ; SPM complete Interrupt Vector Address

.equ SPMRaddr =$012 ; SPM complete Interrupt Vector Address


Gruß Sebastian