www.mikrocontroller.net

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


Autor: Mellon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
 #include <mega8.h>
    #include <delay.h>

     interrupt [TIM0_OVF] void timer0_ovf_isr(void)
     {
         // Reinitialize Timer 0 value
         TCNT0=0xF4;
         // Place your code here
     }

     void main(void)
     {  // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: Timer 0 Stopped
        TCCR0=0x00;
        TCNT0=0xF4;

        // External Interrupt(s) initialization
        // INT0: Off
        // INT1: Off
        MCUCR=0x00;

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

        For(;;)
        {  #asm("sei")
       
        }

     }

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: nop(); (Gast)
Datum:

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

Autor: Mellon (Gast)
Datum:

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

Autor: Mellon (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Mellon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex22 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
siehe dein anderer Thread...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.