PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : R/C Kanal auswerten - Pulse überprüfen



spaceduck
24.06.2008, 21:03
Hallo zusammen,

ich programmiere gerade einen R/C Fahrtregler. Die Pulsdauer messen und als PWM ausgeben funktioniert über den Timer1 des Mega8 soweit ganz gut. Jetzt möchte ich zusätzlich ca. 20 Pulse in Neutralstellung auswerten. Wenn diese nicht ankommen (Sender aus) soll die PWM aus sein. Und genau daran scheitere ich gerade. Wie kann ich in Bascom ca. 20 Werte (Pulse) überprüfen und erst wenn 20 Pulse hintereinander ordentlich eintreffen die PWM einschalten??
Hintergrund ist auch das wenn der Sender auf Vollgas steht der Regler nicht angeht, der Knüppel soll erst in Neutralstellung geschoben werden. Dann PWM ein.

Wer kann mir sagen wie ich das in Bascom realisiere?
Danke schon mal...

Tido
24.06.2008, 22:00
Hi,

das Programm würde evtl helfen.

spaceduck
25.06.2008, 11:34
Hier der Code...



'************************************************* *****
'Prozessor: ATMega8L
'R/C_Kanal einlesen
'
'Hardware:
'R/C-Kanal an D.2 (INT0)
'LED an C.0
'LED an C.1
'LED an C.2
'************************************************* *****

$regfile "m8def.dat"
$crystal = 1000000

Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portd.6 , Rs = Portd.5
Config Lcd = 16 * 2



'Konfiguration der I/O-Ports´s
Config Pind.2 = Input 'R/C Pulseingang
Config Pinb.3 = Output 'PWM Ausgang
Config Pind.7 = Output
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pind.6 = Output
Config Pind.5 = Output
Portd.2 = 1


'Konfiguration des Timer1
Config Timer1 = Timer , Prescale = 1

'Konfiguration des INT0
'Interrupt bei jedem Flankenwechsel (0->1 und 1->0)
Config Int0 = Change

'================================================= =====
'Deklarationen
'================================================= =====

Dim Reading As Bit
Dim Rc_value As Word
Dim Error As Bit

'================================================= =====
'Initialisierungen
'================================================= =====

'Zuweisung der Interrupt-Service-Routinen
On Int0 Rc_read
On Timer1 Rc_error

'Timer-Freigabe
Enable Timer1
Stop Timer1

'PWM-Timer
Enable Timer2
Timer2 = 0
Start Timer2

'Freigabe der Interrupt-Routinen
Enable Int0
Enable Interrupts

Cls
Lcd "Timerwert:"

'Den Cursor ausschalten
Cursor Off


'================================================= =====
'Hauptprogramm-Schleife
'================================================= =====

Do

'LED an bei Fehler (Timer-Überlauf)
Portc.2 = Not Error

'Den Timerwert ausgeben
Locate 1 , 12
Lcd Rc_value ; " "

'Erzeugung des PWM-Signals
Ocr2 = Rc_value

Loop



End

'================================================= =====
'ISR für INT0 - R/C-Kanal lesen
'================================================= =====
Rc_read:
'Den Timer starten mit steigender Flanke
If Reading = 0 Then
Start Timer1
Reading = 1
Set Portc.0
'Den Timer stoppen mit fallender Flanke
Else
Stop Timer1
Rc_value = Timer1
Timer1 = 0
Reading = 0
End If
'Error-Bit rücksetzen
Error = 0
Return

'================================================= =====
'ISR für Timer1 - Fehlerhandling
'================================================= =====
Rc_error:
'Error-Bit setzen
Error = 1
Reading = 0
Stop Timer1
Rc_value = 0

Return

TobiasBlome
28.06.2008, 13:21
warum nimmst du nicht den Befehl Pulse in???

zb so:



Pulsein Pulsbreite1 , Pind , 5 , 1 'Pulsbreite auslesen (1=High Impuls)
'Knüppel OBEN
If Pulsbreite1 > 200 Then 'wenn Knüppel oben
'dann nicht einschalten...
End If


Tobias