Timer 90S8535

Gast #256945
Lesenswert?

dann solltest du den CTC-Mode (top=OCR1A) wählen. Vorteiler passend zu
deiner Quarzfrequenz wählen, so dass der OCR1A-Wert möglichst hoch wird
(allerdings max 65535).
Bei z.B. 4MHz Taktfrequenz (0,25µs) ohne Vorteiler, 15ms
Zyklus=15.000/0,25=60.000).
OCR1A=60.000 //15ms
OCR1B=59.200 //14,8ms

Dazu die entsprechenden Interruptprogramme:
OCR1A: output_port=0;
OCR1B: output_port=1;

Das wars dann schon.

PS: 15ms sind nicht gerade Ultraschall:-)
#256947
Lesenswert?

TCCR1B???

OCR1B...

Wenn du mit OCR1B(H/L) die Gesamtperiode (im CTC-Mode) einstellst, dann
kannst du mit OCR1A die Impulspause oder die Impulsbreite einstellen.

Da der CTC-Mode von OCR1B den Zählumfang des Timers begrenzt, bestimmt
OCR1B die Periodendauer. Dabei wird der OCR1B-Interrupt ausgelöst.
Wenn du nun mit OCR1A einen Wert einstellst, der kleiner ist als der
Wert in OCR1B, dann wird bei Erreichen dieses Wertes der
OCR1A-Interrupt ausgelöst.

Nun kommt es darauf an, ob du mit OCR1A die Impulspause oder die
Impulsdauer angibst. Gibst du die Impulsdauer an, dann must du im
OCR1A-Interrupt den Port ausschalten und im OCR1B-Interrupt
einschalten.

Die Namen der Interrupts stimmen jetzt nicht mit den von ATMEL
vergebenen Namen überein, ich hatte keine Lust, deswegen das Datenblatt
zu wälzen.

...
Gast #256951
Lesenswert?

das wird glaube ich als deci eingelesen und wird nicht als fehler
ausgeworfen.
schreibe eine zahl: wert=0b00000011 und printe die mal aus, dann wirst
du sehen, das keine 3 rauskommt.
mfg pebisoft
#256953
Lesenswert?

Da ich jetzt keine Lust hatte, mich durch den Wust von
Timer1-Spezialfunktionen (PWM) im Datenblatt durchzuwuseln, habe ich
für das folgende Beispiel eine Version gewählt, bei der auf den
CTC-Mode verzichtet wird und die Impulsdauer und Impulspause durch
Aufaddieren von Intervallen auf die OCR1xx-Register erzeugt wird. Der
Timer1 läuft dabei frei durch. Es werden nur die OCRxx-Register
verändert.
Dies (das Setzen der nächsten Interrupt-Zeit-Referenzen) geschieht in
der ISR für die Periodendauer.

Das Beispiel ist in AVR-Assembler und mit AVR-Studio simuliert worden:


;Beispiel für Impulserzeugung nach einem Hilferuf von "mirli"
;http://www.mikrocontroller.net/forum/read-1-255079.html#255090


.include"m8535def.inc"

.equ clock=1000000  ;1MHz Taktfrequenz

.equ iport=portb    ;Impulsausgabe-Port
.equ ipin=pb0       ;Impulsausgabe-Pin
.equ periode=15000  ;Periodendauer in Timer-Takten
.equ impuls=200     ;Impulsdauer in Timer-Takten

.equ ipause=periode-impuls  ;Dauer Impulspause

.def srsk=r2        ;Siko SREG

.def wl=r24         ;working low
.def wh=r25         ;working high


.cseg
.org 0          ;Reset- und Interrupt-Vektoren AT-Mega 8535
 rjmp RESET         ; Reset Handler
 reti; rjmp EXT_INT0    ; IRQ0 Handler
 reti; rjmp EXT_INT1    ; IRQ1 Handler
 reti; rjmp TIM2_COMP   ; Timer2 Compare Handler
 reti; rjmp TIM2_OVF    ; Timer2 Overflow Handler
 reti; rjmp TIM1_CAPT   ; Timer1 Capture Handler
 rjmp TIM1_COMPA    ; Timer1 Compare A Handler
 rjmp TIM1_COMPB    ; Timer1 Compare B Handler
 reti; rjmp TIM1_OVF    ; Timer1 Overflow Handler
 reti; rjmp TIM0_OVF    ; Timer0 Overflow Handler
 reti; rjmp SPI_STC     ; SPI Transfer Complete Handler
 reti; rjmp USART_RXC   ; USART RX Complete Handler
 reti; rjmp USART_UDRE  ; UDR Empty Handler
 reti; rjmp USART_TXC   ; USART TX Complete Handler
 reti; rjmp ADC         ; ADC Conversion Complete Handler
 reti; rjmp EE_RDY      ; EEPROM Ready Handler
 reti; rjmp ANA_COMP    ; Analog Comparator Handler
 reti; rjmp TWSI        ; Two-wire Serial Interface Handler
 reti; rjmp EXT_INT2    ; IRQ2 Handler
 reti; rjmp TIM0_COMP   ; Timer0 Compare Handler
 reti; rjmp SPM_RDY     ; Store Program Memory Ready Handler
;
reset:              ;Initialisierungen
 ldi wl,low(ramend)     ;Stackpointer
 out spl,wl
 ldi wl,high(ramend)
 out sph,wl             ;einrichten

 sbi iport-1,ipin       ;Datenrichtung Ausgabe
 sbi iport,ipin         ;ersten Impuls aktivieren

 ldi wl,0               ;alle Bits auf 0
 out tccr1a,wl          ;in tccr1a (DB S. 108)
 ldi wl,1               ;Vorteiler 1  alle Features aus
 out tccr1b,wl          ;für Timer1

 ldi wl,low(impuls)     ;Impulsdauer
 ldi wh,high(impuls)    ;
 out ocr1ah,wh          ;
 out ocr1al,wl          ;setzen

 ldi wl,low(periode)    ;Periodendauer
 ldi wh,high(periode)   ;
 out ocr1bh,wh          ;
 out ocr1bl,wl          ;setzen

 ldi wl,1<<se           ;Sleep im Mode IDLE
 out mcucr,wl           ;anmelden

 ldi wl,(1<<ocie1a)|(1<<ocie1b) ;beide Compare-Interrupts
 out timsk,wl           ;für Timer1 aktivieren und evtl.
 out tifr,wl            ;bereits gesetzte Int-Flags löschen

 sei                    ;Interrupts freigeben


mainloop:           ;Hauptschleife
 sleep                  ;schlafen
 rjmp mainloop          ;weiter schlafen

TIM1_COMPA:         ;ISR für Impulsdauer
 cbi iport,ipin         ;Impuls beenden
 reti                   ;fertig

TIM1_COMPB:         ;ISR für Periodendauer
 sbi iport,ipin         ;Impuls einschalten
 in srsk,sreg           ;SREG sichern
 in wl,ocr1bl           ;Zeitstempel dieses Interrupts
 in wh,ocr1bh           ;einlesen
 subi wl,(low(-impuls)) ;Impulsdauer
 sbci wh,(high(-impuls));addieren
 out ocr1ah,wh          ;und als Referenz für
 out ocr1al,wl          ;Impulsdauer-Int ausgeben
 subi wl,(low(-ipause)) ;Impulspausendauer
 sbci wh,(high(-ipause));addieren
 out ocr1bh,wh          ;und als Referenz für nächsten
 out ocr1bl,wl          ;Periodendauer-Int ausgeben
 out sreg,srsk          ;SREG wiederherstellen
 reti                   ;fertig

Ich hoffe, es veranschaulicht die Funktionsweise der Impulserzeugung.

...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren