Anfänger hat Timerproblem bei Atmega8

Gast #597199
Lesenswert?

Hy Leute!!!
Ich beschäftige mich erst seit kurzem mit der µc Programmierung - also 
lacht nicht auf die folgenden Fragen :)

Ich habe einen Atmega8 mit 16Mhz Quarztakt und programmiere prinzipiell 
mit CodeVision(C). Ich brauch einen Timer der 1µs geanu ist dh das ich 
bilibig lang einen Pin auf High bzw Low schalten kann.

Dies ist mal der Code der von CodeVision erzeugt wurde(Timer0):
1
 #include <mega8.h>
2
    #include <delay.h>
3

4
     interrupt [TIM0_OVF] void timer0_ovf_isr(void)
5
     {
6
         // Reinitialize Timer 0 value
7
         TCNT0=0xF4;
8
         // Place your code here
9
     }
10

11
     void main(void)
12
     {  // Timer/Counter 0 initialization
13
        // Clock source: System Clock
14
        // Clock value: Timer 0 Stopped
15
        TCCR0=0x00;
16
        TCNT0=0xF4;
17

18
        // External Interrupt(s) initialization
19
        // INT0: Off
20
        // INT1: Off
21
        MCUCR=0x00;
22

23
        // Timer(s)/Counter(s) Interrupt(s) initialization
24
        TIMSK=0x01;
25

26
        For(;;)
27
        {  #asm("sei")
28
       
29
        }
30

31
     }

Ich habe bei TCNTO=0xF4=240 eingestellt, da es mit 16Mhz nur mehr 16 
Zählschritte bis zu 255 sind.

Stimmt einmal TCNT0??? Und wie kann ich den Timer steuern bzw starten 
und wieder stoppen????

WIe ihr seht bin ich nicht gerade ein AVR Spezialist, darum hoffe ich so 
mehr auf eure Hilfe :)
#597203
Lesenswert?

So was macht man bei den AVRs mit dem CTC-Modus*. Dann ist es nicht 
erforderlich, das Timerregister TCNT0 nachzuladen. Allerdings ist ein 
Interrupt, der alle 16 Taktzyklen auftritt, absolut tödlich für das 
System, da allein der Overhead eines Interrupt-Handlers mehr als 16 
Takte in Anspruch nimmt. Da wirst Du Dir etwas anderes einfallen lassen 
müssen**.

* CTC heißt "Clear Timer on Compare match", d.h., es wird die 
Compare-Einheit   des Timers benutzt und das Timer-Zählregister 
zurückgesetzt, wenn eine Übereinstimmung mit dem Compare-Wert auftritt.

** Da Du in der Interrupt-Routine allerdings gar nichts machst, ist das 
ganze eh sinnfällig, so wie es da steht. Erzähl mal, was da überhaupt 
jede µs gemacht werden soll. Wenn nur ein Signal mit einer bestimmten, 
in 1 µs-Schritten einstellbaren Periodendauer erzeugt werden soll, dann 
brauchst Du gar keinen Interrupt. Das kann der Timer hardwaremäßig.

OHA, ich sehe gerade, dass Timer 0 beim Mega8 überhaupt keine 
Compare-Einheit hat (gut, dass ich noch ins Datenblatt geschaut hab)! 
Hast Du keine Möglichkeit, Timer 1 dafür zu nehmen oder einen Mega88 
anstelle des Mega8?
Gast #597254
Lesenswert?

@ Johny danke das du dich mit meinem problem beschäftigst

Grundsätzlich stehen mir alle 3 timer zur verfügung, nur ich habs halt 
mit dem ersten probiert da ich nicht so erfahren bin:)

Meine Aufgabe ist das ich von 1µs bis zu 300ms lang auf einem Pin low 
oder high ausgebe!!!!

Also könntest mir vl. eine Lösungsvariante sagen?! vl mit den ganzen 
Einstellungen die nötig sind!!!

mfg

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