Forum: Mikrocontroller und Digitale Elektronik Timer0 (PWM) + Timer1 (Timer) funktioniert nicht


von The SphereX (Gast)


Lesenswert?

Hi Leute !!!

Als Vorbereitung für ein Projekt experimentiere ich gerade ein wenig mit 
Timern herum. Dabei mußte ich leider feststellen, daß sich die zwei 
Timer des ATTiny45 bei gleichzeitiger Verwendung irgendwie gegenseitig 
"behindern".

Folgender Code für ein einfaches LED-Flackern funktioniert noch 
einwandfrei.

---------------------------------------------------------------
1
$regfile = "attiny45.dat"
2
$crystal = 4000000
3
$hwstack = 32
4
$swstack = 5
5
$framesize = 20
6
7
Dim Pause As Word
8
Config Portb.0 = Output
9
Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down
10
11
Do
12
13
   Pwm0a = Rnd(900)
14
   Pause = Rnd(700)
15
   Waitms Pause
16
17
Loop
18
End
----------------------------------------------------------------

Baue ich jetzt allerdings noch Timer1 mit ein, der als Uhr fungieren 
soll, funktioniert die Uhr-ISR zwar wie geplant, das Flackern jedoch 
plötzlich nicht mehr, d. h. die LED bleibt auf einer Helligkeitstufe.

---------------------------------------------------------------
1
$regfile = "attiny45.dat"
2
$crystal = 4000000
3
$hwstack = 32
4
$swstack = 5
5
$framesize = 20
6
7
Dim Pause As Word
8
Dim Stunde As Byte
9
Dim Minute As Byte
10
Dim Sekunde As Byte
11
Dim Timer_counter As Word
12
13
Config Portb.0 = Output
14
15
' Timer für LED-Flackern
16
Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down
17
18
' Timer für Uhrzeit
19
Config Timer1 = Timer , Prescale = 1
20
On Timer1 Uhrzeit
21
Enable Timer1
22
Enable Interrupts
23
Start Timer1
24
25
Do
26
27
   Pwm0a = Rnd(900)
28
   Pause = Rnd(700)
29
   Waitms Pause
30
31
Loop
32
End
33
34
35
' UHR
36
' ===
37
38
Uhrzeit:
39
Incr Timer_counter
40
If Timer_counter = 15625 Then
41
  Timer_counter = 0
42
  Incr Sekunde
43
  If Sekunde = 60 Then
44
    Sekunde = 0
45
    Incr Minute
46
    If Minute = 60 Then
47
      Minute = 0
48
      Incr Stunde
49
      If Stunde = 24 Then Stunde = 0
50
    End If
51
  End If
52
End If
53
Return
---------------------------------------------------------------

Mit Timer1 als Uhr wollte ich mir eigentlich eine Möglichkeit schaffen, 
später in der Hauptschleife nach Bedarf die aktuelle Uhrzeit abfragen zu 
können, um davon abhängig weitere Aktionen durzuführen. Da aber beide 
Timer zusammen offensichtlich in dieser Konfiguration nicht 
funktionieren, stehe ich jetzt etwas auf dem Schlauch.

Wo liegt hier das Problem?


Grüße,
The SphereX

: Bearbeitet durch User
von OldMen (Gast)


Lesenswert?

Ich vermute, dass der Timer1 ISR zu lange braucht und der Timer0 
Interrupt
verloren geht. Du befeuerst beide mit 4 MHz, d.h. alle 250us klingelt 
der Interrupt. Bei der Anzahl der Zeilen im ISR von Timer1 und mit 
Basic, wo wir alle wissen, dass nicht gerade schnellen Code erzeugt, 
reichen die 250us bis zum nächsten Interrupt nicht mehr.
Du solltest mal über einen anderen Prescalfakor nachdenken.

von The SphereX (Gast)


Lesenswert?

Sowas in der Art habe ich mir fast schon gedacht.

Ich hab's mal mit anderen Prescalern probiert, sowohl beim Timer0, als 
auch beim Timer1. Timer0 hat absolut nichts gebracht. Erst als ich den 
Prescaler von Timer1 auf 256 eingestellt hatte, funktionierte 
tatsächlich auch Timer0 (das Flackern) wieder.

Mit einem Timer1-Reload von 131 ergibt sich dann nach jeweils 125 
Overflows auch genau eine Sekunde, die ich für meine Uhr brauche.

Soweit, so gut ... :-)

Grüße,
The SphereX

von tscheche (Gast)


Lesenswert?

Sage mal, was hast du das da für eine komische Programmier-sprache? 
Kannst du nicht in irgendeiner normaler Sprache, wie etwa C oder 
Assembler schreiben? :-)

von Davis (Gast)


Lesenswert?

tscheche schrieb:

> Sage mal, was hast du das da für eine komische Programmier-sprache?
> Kannst du nicht in irgendeiner normaler Sprache, wie etwa C oder
> Assembler schreiben? :-)

Sage mal, bist du so dumm, dass du die Sprache nicht erkennst? Kannst du 
nicht normal denken, wie die anderen hier?

von The SphereX (Gast)


Lesenswert?

Noch nichts von BASCOM gehört? In C oder ganz und gar Assembler bräuchte 
ich vermutlich Jahre für meine Projekte, frei nach dem Motto "Warum 
einfach, wenn's auch kompliziert geht?"

Aber wir wollen doch hier jetzt keine Grundsatzdiskussion zu den 
verschiedenen Programmiersprachen anfangen, oder? Das wurde anderenorts 
und sicherlich auch hier schon zur Genüge getan ;-)

Grüße,
The SphereX

von Karl H. (kbuchegg)


Lesenswert?

The SphereX schrieb:
> Noch nichts von BASCOM gehört? In C oder ganz und gar Assembler bräuchte
> ich vermutlich Jahre für meine Projekte, frei nach dem Motto "Warum
> einfach, wenn's auch kompliziert geht?"

Jep.
Sieht man ja hier ganz deutlich.
Du implementierst eine Uhr, obwohl BASCOM schon eine Uhr mitbringt.

Fazit:
Wer seine Programmiersprache (und seinen AVR) nicht kennt, für den 
spielt es keine Rolle, in welcher Sprache er Quatsch produziert. BASCOM 
vermittelt nur das Gefühl, dass es einfacher ist Quatsch zu produzieren, 
weil der BASCOM Compiler nicht so pingelig ist, wenn es darum geht, auf 
Einhaltung der Syntax zu pochen.

: Bearbeitet durch User
von The SphereX (Gast)


Lesenswert?

Karl Heinz schrieb:

> Du implementierst eine Uhr, obwohl BASCOM schon eine Uhr mitbringt.

Na sowas? Nur das beim ATTiny45 "Config Clock = Soft" gar nicht 
unterstützt wird! Soviel zum Thema:

> Wer seine Programmiersprache (und seinen AVR) nicht kennt ...

Und mal ganz allgemein: Jeder nutzt die Programmiersprache, mit der er 
am besten zurecht kommt. Und für mich als Anfänger im Bereich 
AVR-Programmierung ist das nun mal eben BASCOM. Das hat meiner Meinung 
nach mit "Quatsch produzieren" nichts zu tun, denn das kann man 
sicherlich auch in C oder Assembler. Wenn der AVR dann aber letzlich 
macht, was er soll, ist es mir relativ egal, ob der

> Compiler nicht so pingelig ist, wenn es darum geht, auf Einhaltung der Syntax zu 
pochen ...

Die Hauptsache für mich ist nach wie vor, daß ich auch als Anfänger 
möglichst schnell zu einem Ergebnis komme. Und dabei hat mir BASCOM bis 
jetzt sehr gute Dienste geleistet!

Grüße,
The SphereX

von Bastler (Gast)


Lesenswert?

> Die Hauptsache für mich ist nach wie vor, daß ich auch als Anfänger
> möglichst schnell zu einem Ergebnis komme.

Oder eben auch mal zu einem Anderen, als dem Gewünschten ...

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.