-         

Ergebnis 1 bis 5 von 5

Thema: atmega32 - Timer1 - Capture Interrupt

  1. #1

    atmega32 - Timer1 - Capture Interrupt

    Anzeige

    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]

  2. #2
    Ist denn keiner mit irgendwelchen Tips da?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    24.03.2005
    Beiträge
    21
    INT0 hat höchste Priorität, desshalb würde ich die Tastatur auf einen Interrupt hängen, der niedrigere Prio hat!

  4. #4
    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.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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:
    Code:
    .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

Berechtigungen

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