Raff den 16Bit Timer nicht!!!
-
Hallo alle zusammen,
Ich arbeite mit dem Sisy AVR Board mit mega8. Ich möchte eine Frequenz zwischen 500 und 10000Hz generieren. Dazu benutze ich den Poti. jenachdem in welche richtung gedreht wird soll die frequenz höher oder niedriger werden.Die Frequenz wird dann über einen Port ausgegeben. Hab das bis jetz erstmal mit 8Bit Timer gemacht, geht auch soweit. Will das aber auf 16Bit Timer umstellen weil der geeignetter ist. mein Problem ist ich raff das nicht den zu Programmieren also vom Quellcode her. Die Initialisierung und so. Währe also schön wenn mir mal jemand ein beispiel geben kann und das bissl erklärt. Hab im netz schon gesucht und Probiert und das Datenblatt hab ich auch durchgeackert, aber ich kriegs nich hin!
-
Hi,
in diesem Forum geht es eigentlich nur um Assembler für den PC und nicht für Mikrocontroller. Deswegen ist es hier auch fast aussichtslos eine Frage über Mikrocontroller beantwortet zu bekommen. Wie gesagt: FAST.Also zum Thema. Zuerst mal kapier ich überhaupt nicht, wie du über ein Poti den AVR dazu bewegst eine Frequenz zu generieren. Machst du das über den ADC? Also bei z.B. 1 V am ADC soll die Frequenz dann z.B. 1000Hz sein oder liege ich da falsch?
Und wie generierst du dann die Frequenz? Über den Timer dessen Wert du je nach Spannung am ADC veränderst oder benutzt du PWM?
Mit PWM habe ich selbst auch noch nie etwas gemacht. Musst halt dann, wenn du es brauchst im Datenblatt lesen.Ok, jetzt zu deinem eigentlichen Problem: Du weißt nicht, wie man den Timer initialisiert?
Geht ja eigentlich genau gleich wie beim 8 Bit Timer. Wo ist das Problem?
Ich hab selbst nur nen Atmega16 hier. Da die AVRs alle ziemlich gleich sind, müsste dein Timer auch gleich wie beim Atmega16 zu initialisieren gehen. Du sagst du hast ein „Sisy AVR Board“. Das sagt mir leider gar nichts. Ich habe das Atmel AVR STK500.
Mit welcher Software arbeitest du?Also hier mal ein Codeschnipsel von mir, wie man den 16-Bit Timer initialisiert. Der läuft im ClearTimerOnComparMatch (CTC) Modus. Er fängt bi 0 an und zählt bis auf den Wert der in OCR1A steht. Wenn er diesen erreicht hat löst der Interrupt aus. Wichtig ist, dass du ihn in der ISR neu lädst. Der Prescaler ist in diesem Fall auf 1. Steht aber alles im Datenblatt. Aber wie gesagt, ich weiß nicht genau, ob das auf dem Atmega8 auch läuft. Auf dem Atmega16 läufts auf jeden Fall.
.org 0x000 rjmp reset .org 0x00C rjmp timerint reset: ldi r16,LOW(RAMEND) ;Stackpointer initialisieren out SPL,r16 ldi r16,HIGH(RAMEND) out SPH,r16 ;""""""""""""""""""""""""""" ser r16 out ddrB,r16 ;PortB als Ausgang cli ;Interrupts sperren ldi temp1, 0b00000000 ;1. Kontrollregister... nichst wichtiges out TCCR1A, temp1 ldi temp1, 0b00001001 ;2. Kontrollregister... letzte 3 Bits für die ; Timergeschwindigkeit clkIO/1(001) und CTC out TCCR1B, temp1 ldi temp1, 0b00010000 ;InterruptMask Output Compare Interrupt enabled out TIMSK, temp1 ldi r16,0x01 out OCR1AL, r16 ;Wert 0xE7 in OCR1AL laden ldi r16,0x27 out OCR1AH, r16 ;Wert 0x03 in OCR1AH laden sei ;Interrupts zulassen
Gruß Red!
-
Genau das hab ich gesucht, Herzlichen dank. hab mittlerweile auch bissl mehr durchblick und hab fast das gleiche wie du. Ich glaub da hab ich einfach aufn schlauch gestanden obwohl die Lösung so Simpel ist! Danke Nochma. Das SiSy AVR Board ist so eine Experimentier Board. Frequenzgenerieren mach ich so wie du gesagt mit Timer und ADC.