Hi drucker,
ich glaube, Du musst das anders anpacken.
Entweder Du nimmst einen "Pin change" als Interrupt,
oder Du arbeitest mit dem Befehl "PULSEIN" von Bascom, der genug Auflösung für Schaltaufgaben bietet.Code:'Interrupt bei jedem Flankenwechsel (0->1 und 1->0) Config Int0 = Change
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 !
Gruß.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
Rainer







Zitieren

Lesezeichen