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.


Anmelden zum Antworten