www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega8 Timer0


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich muss gerade recht schnell ne kleine Demo auf nem Mega8 zum laufen 
bringen. Kenne mich aber mit Atmels und Programmieren allgemein nicht 
sonderlich gut aus. Zur Verfügung steht mir das AVR-Starterkit. 
Programmieren tue ich in C mit AVR-Studio-4.

Aktuell habe ich ein Problem mit Timer0 und nem dazu gehörigen 
Interrupt. Was mache ich da falsch im Code?

#include <avr/io.h>
#include <avr/interrupt.h>

int main (void)
{
  cli();
  //Register Ein- / Ausgänge definieren
  DDRD = 0xFF;  //alle Ausgang
  DDRB = 0x03;  //PB0 & PB1 Ausgang

  //Startzustände definieren
  PORTB |= (1 << PB0);  //Transistor aus
  PORTB &= ~(1 << PB1);  //Transistor ein

  PORTD |= (1 << PD0);  //Segment aus
  PORTD |= (1 << PD1);  //Segment aus
  PORTD |= (1 << PD2);  //Segment aus
  PORTD |= (1 << PD3);  //Segment aus
  PORTD |= (1 << PD4);  //Segment aus
  PORTD |= (1 << PD5);  //Segment aus
  PORTD |= (1 << PD6);  //Segment aus
  PORTD |= (1 << PD7);  //Segment aus

  // Timer 0 konfigurieren
    TCCR0 |= (1 << CS00);   //Prescaler
    // Overflow Interrupt erlauben
    TIMSK |= (1 << TOIE0);

    // Global Interrupts aktivieren
    sei();


  for(;;)
  {

    PORTD &= ~(1 << PD2);  //Segment ein

  }
}


//Interrupt Routinen

ISR(TIMER0_OVF_vect)
{
  PORTD &= ~(1 << PD0);  //Segment ein

}

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Aktuell habe ich ein Problem mit Timer0 und nem dazu gehörigen
> Interrupt. Was mache ich da falsch im Code?
Was hast du denn für ein Problem?


und das
>   for(;;)
>   {
>
>     PORTD &= ~(1 << PD2);  //Segment ein
>
>   }
solltest du nicht machen. Warum willst du den Port alle paar ns wieder 
auf 0 setzen? Macht doch gar keinen Sinn.

Autor: ichdu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage ist, was genau willst du mit deinem Code erreichen und was 
genau passiert, wenn du es laufen lässt?

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also so wie ich das sehe, sollte die ISR(TIMER0_OVF_vect) bei F_CPU=1MHz 
nach 1e6/256 =  256µs eingeschaltet werden. Also Quasi sofort. Wenn es 
das ist was du willst, ist es ja OK :D

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das der aktuelle Code noch nicht viel Sinn ergibt ist klar, der ist nur 
zu Testzwecken.

Ich hab 2 7-Segment-Anzeigen welche ich multiplexen will. Die Segmente 
sind an Port D angeschlossen. Zwei Transistoren zum umschalten an PB0 
und PB1. Das lässt sich auch alles so Problemlos ansteuern.

Jetzt möchte ich gerne das Umschalten der Transistoren zyklisch durch 
nen Timer geschehen lassen. Und die Anzeigen sollen dann erstmal einfach 
von 0-99 zählen.

Zum Testen möchte ich jetzt erstmal einfach in der ISR ein Segment 
einschalten um zu sehen ob da überhaupt reingesprungen wird. Da passiert 
aber nix und das ist das aktuelle Problem.

Gruß Michael

Autor: ichdu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timmo H. schrieb:
> Also so wie ich das sehe, sollte die ISR(TIMER0_OVF_vect) bei F_CPU=1MHz
> nach 1e6/256 =  256µs eingeschaltet werden. Also Quasi sofort. Wenn es
> das ist was du willst, ist es ja OK :D

dazu benötigt man aber kein Timer :D

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss man da vielleicht noch irgendwelche von den Fuses richtig setzen? 
Habe die Taktquelle beispielsweise aktuell auf den internent Takt von 
1MHz mit 64ms Startup gestellt.

Gruß Michael

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mittlerweile rausgefunden, dass es nicht am Timer liegt. Der läuft, 
habe dazu in der main einfach mal ne Abfrage auf den aktuelle Timerwert 
eingebaut.

Daher muss es wohl am Interrupt liegen, habe ich denn da was falsch 
gemacht?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Daher muss es wohl am Interrupt liegen, habe ich denn da was falsch
> gemacht?

Nein, Interrupt funktioniert, Ergebnis nach einem Überlauf:
PB0 = 1, PB1 = 0, PD0 = 0, PD2 = 0

Also Hardware und Kontrollerdefinition überprüfen.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, bei mir läufts leider nicht.

Was genau meinst du mit "Hardware und Kontrollerdefinition überprüfen?

Habe nen Mega8 und das auch in AVR-Studio so eingestellt.

Autor: MWS (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Was genau meinst du mit "Hardware und Kontrollerdefinition überprüfen?

Überprüfen ob die Signale so wie ich sie schrieb an den µC-Pins anliegen 
und ob da auch ATmega8 im Projekt drinsteht. Nicht daß das .hex für 'nen 
anderen Typen erzeugt wird. Kannst auch im Projekt --> default-Ordner 
das dort enthaltene Makefile im Texteditor öffnen um da zusätzlich 
sicher zu gehen. Anbei das erzeugte .hex, kannst ja mal testen.

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.