Archiv verlassen und diese Seite im Standarddesign anzeigen : BASCOM8051 und Timer im Mode0
Ich möchte eine Multiplexanzeige mit ca. 200 Hz ansteuern. Also habe ich gedacht, den Timer im mode0 eine ISR nach der entsprechenden Zeit abarbeiten zu lassen. Mit meinem Testprogramm komme ich aber auf 56 Hz. Wo liegt mein Denkfehler? Hier der Text, das original im Anhang:
'timertest0, 25.3.13
Dim T As Byte
$crystal = 11059200
Config Timer0 = Timer , Mode = 0 , Gate = Internal
On Timer0 Anzeige
Load Timer0 , 4608
Enable Timer0
Enable Interrupts
Start Timer0
Do
Wait 1
P3.2 = Not P3.2
Loop
End
Anzeige:
Load Timer0 , 4608 '11059200/(12*4608)= 200
P3.3 = Not P3.3
Incr T
If T > 100 Then
P3.4 = Not P3.4 'nur Kontrolle
T = 0
End If
Return
Offensichtlich arbeitet niemand mit Bascom8051 :(. Ich habe nun einen Irrtum gefunden: Der load-befehl gilt nur im mode2. Jetzt habe ich statt dessen die Werte für TL0 = 32 und TH0 = 144 eingesetzt, erhalte aber auch eine abweichende Frequenz, hier 128 Hz. Nun kann ich mich zwar dem gewünschten Wert nähern, aber das erklärt nicht die Differenz. Vielleicht hat doch noch jemand eine Idee!
Dolivo
Peter1060
09.04.2013, 07:14
Der Interrupt wird bei Überlauf (65535 -> 0) ausgelöst. Dein Wert sollte also -4608 oder 65536-4608 => 60928 sein. Peter
Hallo, Peter,
zuerst danke für die Antwort. Aber im mode0 kann ich doch nur eine 13-Bit-Zahl verwenden. Also müsste ich hier das auf 8192 beziehen? Ich teste es demnächst.
Dolivo
Peter1060
09.04.2013, 11:02
RTFM:The 13-bit register consists of all 8 bits of TH0 and the lower 5 bits of TL0. The upper 3 bits of TL0 are indeterminate and should be ignored.
nein, auch damit bekomme ich andere Zeiten. Mir war schon klar, dass im mode0 TL0 max. 32 sein kann.
Peter1060
10.04.2013, 10:12
nein, auch damit bekomme ich andere Zeiten.
...und...welche????
-----------------------------
TL0 = 32
was soll das sein?
32D -> 20H -> 10000B !!!
bei TL0 sind nur die unteren 5 Bit relevant... TL0 = xxx00000B
-----------------------------
mit TL0 = 32 und TH0 = 144
n = 11059200 / ( 12 * (256-144) * 32) = 257,1Hz -> 3,88ms
mit diesen 3,88ms wird die LED geschaltet. Für eine Periade brauchst Du 2 LED-schaltungen.
1/( 3,88ms *2) = 128,5Hz an der LED
-----------------------------
mit TL0 = 0 und TH0 = 112
n = 11059200 / ( 12 * (256-112) * 32) = 200Hz -> 5ms
1/( 5ms *2) = 100Hz an der LED
-----------------------------
TL0 = 32
was soll das sein? Ja, hier habe ich nicht gedacht.
Ich erhalte folgende Daten bei TL0=0 (bzw. 32):
TH0=112 und f=91 Hz, TH0=144 und f=128 Hz, TH0=185 und f=198 Hz. Es handelt sich um die Frequenz, also Port ein und aus.
Peter1060
11.04.2013, 12:39
Deine Werte ergeben keinen Sinn, zurückgerechnet hast Du 3 verschiedene Quarzfrequenzen oder Dein Frequenzmesser ist totaler Murx.
Arbeitest Du mit dem AT89C4051?
Tja, das eben ist mein Problem. Ich benutze einen AT89C4051 und zwei Frequenzmesser sowie noch ein Periodendauermessgerät (für pos. und neg.).
Peter1060
18.04.2013, 12:06
moin,habe gestern mal eine 89C4051 geproggt und das funktioniert im Mode1 wie angegeben. Im Mode0 muss der Wert *8 eingesetzt werden, dann kommt auch dort die errechnete Zeit raus.MfG Peter
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.