Forum: Mikrocontroller und Digitale Elektronik Anfänger hat Timerproblem bei Atmega8


von Mellon (Gast)


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 :)

von Johannes M. (johnny-m)


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?

von nop(); (Gast)


Lesenswert?

Das Mega8 Manual hast du aber angeschaut ? Da steht alles drin. Auch 
ueber Timercontrolregister und so.

von Mellon (Gast)


Lesenswert?

Hab mir alles reinzogen:)
Nur bin ich mir nicht sicher wie der Interrupt genau funkt

von Mellon (Gast)


Lesenswert?

Hab mir alles reinzogen:)
Nur bin ich mir nicht sicher, ob der Timer nicht funktioniert oder der 
Interrupt?

von Johannes M. (johnny-m)


Lesenswert?

> For(;;)
> {  #asm("sei")
1.: Es macht wenig Sinn, sei in der Endlosschleife ständig auszuführen. 
Einmal (vor der Schleife) reicht.

2.: Das müsste beim Compilieren eine Fehlermeldung geben. "for" muss 
klein geschrieben sein!

von Mellon (Gast)


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

von Alex22 (Gast)


Lesenswert?

siehe dein anderer Thread...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.