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
DimPauseAsWord
8
ConfigPortb.0=Output
9
ConfigTimer0=Pwm,Prescale=1,CompareAPwm=ClearDown
10
11
Do
12
13
Pwm0a=Rnd(900)
14
Pause=Rnd(700)
15
WaitmsPause
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
DimPauseAsWord
8
DimStundeAsByte
9
DimMinuteAsByte
10
DimSekundeAsByte
11
DimTimer_counterAsWord
12
13
ConfigPortb.0=Output
14
15
'TimerfürLED-Flackern
16
ConfigTimer0=Pwm,Prescale=1,CompareAPwm=ClearDown
17
18
'TimerfürUhrzeit
19
ConfigTimer1=Timer,Prescale=1
20
OnTimer1Uhrzeit
21
EnableTimer1
22
EnableInterrupts
23
StartTimer1
24
25
Do
26
27
Pwm0a=Rnd(900)
28
Pause=Rnd(700)
29
WaitmsPause
30
31
Loop
32
End
33
34
35
'UHR
36
'===
37
38
Uhrzeit:
39
IncrTimer_counter
40
IfTimer_counter=15625Then
41
Timer_counter=0
42
IncrSekunde
43
IfSekunde=60Then
44
Sekunde=0
45
IncrMinute
46
IfMinute=60Then
47
Minute=0
48
IncrStunde
49
IfStunde=24ThenStunde=0
50
EndIf
51
EndIf
52
EndIf
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
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.
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
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? :-)
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?
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
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.
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
> 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 ...