Hallo Andi,
hatte erst jetzt Deinen Beitrag entdeckt...
Ein Beispiel kannst Du gerne haben:
Code:
'******************************************************
'Projekt: Atmel-Programmierung für Einsteiger
'
'Prozessor: ATMega 8-16
'Bascom-Version: 1.11.8.1
'
'Auswertung für Graupner Nautic Expert Baustein
'Ansteuerung von Servos über Schalterpositionen
'
'Version: 1.0
'
'Hardware:
'R/C-Kanal an D.2 (INT0)
'LED an C.0
'Servos an C.1...C.4
'
'15.01.2007 T. Gietenbruch
'
'******************************************************
'======================================================
'System-Einstellungen
'======================================================
'Definition für Mega 8
$regfile "m8def.dat"
'Angabe der Taktfrequenz (8Mhz)
$crystal = 4000000
'======================================================
'Konfigurationen
'======================================================
'Konfiguration der I/O-Ports´s
Ddrc = 11111111
Ddrd = 11110000
'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 N As Byte
Dim N_old As Byte
Dim Location As Byte
Dim Signals As Byte
Dim Reading As Bit
Dim Rc_value(10) As Word
Dim Error As Bit
Dim Sync_detect As Bit
Dim X As Word
Dim Switch_up As Byte
Dim Switch_dn As Byte
Dim Sync_ok As Bit
Dim Cycle_done As Bit
Dim Switchhold As Byte
Dim Number As Byte
Dim Watchcat As Word
Dim Servowert_1 As Word
Dim Servowert_2 As Word
Dim Servowert_3 As Word
Dim Servowert_4 As Word
'======================================================
'Konstanten
'======================================================
Const Sync_lowlimit = 8000
Const Sync_highlimit = 9000
Const Switch_lowlimit = 4000
Const Switch_highlimit = 7900
Const Servo1_up_pos = 1000
Const Servo1_nt_pos = 1500
Const Servo1_dn_pos = 2000
Const Servo2_up_pos = 1200
Const Servo2_nt_pos = 1300
Const Servo2_dn_pos = 2000
Const Servo3_up_pos = 2000
Const Servo3_nt_pos = 1800
Const Servo3_dn_pos = 1000
Const Servo4_up_pos = 1500
Const Servo4_nt_pos = 2000
Const Servo4_dn_pos = 1000
'======================================================
'Initialisierungen
'======================================================
'Zuweisung der Interrupt-Service-Routinen
On Timer1 Rc_error
On Int0 Rc_read
'Timer-Freigabe
Enable Timer1
Stop Timer1
'Ports initialisieren
Portc = &B11111111
'Freigabe der Interrupt-Routinen
Enable Int0
Enable Interrupts
'======================================================
'Synchronisationsschleife
'======================================================
Syncronize:
Signals = 1
N = 1
Sync_detect = 0
X = 0
'Rücksetzen aller Schaltersignale
For X = 0 To 7
Switch_up.x = 0
Switch_dn.x = 0
Next X
X = 0
'Warten auf ersten Synchronisationswert
While Sync_detect = 0
Wend
N = 2
Sync_detect = 0
'Warten auf zweiten Synchronisationswert
'Begrenzt durch Zählschleife
While X < 5000 And Sync_detect = 0
Incr X
Wend
'Auswertung des Synchronisationsergebnisses
If X < 5000 And Rc_value(1) > Sync_lowlimit And Rc_value(2) > Sync_lowlimit Then
N = 3
Signals = 10
Else
Goto Syncronize
End If
Watchcat = 0
'======================================================
'Hauptprogramm-Schleife
'======================================================
Do
'Auswertung der gelesenen Werte (im Block)
If Cycle_done = 1 And Reading = 0 And Error = 0 Then
Cycle_done = 0
'Überprüfung der Synchronisationssignale
If Rc_value(1) > 8000 And Rc_value(2) > 8000 And Error = 0 Then
Sync_ok = 1
Else
Sync_ok = 0
Goto Syncronize
End If
'Aktualisierung der Schaltersignale
If Sync_ok = 1 Then
For X = 3 To Signals
Number = X - 3
'Schalter nach oben betätigt
If Rc_value(x) > 7000 And Rc_value(x) < 7900 Then
If Switchhold.number = 0 Then
Switchhold.number = 1
Toggle Switch_up.number
End If
'Schalter nach unten betätigt
Elseif Rc_value(x) > 4000 And Rc_value(x) < 5500 Then
If Switchhold.number = 0 Then
Switchhold.number = 1
Toggle Switch_dn.number
End If
'Schalter in Mittelstellung
Else
Switchhold.number = 0
Switch_up.number = 0
Switch_dn.number = 0
End If
Next X
'Zuweisen der Servopositionen
If Switch_up.0 = 1 And Switch_dn.0 = 0 Then
Servowert_1 = Servo1_up_pos
Elseif Switch_up.0 = 0 And Switch_dn.0 = 1 Then
Servowert_1 = Servo1_dn_pos
Else
Servowert_1 = Servo1_nt_pos
End If
If Switch_up.1 = 1 And Switch_dn.1 = 0 Then
Servowert_2 = Servo2_up_pos
Elseif Switch_up.1 = 0 And Switch_dn.1 = 1 Then
Servowert_2 = Servo2_dn_pos
Else
Servowert_2 = Servo2_nt_pos
End If
If Switch_up.2 = 1 And Switch_dn.2 = 0 Then
Servowert_3 = Servo3_up_pos
Elseif Switch_up.2 = 0 And Switch_dn.2 = 1 Then
Servowert_3 = Servo3_dn_pos
Else
Servowert_3 = Servo3_nt_pos
End If
If Switch_up.3 = 1 And Switch_dn.3 = 0 Then
Servowert_4 = Servo4_up_pos
Elseif Switch_up.3 = 0 And Switch_dn.3 = 1 Then
Servowert_4 = Servo4_dn_pos
Else
Servowert_4 = Servo4_nt_pos
End If
End If
End If
'Watchdog
If N = N_old Then
Incr Watchcat
If Watchcat > 5000 Then Goto Syncronize
Else
N_old = N
Watchcat = 0
End If
Loop
'Programmende (nur formal)
End
'======================================================
'ISR für INT0 - Signalfolge lesen
'======================================================
Rc_read:
'Den Timer starten mit steigender Flanke
If Reading = 0 And Pind.2 = 1 Then
Start Timer1
Reading = 1
'Den Timer stoppen mit fallender Flanke
Else
Stop Timer1
Rc_value(n) = Timer1
Timer1 = 0
Reading = 0
'Setzen der Servopositionen
If Sync_ok = 1 Then
Pulseout Portc , 1 , Servowert_1
Pulseout Portc , 2 , Servowert_2
Pulseout Portc , 3 , Servowert_3
Pulseout Portc , 4 , Servowert_4
Else
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
Portc.4 = 0
End If
'Validierung des gelesenen Wertes
If Rc_value(n) < 4000 Or Rc_value(n) > Sync_highlimit Then Goto Rc_error
'Prüfung auf Sync-Signal
If N < 3 And Rc_value(n) > Sync_lowlimit And Rc_value(n) < Sync_highlimit Then
Sync_detect = 1
End If
'...wenn die Synchronisation fertig ist
If Signals > 2 Then
Incr N
End If
If N > Signals Then
N = 1
Cycle_done = 1
End If
'Statusanzeige an C.0
Toggle Portc.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
Return
Das Programm kommt aus dem Modellbau und wertet die Signale eines Graupner NauticExpert-Moduls aus. Damit werden dann vier Servos in vorgegebene Positionen gefahren.
Anwendung ist die Getriebe- und Sperrdifferentilansteuerung eines Allrad-Wedico-Trucks.
Die Hardware wird direkt am Empfänger angeschlossen, die ISR der Signalauswertung (rc_read) nutze ich gleichzeitig zur Aktualisierung der Pulseouts.
"Runterbrechen" auf ein einfaches Beispiel müsstest Du es Dir bitte selbst...
Grüße
Torsten
Lesezeichen