Hi drucker,
ich glaube, Du musst das anders anpacken.
Entweder Du nimmst einen "Pin change" als Interrupt,
Code:
'Interrupt bei jedem Flankenwechsel (0->1 und 1->0)
Config Int0 = Change
oder Du arbeitest mit dem Befehl "PULSEIN" von Bascom, der genug Auflösung für Schaltaufgaben bietet.
Hier mal ein kleines Beispielprogramm von mir für einen ATTiny13-Positionslampenblinker (für einen Helikopter), der auf Schalterstellungen der Fernsteuerung reagiert .. nicht unbedingt elegant, aber funktioniert. Wenn man beim Einschalten die Fernsteuerung auf "100%" schaltet, kann man die Blinkfrequenz programmieren, die er dann in's EEProm schreibt. Vielleicht hilft's Dir ja was. ACHTUNG: Die "PULSEIN"-Werte sind von der Taktfrequenz abhängig !
Code:
'******************************************************
'Projekt: Blinker
'
'Prozessor: ATTiny13
'Bascom-Version: 1.11.8.2
'
'Programm : Positionslichter
'
'Hardware:
'RC-Input an Port B.0
'LED an Port B.1 Positionslichter (2) rot+grün statisch (max. 1A)
'LED an Port B.3 Flasher weiß alle 3 Zyklen (max. 1A)
'LED an Port B.4 Positionslichter (2) rot + grün blinkend jeder Zyklus (max. 1A)
'Schaltkanal an Port B.2 statisch (max. 1A)
'Alle Ausgänge auf Schalttransistoren
'
' (c) Rainer Distler, 15.02.2006
'
'******************************************************
'======================================================
'System-Einstellungen
'======================================================
'Definition für Tiny13
$regfile "attiny13.dat"
'Angabe der Taktfrequenz (1,2 Mhz) Gegenüber 9,6 MHz weniger Stromverbrauch
$crystal = 1200000
'Hardware-Stack verkleinern
$hwstack = 16
'======================================================
'Konfigurationen
'======================================================
Config Portb.0 = Input
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output
'======================================================
'Deklarationen
'======================================================
'
Dim Rc As Word
Dim Dummy As Byte
Dim Frequenz As Eram Word
Dim Frequenzmem As Word
Dim Timedummy As Word
Declare Sub Stufe2
'======================================================
'Initialisierungen
'======================================================
Const An = 1
Const Aus = 0
Led1 Alias Portb.1
Led3 Alias Portb.3
Led4 Alias Portb.4
Ausgang Alias Portb.2
'======================================================
'Hauptprogramm-Schleife
'======================================================
Waitms 3000
'Nach Anschluss der Versorgungsspannung 3 Sekunden warten. Wenn in dieser Zeit
'der RC-Kanal auf 100% geschalten wird, gelangt man in den Programmiermodus
Pulsein Rc , Pinb , 0 , 1
If Rc > 120 Then Goto Setfrequenz
Do
Pulsein Rc , Pinb , 0 , 1 'Messung Zeit zwischen 1 und 0 Pegel
If Rc <= 100 Then
Led1 = Aus
Led3 = Aus
Led4 = Aus
Ausgang = Aus
End If
If Rc > 100 And Rc < 110 Then
Led1 = An
Ausgang = Aus
End If
If Rc >= 110 And Rc <= 120 Then
Ausgang = Aus
Stufe2
End If
If Rc >= 120 Then
Ausgang = An
Stufe2
End If
Loop
'
'Programmende
End
Setfrequenz:
Frequenz = 80
Frequenzmem = 80
Do
Led1 = An 'Blinkende LED zeigt Frequenz an
Timedummy = Frequenz * 10
Waitms 50
Led1 = Aus
Waitms Timedummy
Pulsein Rc , Pinb , 0 , 1
If Rc < 100 Then Frequenzmem = 80 'Schaltkanal auf 0%
If Rc > 100 And Rc < 110 Then Frequenzmem = 100 'Schaltkanal auf 40%
If Rc > 110 And Rc < 120 Then Frequenzmem = 120 'Schaltkanal auf 80%
'Verhindern, das EEProm ständig neu beschrieben wird
If Frequenz <> Frequenzmem Then
Frequenz = Frequenzmem
End If
Loop
Sub Stufe2
Led1 = An
Incr Dummy
If Dummy = 3 Then
'Flasher alle 3 Zyklen
Dummy = 0
Led3 = An
Waitms 50
Led3 = Aus
Else
'Positionslichter doppelblinken jeden Zyklus
Led4 = An
Waitms 60
Led4 = Aus
Waitms 80
Led4 = An
Waitms 60
Led4 = Aus
End If
Timedummy = Frequenz * 10
Waitms Timedummy
End Sub
Gruß.
Rainer
Lesezeichen