Jump to content
Schiffsmodell.net

Programm 3: R/C-Kanal einlesen


Torsten

Recommended Posts

Hallo Leute,

 

mit diesem Programm möchte ich euch zeigen, wie man einen R/C-Kanal mittels Hardware-Interrupt in den Prozessor einlesen kann.

 

Mit Interrupts hatten wir ja schon bei unserem Programm 2 kurz zu tun, wo ein Timer bei Überlauf ein Unterprogramm aufgerufen hat. Dies nutzen wir auch in diesem Programm für die Fehlerauswertung.

Außerdem besteht aber auch die Möglichkeit, über ein Signal-Ereignis an bestimmten Prozessor-Pins einen Interrupt auszulösen. Dafür sind die Pins D.2 = INT0 (Stecker RC2 auf dem Adapterboard) und D.3 = INT1 (Stecker RC1 auf dem Adapterboard) vorgesehen, und so wollen wir auch den R/C-Kanal einlesen.

 

Man sollte wissen, dass ein R/C-Signal vom Empfänger standardmäßig zwischen 1 und 2ms lang ist (1ms = Minimum, 1,5ms = Neutral, 2ms = Maximum) und alle 20ms - also mit 50Hz - wiederholt wird.

 

Im Prinzip arbeitet das Programm wie eine Stoppuhr: bei steigender Flanke am INT0 wird der Timer gestartet und mit der fallenden Flanke wieder gestoppt.

 

Auf dem LCD-Display kann man den aktuell gemessenen Timerwert sehen.

 

Der Empfänger kann direkt über den Stecker RC2 auf dem Adapterboard mit versorgt werden, man braucht also keinen separaten Empfängerakku.

 

Wichtig:

Für dieses Programm muss die Taktfrequenz des Prozessors auf 8MHz gesetzt werden, was über die Bits CKSEL 0..3 passiert. Achtet drauf, euch den Prozessor nicht zu verbiegen... ;)

 

attachment.php?attachmentid=15102

 

Wie gehabt, erkläre ich die neuen Befehle weiter unten.

 

Viel Spaß beim Ausprobieren!

 

Torsten

 

'******************************************************
'
' (c)2012 SCHIFFSMODELL.NET
'
'******************************************************
'Projekt: Atmel-Programmierung für Einsteiger
'
'Prozessor: ATMega 16
'Bascom-Version: 2.0.7.5
'
'Programm 4: R/C_Kanal einlesen
'
'Hardware:
'Pollin Evaluation Board
'!!! Jumper 3 (Taster 1) muss getrennt sein !!!
'LCD-Display 20x2
'R/C-Kanal an D.2 (INT0)
'
'
'
'
'26.12.2012 T. Gietenbruch
'
'******************************************************
'
'======================================================
'System-Einstellungen
'======================================================
'Definition für Mega 16
$regfile "m16def.dat"

'Angabe der Taktfrequenz (8Mhz)
$crystal = 8000000

'======================================================
'Konfigurationen
'======================================================

'Konfiguration der I/O-Ports´s
'Ein- und Ausgänge festlegen
Config Portd.2 = Input
Config Portd.3 = Input
Config Portd.4 = Input
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output

'LCD Konfiguration
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.0
Config Lcd = 20 * 2

'Konfiguration des Timer 1
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

'======================================================
'ALIAS-Zuweisungen und Konstanten
'======================================================

'Signale
Rc_in Alias Pind.2
Taster_2 Alias Pind.3
Taster_3 Alias Pind.4

Led_1 Alias Portd.5
Led_2 Alias Portd.6
Hupe Alias Portd.7


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

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

'Timer 1 scharfmachen
Enable Timer1
Stop Timer1

'Freigabe der Interrupt-Routine für PIND.2 (INT0)
Enable Int0


'...und generell die Interrupts aktivieren
Enable Interrupts



'======================================================
'Aufbau der LCD-Maske
'======================================================

'Das Display löschen
Cls
'Text der ersten Zeile (max. 20 Zeichen!)
Locate 1 , 1
Lcd "**** R/C-KANAL *****"

'Den Cursor ausschalten
Cursor Off

Locate 2 , 1
Lcd "Timerwert:"


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

Do

'LED an bei Fehler (Timer-Überlauf)
Led_1 = Error

If Error = 0 Then
  Toggle Led_2
Else
  Led_2 = 0
End If

'-------------------------------------------
'LCD-Display-Ausgabe
'-------------------------------------------

'LCD-Ausgabe während der langen Lesepause...
If Reading = 0 Then

'Den Timerwert aufs Display zaubern
  Locate 2 , 12
  Lcd Rc_value ; "   "
End If

Loop

'Programmende (nur formal)
End

'======================================================
'ISR für INT0 - R/C-Kanal lesen
'======================================================
Rc_read:
'Den Timer starten mit steigender Flanke
If Reading = 0 And Rc_in = 1 Then
  Start Timer1
  Reading = 1
'Den Timer stoppen mit fallender Flanke
Else
  Stop Timer1
  Rc_value = Timer1
  Timer1 = 0
  Reading = 0

  'Error-Bit rücksetzen
  Error = 0
End If

Return


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

Return

 

Config Lcdpin

Die Konfiguration des Displays ist veränderbar, im Prinzip kann es an beliebigen Ports des Prozessors betrieben werden.

 

Config Lcd = Zeichen * Zeilen

Angabe der Display-Größe.

 

Config Int0 = Change

Der Interrupt 0 wird bei jedem Flankenwechsel ausgeführt. =Falling bzw. = Rising würden nur auf die fallende bzw. steigende Flanke des Signals schauen.

 

Locate Zeile , Zeichen

Der Locate-Befehl setzt den Cursor an die angegebene Stelle des Displays.

 

Lcd Rc_value ; " "

Mit dem Lcd-Befehl wird eine Textausgabe ab der aktuellen Cursor-Position auf dem Display vorgenommen. Das Semikolon trennt verschiedene Text-Teile, in diesem Fall wird der Wert der Variable "Rc-value" gefolgt von drei Leerzeichen ausgegeben.

Fuses.jpg

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.