Forum: Mikrocontroller und Digitale Elektronik Mega8 Timer0


von Michael (Gast)


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

}

von Timmo H. (masterfx)


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.

von ichdu (Gast)


Lesenswert?

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

von Timmo H. (masterfx)


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

von Michael (Gast)


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

von ichdu (Gast)


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

von Michael (Gast)


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

von Michael (Gast)


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?

von MWS (Gast)


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.

von Michael (Gast)


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.

von MWS (Gast)


Angehängte Dateien:

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.

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.