PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme ATtiny13 Timero Reload



Symphonie
11.06.2009, 14:54
Hallo, ich habe ein Problem. Bis zum Reloadwert von 170 ist alles ok - Ausgang 0 und 1 werden im Wechsle angesteuert. Ab einem Reloadwert von 180 ist nur noch Ausgang 0 an und das dauernd.

Ich habe keine Ahnung an was das liegen kann und bitte um Hilfe.

Klaus Dieter

ACHTUNG: Da ich gerade experimentiere sind noch ein paar Variablen drin welche im Moment noch nicht benutzt werden! Es geht mit im Moment nur um das Problem mit dem Reload!

Taktfrequenz: 128kHz

'PIN 5 Ausgang PB0 = Ansteuerung Transistor T1
'PIN 6 Ausgang PB1 = Ansteuerung Transistor T2
'PIN 3 Ausgang PB45 = Ansteuerung LED

'Schalter rechts oder Links = Dauer

'Ausgang = PORT
'Eingang = PIN

'byte range from 0-255
'integer range from -32767 - +32768
'length can be up to 11 characters

'================================================= =====
'Einstellungen
'================================================= =====


$regfile "attiny13.dat"

$crystal = 128000

'$hwstack = 8
'$swstack = 2
'$framesize = 5

$hwstack = 32
$swstack = 5
$framesize = 20

Stop Ac ' AD-Wandler ausschalten
Stop Adc

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.4 = Output

Dim T1toggle As Bit
Dim T2toggle As Bit

Const Laden = 170

Config Timer0 = Timer , Prescale = 1
On Timer0 Ontimer
Timer0 = Laden
Enable Timer0
Enable Interrupts


T1 Alias Portb.0
T2 Alias Portb.1
Led Alias Portb.4


Dim Plus As Bit ' AUS
Dim Minus As Bit ' EIN
Dim Verzoegerung As Iram Byte
Dim Aus As Bit ' AUS
Dim Ein As Bit ' EIN
Dim Zaehler As Integer

Plus = 1 ' Zuordnung Aus
Minus = 0 ' Zuordnung Ein
Verzoegerung = 115 ' 120 = 3,78Hz, 122 = 3,731Hz, 115 = 3,9062Hz mit dem Oszi ausgezählt also sehr ungenau!
Aus = 1 ' Zuordnung Aus
Ein = 0 ' Zuordnung Ein


T1 = Minus ' Aus mit Minus
T2 = Plus ' Aus mit Plus

T1toggle = 0
T2toggle = 1
Led = Aus
Zaehler = 0


'================================================= =====
'Hauptprogramm
'================================================= =====

Do

If Zaehler = 1000 Then
T1toggle = Not T1toggle
T2toggle = Not T2toggle
Portb.0 = T1toggle
Portb.1 = T2toggle
Zaehler = 0
End If

Loop


'================================================= =====
' Interrupt
'================================================= =====

Ontimer:
Timer0 = Laden
Incr Zaehler
Return

Sauerbruch
11.06.2009, 16:33
Hmmm... ohne genau zu wissen was der Code denn genau machen soll, hätte ich eine kleine Idee:
Wenn Du den Timer auf 180 lädst, bleiben ja "nur" noch etwa 70 Zyklen bis zum nächsten Überlauf. Ein paar Dutzend gehen schon zum Register-Retten beim Interrupt-Einsprung drauf, dann hast Du in der Mainloop ein paar Vergleiche - was ich sagen will ist, dass es das Programm vielleicht verpennt, wenn Zähler gerade genau 1000 ist.

Probier´s doch mal etwa so:


Do

If 999 < Zaehler Then
T1toggle = Not T1toggle
T2toggle = Not T2toggle
Portb.0 = T1toggle
Portb.1 = T2toggle
Zaehler = 0
End If

Loop


Ist nur so ´ne Idee...

Symphonie
11.06.2009, 16:41
Hallo und vielen Dank,

der Attiny hat die 1000 tatsächlich verpennt. Mit der anderen If Abfrage klappt es.

Gruß Klaus Dieter