Hallo Andi,
hatte erst jetzt Deinen Beitrag entdeckt...
Ein Beispiel kannst Du gerne haben:
Das Programm kommt aus dem Modellbau und wertet die Signale eines Graupner NauticExpert-Moduls aus. Damit werden dann vier Servos in vorgegebene Positionen gefahren.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
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







Zitieren

Lesezeichen