Timer wird nicht gerufen.

Gast #3191333
Lesenswert?

Hallo,

ich möchte gerne einen 1 Sekundentimer mit meiner Schaltung realisieren.

Deshalb wollte ich erst einmal klein anfangen und nur den Timer0 auf OVF 
prüfen. (Wie im Tutorial beschrieben)

Ich habe also:
1
/* uC: AT90S2313 */
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
 
5
int main(void)
6
{
7
  // Timer 0 konfigurieren
8
  TCCR0 = (1<<CS01); // Prescaler 8
9
  // Overflow Interrupt erlauben
10
  TIMSK |= (1<<TOIE0);
11
  // Global Interrupts aktivieren
12
  sei();
13

14
 DDRA = 0xff;
15
 PORTA=0x01;
16
  while(1)
17
  {
18
    /* Sonstige Aktionen */
19
  }
20
}
21
 
22
ISR (TIMER0_OVF_vect)
23
{
24
PORTA=0x05;
25
}
Nur leider geht der µC scheinbar nie in die ISR, denn es steht die ganze 
Zeit nur 0x01 am Ausgang und nicht wie gedacht 0x05.

Wo könnte mein Problem liegen? Ich habe folgende "Fuse"-Einstellungen 
vorgenommen. (siehe Anhang) Ich möchte später einmal einen externen 
Quarzoszi. verwenden. Momentan läuft der µC aber noch auf dem internen 
RC Osc. Der externe Quarzoszi. ist jedoch schon angeschlossen.

Vielen Dank für eure Hilfe.
Angehängte Dateien:
Persönliche Seite #3191577
Lesenswert?

Jürgen W. schrieb:
> Ja, aber das das im Zusammenhang mit den Timern steht erschließt sich
> mMn nicht ganz.

Nunja, mit den Timern hat das natürlich nix zu tun. Du verwendest den 
Port aber um wohl zu überprüfen, ob Deine Interrupt-Routine angesprungen 
wird:
1
ISR (TIMER0_OVF_vect)
2
{
3
PORTA=0x05;
4
}

Also: Martin hat schon ganz Recht, AVCC muß angeschlossen sein, wenn Du 
den PortA verwendest.

LG,
Frank
#3191606
Lesenswert?

an deinem Programm ist erst mal nix falsch.
Dein Fehler muss also irgendwas mit der Umgebung zu tun haben.

Und wenn wir schon dabei sind

* Blockkondensatoren?
* Widerstand am Reset?

eben das übliche Programm, das jede Woche 25 mal auftaucht und trotzdem 
immer wieder nicht gemacht wird.
#3191716
Lesenswert?

Hau dir ins Programm gleich noch eine Möglichkeit rein, wie du erkennen 
kannst, dass der µC resettet wird.
Einfach am Anfang in main irgendein Licht einschalten und nach 1 Sekunde 
wieder ausschalten (_delay_ms dafür benutzen).
Damit ist dann auch sichergestellt, dass du es nicht übersehen kannst, 
wenn dir dein Schaltvorgang die Versorgungsspannung des µC in die Knie 
zwingt und der µC resettet wird (was dann ebenfalls dazu führen würde, 
dass du optisch nie sehen würdest, dass am PORTA die 0x05 anliegen, weil 
das einfach zu schnell geht vom Durchschalten bis zum Reset)

Also zb ungefähr so
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
 
5
int main(void)
6
{
7
  DDRA = 0xff;
8

9
  PORTA = 0x07;
10
  _delay_ms( 1000 );
11

12
  PORTA = 0x01;
13

14
  // Timer 0 konfigurieren
15
  TCCR0 = (1<<CS01); // Prescaler 8
16
  // Overflow Interrupt erlauben
17
  TIMSK |= (1<<TOIE0);
18

19
  // Global Interrupts aktivieren
20
  sei();
21

22
  while(1)
23
  {
24
    /* Sonstige Aktionen */
25
  }
26
}
27
 
28
ISR (TIMER0_OVF_vect)
29
{
30
  PORTA = 0x05;
31
}
#3191833
Lesenswert?

Anmerkung:
Wenn man die delay-Sachen in Verbindung mit dem Studio Version größer 4 
benutzt: Am Anfang des Programms zum Beispiel
1
#define F_CPU 10000000UL
benutzen.
Die Zahl gibt die Taktfrequenz des µC in Hertz an. (Hier also für 10MHz)
Beachte auch, das delay_ms nur eine von der Frequenz abhängige maximale 
Wartezeit ausführen kann.
Gast #3192633
Lesenswert?

hmm okay...AVCC (nur AREF ist momentan unbeschaltet) ist wie im Tutorial 
beschrieben angeklemmt und durch Spannungsmessung an AVCC-Pin 
kontrolliert.

Ich habe meine RC-Kombination am Reset und ansonsten Vcc (ebenfalls mit 
Kondi) und GND beschalten.

Taster habe ich auch schon dran (ebenfalls PORTA). Diese funktionieren 
einwandfrei mit ihren Pull-Downs (da Öffner).

Ich habe in diesem Zusammenhang geschaut, ob ich mit der ISR den PORTB 
setzen kann. Auch kein Erfolg.

Die Geschichte mit:

Karl Heinz Buchegger schrieb:
> DDRA = 0xff;
>
>   PORTA = 0x07;
>   _delay_ms( 1000 );
>
>   PORTA = 0x01;

funktioniert auch einwandfrei.

#define F_CPU 8000000UL wurde vereinbart. Er wartet auch 1 Sekunde bevor 
die andere Nixieziffer angeht.

Dennoch wird die ISR nicht aufgerufen.

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