Forum: Mikrocontroller und Digitale Elektronik Timer wird nicht gerufen.


von Jürgen W. (Gast)


Angehängte Dateien:

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.

von Jürgen W. (Gast)


Lesenswert?

Edit: Es handelt sich um einen ATMEGA32

von oldmax (Gast)


Lesenswert?

Hi
Gut, C ist nicht mein Ding, aber
>/* uC: AT90S2313 */
und
>Es handelt sich um einen ATMEGA32

Passt das zusammen?
Gruß oldmax

von Martin K. (maart)


Lesenswert?

oldmax schrieb:
> Hi
> Gut, C ist nicht mein Ding, aber
>>/* uC: AT90S2313 */
> und
>>Es handelt sich um einen ATMEGA32
>
> Passt das zusammen?
> Gruß oldmax

Nicht schön, funktioniert aber, da es nur ein Kommentar ist.


Ist AVCC auch angeschlossen?

von Jürgen W. (Gast)


Lesenswert?

Nein...sollte das der Grund sein?!

von Martin K. (maart)


Lesenswert?

Jürgen W. schrieb:
> Nein...sollte das der Grund sein?!

Ich zitiere einfach mal Seite 5 des Datenblattes:
1
AVCC is the supply voltage pin for Port A and the A/D Converter. 
2
It should be externally connected to VCC, 
3
even if the ADC is not used.
Wenn du den ADC nutzen willst, lies im Datenblatt noch den 
darauffolgenden Satz nach.

von Jürgen W. (Gast)


Lesenswert?

Ja, aber das das im Zusammenhang mit den Timern steht erschließt sich 
mMn nicht ganz.


Ich werde es aber einmal probieren.

von Frank W. (wesoft) Benutzerseite


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

von Jürgen W. (Gast)


Lesenswert?

versteht mich nucht falsch. der PORTA funktioniert einwandfrei in allen 
Varuanten (ich steuere Nixies an) nur kann ich ihn nicht mit der ISR 
ansprechen.

von Karl H. (kbuchegg)


Lesenswert?

schliess das verdammte AVcc an!

von Jürgen W. (Gast)


Lesenswert?

Sorry ich habe vom handy aus geschrieben. deshalb die "u"

von Karl H. (kbuchegg)


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.

von Chris (Gast)


Lesenswert?

zu "NeuDeutsch", wenn PORTA nix SPannung, dann PORTA nixe arbeite.

von Jürgen W. (Gast)


Lesenswert?

kondis und widerstand sind da...ich werde heute abend dieses avcc 
anschließen und schauen was passiert...

von Karl H. (kbuchegg)


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
}

von Martin K. (maart)


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.

von Wartender (Gast)


Lesenswert?

Martin Kreiner schrieb:

> Beachte auch, das delay_ms nur eine von der Frequenz abhängige maximale
> Wartezeit ausführen kann.

Das ist schon lange Geschichte

von troll (Gast)


Lesenswert?

Martin Kreiner schrieb:
>  Am Anfang des Programms zum Beispiel
>
1
#define F_CPU 10000000UL

Nein, das gehört in die Projektoptionen! Sonst wird es ganz schnell 
inkonsistent bei mehreren Dateien.

von Jürgen W. (Gast)


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.

von Martin (Gast)


Lesenswert?

Tausch mal den controller nach möglichkeit. Vllt. ist irgendwas intern 
defekt.

von Karl H. (kbuchegg)


Lesenswert?

Die Projekteinstellungen könnten es auch noch sein.
Wenn da ein falscher µC eingetragen ist, dann klappt die Verteilung der 
Interrupts natürlich nicht.

von Jürgen W. (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Die Projekteinstellungen könnten es auch noch sein.
> Wenn da ein falscher µC eingetragen ist, dann klappt die Verteilung der
> Interrupts natürlich nicht.


Das ist es! Es war ein 128et eingestellt. Kein 32er. Ich danke vielmals!

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.