Aus RN-Wissen.de
Wechseln zu: Navigation, Suche


Der RP6

Allgemein

In diesem Artikel geht es um die Programmierung des RP6, des RP6v2 und ihrer Erweiterungsplatinen RP6 CONTROL M32 und RP6 CCPRO M128.

Zu den Grundlagen des RP6 und des RP6v2 gibt es jeweils eigene Seiten.


RP6Loader

Der RP6Loader und der USB Interface Treiber sind hier zu finden. Der RP6Loader ist ein JAVA-Programm, das den RP6 oder die M32 über deren serielle Schnittstelle mit einem PC verbindet.

Das Programm verfügt über folgende Funktionen:

  • Statusfenster mit RP6-Akku Spannungsanzeige
  • Flash Loader (Programme hochladen und starten, Programmspeicher löschen)
  • HexViewer (Inhalt der HEX-Datei ansehen)
  • Terminal (Zeichen über die serielle Schnittstelle senden/empfangen)
  • Displays (Grafische Hilfen zur Encoder-Einstellung)
  • Log (Protokoll-Datei zur Fehlereingrenzung)

Der RP6Loader kann alle seine Funktionen nur mit dem Bootloader-Programm in der RP6 Base und M32 ausspielen. Entscheidet man sich für die ISP-Programmierung mit Löschen des Bootloaders, bleibt vom Funktionsumfang eigentlich nur das Terminal übrig.

Loader Versionen

Hier eine Tabelle der (mir) bekannten RP6Loader Versionen für die RP6 Base und M32:

ZIP-Datum Version Bemerkungen Examples
03.08.2007 1.1c ab Win2k SP4 (XP, VISTA, W7) ab 07.06.2007
05.09.2007 1.1e - JRE1.5 JRE5, Version für Win98SE/ME
07.09.2007 1.1c wie 03.08.2007 (?)
28.09.2007 1.2 ab 1.2: \n wird gesendet ab 16.10.2007
30.09.2007 1.2 wie 28.09.2007 (?)
17.12.2007 1.4 - BETA ab 1.4: neuer Encodertest neuer Selftest!
23.12.2007 1.4 - BETA spezielle Testversion
28.03.2008 1.4c diese Version gibt's auch für Linux 64bit
12.07.2010 1.5h "RobotLoader", auch für Roboterarme und Caterpillar

Hinweis: Neuere Versionen des RobotLoaders ab Version 2.0 findet ihr hier.

Geeignete Terminals

Der RP6Loader enthält u.a. eine Terminal-Funktion. Stattdessen kann man auch andere Terminals mit besserem Funktionsumfang einsetzen.

HTerm

Dieses Terminal-Programm HTerm wurde von SlyD empfohlen. Die Konfiguration zeigt dieses Bild.

ZOC

radbruch hat hier darauf hingewiesen, dass es ein schönes, sogar farbiges Terminal-Programm ZOC gibt, das man gut anstelle des Terminals im RP6Loader einsetzen kann.

Projekte


RP6 Base und CONTROL M32

Der RP6 (191524), sein Nachfolger RP6v2 (191584) und die RP6 CONTROL M32 Erweiterungsplatine (191550) können frei in C programmiert werden. Dies wird durch die umfangreiche Funktionsbibliothek und die detailliert beschriebene Anleitung auch Anfängern sehr leicht gemacht. Die Software, die zur Programmierung verwendet wird (WinAVR), ist ausschließlich Freeware und kann entweder der CD entnommen oder aus dem Internet heruntergeladen werden.

Dokumentation

Die Dokumentation (Anleitungen, avr-libc Reference Manual, Schaltpläne und Datenblätter) befindet sich hier.

Manuals

Schematics

Datasheets

Demo-Programme

Die RP6 Base und M32 Demo Programme sind hier zu finden.

RP6 Base

Ein Programm für die RP6 Base kann zum Beispiel so aussehen:


#include "RP6RobotBaseLib.h"	

int main(void)
{
	initRobotBase(); // Mikrocontroller initialisieren

	powerON(); // Encoder und Motorstromsensoren anschalten (WICHTIG!!!)

	setLEDs(0b111111); // Alle LEDs anschalten

	moveAtSpeed(100,100); // Beide Motoren fahren mit Geschwindigkeit 100

	while(true)
	{
		task_motionControl(); // Geschwindigkeit einstellen
		task_ADC(); // Wird wegen der Motorstromsensoren aufgerufen
	}
	return 0; 

}

In dem Programm würde der RP6 als erstes alle LEDs anschalten und dann endlos mit Geschwindigkeit 100 geradeaus fahren, ohne Hindernisse zu berücksichtigen.

CONTROL M32

Noch ein Beispiel für die M32:


// Includes:

#include "RP6ControlLib.h" 		// IMMER einbinden!!!


int main(void)
{
	initRP6Control(); // IMMER als ERSTES aufrufen!!!
	initLCD(); // Das LCD starten. Muss IMMER aufgerufen werden, BEVOR das LCD verwendet wird!
	setLEDs(0b1111); // Alle LEDs ein
	mSleep(500); // Eine halbe Sekunde warten
	setLEDs(0b0000); // Alle LEDs aus
	sound(180,80,25); // 2 mal Piepsen
	sound(220,80,0);
	showScreenLCD("################", "################"); // Etwas auf dem Display zeigen
	mSleep(1500); // Warten
	showScreenLCD("<<RP6  Control>>", "<<LC - DISPLAY>>"); //
	mSleep(2500); // Warten
	showScreenLCD("Hello World", "Example Program");
	mSleep(2500); //Warten
	clearLCD(); // Das LCD löschen
		
	while(true) 
	{
	     mSleep(1500); // Ewig warten...
	}
	return 0;
}

Library

Die Library für die RP6 Base und CONTROL M32 besteht aus folgenden 13 Dateien:

Library Datei Funktion
RP6 RP6Config.h RP6 Hardware-Konfiguration
RP6Base RP6RobotBase.h RP6Base Definitionen
RP6Base RP6RobotBaseLib.h RP6Base Library Header
RP6Base RP6RobotBaseLib.c RP6Base Library
CONTROL M32 RP6Control.h CONTROL M32 Definitionen
CONTROL M32 RP6ControlLib.h CONTROL M32 Library Header
CONTROL M32 RP6ControlLib.c CONTROL M32 Library
RP6uart RP6uart.h RS232 Funktionen Header
RP6uart RP6uart.c RS232 Funktionen
RP6I2CmasterTWI RP6I2CmasterTWI.h I2C Master Funktionen Header
RP6I2CmasterTWI RP6I2CmasterTWI.c I2C Master Funktionen
RP6I2CslaveTWI RP6I2CslaveTWI.h I2C Slave Funktionen Header
RP6I2CslaveTWI RP6I2CslaveTWI.c I2C Slave Funktionen

Versionen

Hier eine Tabelle der (mir) bekannten Library Versionen der RP6 Base und M32:

ZIP-Datum VERSION_ RP6 RP6Control RP6LIB_VERSION RP6Config.h BaseLib ControlLib UartLib MasterTWI SlaveTWI
07.06.2007 1.0 1.0 1.0 nein 1.0_16.05.07 1.0_10.04.07 1.0_16.05.07 1.0_10.04.07 1.0_16.05.07 1.0_16.05.07
08.07.2007 1.0 1.0 1.0 nein 1.0_16.05.07 1.0_10.04.07 1.0_16.05.07 1.0_10.04.07 1.0_16.05.07 1.0_16.05.07
31.07.2007 1.1 1.1 1.0 nein 1.1_27.07.07 1.1_27.07.07 1.0_16.05.07 1.0_10.04.07 1.0_16.05.07 1.0_16.05.07
07.08.2007 1.2 1.2_07.08.07 1.0 nein 1.2_07.08.07 1.2_07.08.07 1.0_16.05.07 1.0_10.04.07 1.0_16.05.07 1.0_16.05.07
11.08.2007 1.2 1.2_07.08.07 1.0 nein 1.2_07.08.07 1.2_07.08.07 1.0_16.05.07 1.0_10.04.07 1.0_16.05.07 1.0_16.05.07
28.09.2007 1.3 1.3_25.09.07 1.1 nein 1.2_07.08.07 1.3_25.09.07 1.1 1.1_10.09.07 1.0_16.05.07 1.0_16.05.07
16.10.2007 1.3 1.3_25.09.07 1.1 13 1.2_07.08.07 1.3_25.09.07 1.1 1.1_10.09.07 1.0_16.05.07 1.0_16.05.07
10.05.2008 1.4 1.4_29.04.08 1.1 13 1.2_07.08.07 1.4_29.04.08 1.1 1.1_10.09.07 1.0_16.05.07 1.0_16.05.07
15.09.2008 1.5 1.5_12.09.08 1.2 13 1.2_07.08.07 1.4_29.04.08 1.1 1.1_10.09.07 1.0_16.05.07 1.0_16.05.07
13.03.2010 1.5 1.5_12.09.08 1.3beta 15 1.3beta
03.02.2012 1.5 1.5_12.09.08 1.31beta 15 1.31beta
16.07.2012 1.7 * 1.6_16.07.12 1.3_24.02.12 16 1.2_07.08.07 1.6_2012 (im Kopf: 1.5) 1.3_2012 1.2_16.07.12 1.0_16.05.07 1.0_16.05.07
19.07.2012 1.7 1.6_16.07.12 1.32beta 16 1.32beta
25.07.2012 1.8 1.6_16.07.12 1.3_24.02.12 Base 18, Control 16 1.2_07.08.07 1.8_2012 1.3_2012 1.2_16.07.12 1.0_16.05.07 1.0_16.05.07
25.07.2012 ² 1.8 1.6_16.07.12 1.3_24.02.12 Base 18, Control 16 1.2_07.08.07 1.8_2012 1.3_2012 1.2_16.07.12 1.0_16.05.07 1.0_16.05.07
04.09.2012 1.8 1.6_16.07.12 1.3_24.02.12 Base 18, Control 16 1.1_04.09.12 ³

Zu *: Ab der Version 1.7 sind auch die Libraries und Examples der RP6 M256 WiFi Platine enthalten! Siehe hier!

Zu ²: Die Datei heißt RP6Examples_20120725f.zip. Mir ist nicht bekannt, ob ein Unterschied zur RP6Examples_20120725.zip besteht.

Zu ³: Von JM3 Engineering modifizierte Version auf der "RP6 Robot System Xtra Modules CD-ROM" zum RP6 Sensor Board und zu den Xtra Modulen. Neue Funktion: I2CTWI_readWordRegisters().

In der 1. Spalte findet ihr das Datum der RP6Examples.zip Datei, in der die Library enthalten ist. Die 2. Spalte nennt die Version, die im Dateinamen der VERSION_x.x.txt Datei als x.x vorkommt. In der 3. und 4. Spalte steht die Versionsangabe der RP6Library und RP6ControlLibrary laut Angabe in der VERSION_x.x.txt Datei.

In der 5. Spalte gebe ich den Wert der Konstante RP6LIB_VERSION an. Es gibt sie erst ab den Examples vom 16.10.2007. In den Spalten 6 bis 11 führe ich nacheinander die Versionsnummern und ggf. das in der Datei genannte Datum der Header-Datei/Library an: RP6Config.h, BaseLib, ControlLib, UartLib, MasterTWI, SlaveTWI.

Die jeweils aktuelle Library ist in den Demo-Programmen auf der AREXX Homepage enthalten. Link siehe oben! Die RP6Control Library in der Version 1.32beta vom 19.07.2012 könnt ihr hier finden.

RP6RobotBase

Die RP6 Base Library existiert inzwischen in der Version 1.8 von 2012. Gegenüber der Version 1.4 vom 29.04.2008 wurden diese Verbesserungen vorgenommen:

  • Stopwatch Fehler (10% zu langsam) berichtigt
  • Optionen CHANGE_DIRECTION_FAST, MEDIUM und SLOW eingeführt

Von Maximilian Voss wurde hier eine eigene Version der RP6 Base Library veröffentlicht mit folgenden Änderungen:

  • Compiler Optionen (UART-, Antriebs-, Bumper- und LED-Funktionen können einzeln de-/aktiviert werden)
  • Core Funktionen (Konfiguration, Timer)

Die Library ist unvollständig und scheint nicht weiter entwickelt zu werden.

Von radbruch wurde hier eine minimale RP6 Base Library veröffentlicht mit folgenden Änderungen:

  • Maximale Kürzung der Library
  • Reduktion aller Funktionen auf ein Minimum
Bug-Report
Konfiguration

Die wesentlichen Hardware-Konfigurationen des RP6 sind in der "RP6Config.h" zu finden. Sie enthält Festlegungen zu:

  • Encoder-Auflösung
  • Rotations-Faktor
  • Geschwindigkeits-Messintervall
  • Power On Warnung
  • ACS

Diese Header-Datei wird standardmäßig auch in die RP6RobotBase Library eingebunden.

Port-Verwendung

Die Verwendung der Ports des RP6 Microcontrollers wird festgelegt in der Header-Datei "RP6RobotBase.h". In dieser Datei wird auch noch Folgendes aufgeführt:

  • Quarzfrequenz (F_CPU)
  • True/false Definition
  • Verschiedene Macros
  • Baudrate der seriellen Schnittstelle

Hier eine Tabelle mit den Port-Definitionen für die RP6 Base:

Erklärung der Spalten:
Port        -> Atmel Portpin Bezeichnung
Name        -> Atmel Funktionsbezeichnung
In/Out      -> Eingang (In) oder Ausgang (Out)
Pullup      -> Falls Eingang: Pullup ein- (1) oder ausgeschaltet (0)
Wert        -> Falls Ausgang: Logikpegel high (1) oder low (0)
Funktion    -> Schnittstellenfunktion
Bezeichnung -> Portpin Bezeichnung der Library
Stecker     -> Portpin verfügbar an STECKER: Pin
Anmerkungen -> Kommentare (ADC_xxxxx: ADC-Kanal Bezeichnung)
Port Name In/Out Pullup Wert Funktion Bezeichnung Stecker Anmerkungen
PA0 ADC0 In 0 ADC0 ADC0: 3 ADC_ADC0 (frei)
PA1 ADC1 In 0 ADC1 ADC1: 3 ADC_ADC1 (frei)
PA2 ADC2 In 0 LS_R ADC_LS_R
PA3 ADC3 In 0 LS_L ADC_LS_L
PA4 ADC4 In/(Out) 0 E_INT1 (INT1) XBUS: 8 XBUS INT1
PA5 ADC5 In 0 MCURRENT_R * ADC_MCURRENT_R
PA6 ADC6 In 0 MCURRENT_L * ADC_MCURRENT_L
PA7 ADC7 In 0 UBAT * ADC_BAT
PB0 T0/XCK Out 0 SL6 Status LED 6
PB1 T1 Out 0 SL5 Status LED 5 ***
PB2 AIN0/INT2 In 0 ACS (INT2) IR Empfänger (TSOP)
PB3 AIN1/OC0 Out 0 ACS_PWRH ACS Sendedioden HiPwr
PB4 SS Out 0 PWRON Power On **
PB5 MOSI In 0 ISP START ISP: 1 Start/Stop-Taster
PB6 MISO Out 0 ISP ACS_L ISP: 9 ACS Sendediode links
PB7 SCK Out 0 ISP SL4 ISP: 7 Status LED 4 ***
PC0 SCL In/Out ² 0 I2C-Bus SCL XBUS: 10 XBUS SCL
PC1 SDA In/Out 0 I2C-Bus SDA XBUS: 12 XBUS SDA
PC2 TCK Out 0 JTAG DIR_L * Fahrtrichtung linke Kette
PC3 TMS Out 0 JTAG DIR_R * Fahrtrichtung rechte Kette
PC4 TDO Out 0 JTAG SL1 Status LED 1 ***
PC5 TDI Out 0 JTAG SL2 Status LED 2 ***
PC6 TOSC1 Out 0 SL3 Status LED 3
PC7 TOSC2 Out 0 ACS_R ACS Sendediode rechts
PD0 RXD In 1 RS232 RX PRG/U: 2
PD1 TXD Out 0 RS232 TX PRG/U: 3
PD2 INT0 In 0 ENC_L Radencoder links
PD3 INT1 In 0 ENC_R Radencoder rechts
PD4 OC1B Out 0 MOTOR_L * PWM Motor links
PD5 OC1A Out 0 MOTOR_R * PWM Motor rechts
PD6 ICP Out 0 ACS_PWR ACS Sendedioden Power
PD7 OC2 Out 0 IRCOMM IRCOMM Sendedioden
Zeichen:
*   Standard-Belegung! Über Jumper/Lötbrücke änderbar.
**  Power On für Radencoder, IR-Empfänger *, Stromsensoren *, PWRON-LED *
*** Zusätzlicher Anschluß von Bumpern oder Tastern möglich!
²   I2C-Master: Out, Slave: In
Timer-Nutzung

Die Nutzung der Timer wird in der RP6Base Library in der Funktion initRobotBase() am Ende der Datei RP6RobotBaseLib.c festgelegt.

Timer 0

Timer 0 arbeitet in der RP6Base Library im CTC-Modus (Mode 2) mit einem Vorteiler von 8 und nutzt als TOP-Wert OCR0. Bei einem Wert von 99 für OCR0 errechnet sich ein Zyklus von 100 us bei einer Quarzfrequenz von 8 MHz.

Der Zyklus von 100 us wird genutzt für:

  • Verzögerungen (sleep, mSleep)
  • Stopwatches
  • RC5 Empfang
  • Timer Variable
  • Geschwindigkeits-Messung
  • Weiche PWM-Anpassung und automatische PWM-Abschaltung
  • ACS Timing
  • Blinken der Power On LED
  • Überstrom Zeitmessung
  • Bumper Check Intervall Zeitmessung
  • Selbsttest: Duty cycle Messung
Timer 1

Timer 1 arbeitet im phasenrichtigen (phase correct) PWM-Modus (Mode 10) mit einem Vorteiler von 1 (kein Vorteiler!) und nutzt als TOP-Wert ICR1. Bei einem Maximalwert von 210 für ICR1 errechnet sich eine PWM-Frequenz von ca. 19048 Hz.

Die PWM wird genutzt für:

  • Geschwindigkeitsregelung der Motoren
Timer 2

Der Timer 2 arbeitet im CTC-Modus (Mode 2) mit einem Vorteiler von 1 (kein Vorteiler!) und nutzt als TOP-Wert OCR2. Bei einem Wert von 110 (= 0x6E) für OCR2 errechnet sich eine Frequenz von ca. 72072 Hz.

Die 72 kHz Frequenz wird genutzt für:

  • ACS

RP6Control

Die RP6Control Library gibt es inzwischen in der Version 1.3 vom 24.02.2012. Gegenüber der Version 1.1 (ab 2007) wurde diese Verbesserung vorgenommen:

  • Stopwatch Fehler (10% zu langsam) berichtigt

Von Dirk wurde hier eine Version 1.3beta veröffentlicht mit folgenden Verbesserungen:

  • Neue Task ADC
  • Funktionen für die freien I/O-Portpins
  • Tonfrequenz-Konstanten für den Beeper

Die neueste Version 1.32beta der RP6Control Library vom 19.07.2012 ist kompatibel zur offiziellen Version 1.3.

Von RolfD wurde hier eine neue Version der RP6Control Library veröffentlicht mit folgenden Änderungen:

  • Ursprüngliche Ein-/Ausgabefunktionen durch <stdio> Treiberfunktionen ersetzt
  • "Mantelfunktionen" zur Sicherung der Abwärtskompatibilität
  • ASCII- und Binär-Betriebsart
  • Neue Funktion lcd_generatechar (eigene Zeichen für das LCD definieren)
  • LCD-Ausgabefunktionen der RP6ControlLib_2 (writeLongLCD, writeLongLengthLCD, writeDoubleLCD, writeDoubleExpLCD) hinzugefügt

Die vorgeschlagenen Änderungen der RP6Control Library müssen noch in eine der beiden letzten Versionen der RP6ControlLib (1.32beta oder 1.3) eingefügt werden. Eine Anleitung dazu befindet sich in dem verlinkten Thread.

Bug-Report
Konfiguration

Die wesentlichen Hardware-Konfigurationen des RP6 sind in der "RP6Config.h" zu finden. Sie enthält Festlegungen zu:

  • Encoder-Auflösung
  • Rotations-Faktor
  • Geschwindigkeits-Messintervall
  • Power On Warnung
  • ACS

Diese Header-Datei wird standardmäßig auch in die RP6Control Library eingebunden.

Port-Verwendung

Die Verwendung der Ports des RP6 CONTROL M32 Microcontrollers wird festgelegt in der Header-Datei "RP6Control.h". In dieser Datei wird auch noch Folgendes aufgeführt:

  • Quarzfrequenz (F_CPU)
  • True/false Definition
  • Baudrate der seriellen Schnittstelle

Hier eine Tabelle mit den Port-Definitionen der M32:

Erklärung der Spalten:
Port        -> Atmel Portpin Bezeichnung
Name        -> Atmel Funktionsbezeichnung
In/Out      -> Eingang (In) oder Ausgang (Out)
Pullup      -> Falls Eingang: Pullup ein- (1) oder ausgeschaltet (0)
Wert        -> Falls Ausgang: Logikpegel high (1) oder low (0)
Funktion    -> Schnittstellenfunktion
Bezeichnung -> Portpin Bezeichnung der Library
Stecker     -> Portpin verfügbar an STECKER: Pin
Anmerkungen -> Kommentare (ADC_xxxxx: ADC-Kanal Bezeichnung)
Port Name In/Out Pullup Wert Funktion Bezeichnung Stecker Anmerkungen
PA0 ADC0 In 0 MIC * ADC_MIC
PA1 ADC1 In 0 KEYPAD * ADC_KEYPAD
PA2 ADC2 In 0 ADC2 ADC: 2, ADC2: 3 ADC_2 (frei)
PA3 ADC3 In 0 ADC3 ADC: 1, ADC3: 3 ADC_3 (frei)
PA4 ADC4 In/(Out) 0 ADC4 ADC: 3 ADC_4 (frei)
PA5 ADC5 In 0 ADC5 ADC: 5 ADC_5 (frei)
PA6 ADC6 In 0 ADC6 ADC: 7 ADC_6 (frei)
PA7 ADC7 In 0 ADC7 ADC: 9 ADC_7 (frei)
PB0 T0/XCK Out 1 MEM_CS EEPROM Chip Select
PB1 T1 Out 1 MEM_CS2 EEPROM Chip Select 2 **
PB2 AIN0/INT2 In 1 EINT3 (INT2) * XBUS: 9 XBUS INT3
PB3 AIN1/OC0 Out 0 LCD_RS LCD: 4 LCD RS
PB4 SS Out 0 LCD_EN LCD: 6 LCD EN
PB5 MOSI Out 0 ISP MOSI ISP: 1 EEPROM SI
PB6 MISO In 0 ISP MISO ISP: 9 EEPROM SO
PB7 SCK Out 0 ISP SCK ISP: 7 EEPROM SCK
PC0 SCL In/Out ² 0 I2C-Bus SCL XBUS: 10 XBUS SCL
PC1 SDA In/Out 0 I2C-Bus SDA XBUS: 12 XBUS SDA
PC2 TCK In/Out 1 JTAG IO_PC2 I/O: 7 frei
PC3 TMS In/Out 1 JTAG IO_PC3 I/O: 5 frei
PC4 TDO In/Out 1 JTAG IO_PC4 I/O: 6 frei
PC5 TDI In/Out 1 JTAG IO_PC5 I/O: 3 frei
PC6 TOSC1 In/Out 1 IO_PC6 I/O: 4 frei
PC7 TOSC2 In/Out 1 IO_PC7 I/O: 1 frei
PD0 RXD In 0 RS232 RX PRG/U: 2
PD1 TXD Out 0 RS232 TX PRG/U: 3
PD2 INT0 In 0 EINT1 (INT0) XBUS: 8 XBUS INT1
PD3 INT1 In 0 EINT2 (INT1) * XBUS: 11 XBUS INT2
PD4 OC1B Out 0 STR IC3 STR
PD5 OC1A In/Out 1 IO_PD5 I/O: 9 frei
PD6 ICP In/Out 1 IO_PD6 I/O: 8 frei
PD7 OC2 Out 0 BUZ Beeper
Zeichen:
*   Standard-Belegung! Über Jumper/Lötbrücke änderbar.
**  Frei nutzbar. wenn kein 2. EEPROM (IC5) eingesetzt ist!
²   I2C-Master: Out, Slave: In
Timer-Nutzung

Die Nutzung der Timer wird in der CONTROL M32 Library in der Funktion initRP6Control() am Ende der Datei RP6ControlLib.c festgelegt.

Timer 0

Timer 0 arbeitet in der M32 Library im CTC-Modus (Mode 2) mit einem Vorteiler von 8 und nutzt als TOP-Wert OCR0. Bei einem Wert von 199 für OCR0 errechnet sich ein Zyklus von 100 us bei einer Quarzfrequenz von 16 MHz.

Der Zyklus von 100 us wird genutzt für:

  • Verzögerungen (sleep, mSleep)
  • Stopwatches
  • Timer Variable
  • Sound timing
Timer 1

Timer 1 ist in der M32 Library nicht genutzt und kann beliebig in eigenen Programmen eingesetzt werden.

Timer 2

Der Timer 2 arbeitet im Normal-Modus (Mode 0). Der Wert von OCR2 bestimmt die Frequenz.

Die von Timer 2 erzeugte Frequenz wird genutzt für:

  • Beeper

RP6uart

Diese Library stellt Funktionen für die serielle Kommunikation zur Verfügung. Sie kann auf der RP6 Base und M32 eingesetzt werden. Die aktuelle Version ist seit dem 16.07.2012 die Version 1.2. Gegenüber der Version 1.1 vom 10.09.2007 gibt es folgende Verbesserung:

  • Fehler in der Funktion readChars berichtigt

Die RP6uart Library ist standardmäßig in die RP6Base und CONTROL M32 Library eingebunden.

In diesem Thread entwickelt RolfD die RP6uart Library weiter:

  • Nicht blockierende Sendefunktion mit eigenem Sendepuffer
  • Zeichen 0x00 kann übertragen werden
  • Neue Funktionen serial_sendc() und serial_getc()
  • <stdio> Treiberfunktionen
  • "Mantelfunktionen" zur Sicherung der Abwärtskompatibilität
  • ASCII- und Binär-Betriebsart
  • ASCII Edit mode
  • Xon/Xoff Modus
  • ...

RP6I2Cmaster/slaveTWI

Diese Library (bestehend aus einer Master- und einer Slave-Library) stellt Funktionen für die I2C-Kommunikation zur Verfügung. Die Library, die es in der Version 1.0 unverändert bereits seit dem 16.05.2007 gibt, läßt sich sowohl auf der RP6Base, als auch auf der M32 nutzen. Beide Plattformen können I2C-Master oder -Slave sein.

Eine erweiterte Master-Library (Version 1.1) gibt es mit Datum vom 04.09.2012, veröffentlicht ab Februar 2014 von JM3 Engineering für das RP6 Sensor Board und die Xtra Module. Sie ist abwärts-kompatibel zur Master-Library in der Version 1.0 vom 16.05.2007 und bietet lediglich folgende Erweiterung:

  • Neue Funktion I2CTWI_readWordRegisters() zum Lesen von 16 Bit Registern

Eine neue Master-Library, die die TWI-Funktionen von Peter Fleury's I2C Master Library anstelle der Interrupt-basierten Funktionen der Original-Library von SlyD nutzt, wurde hier veröffentlicht. Sie basiert auf der o.g. erweiterten Master-Library (Version 1.1).

Bug-Report

Dieser interessante Thread von RolfD dreht sich um eventuelle Fehler in dieser Lib und deren Fix.

Ergänzung

Hier findet sich eine (evtl. noch nicht fehlerfreie) Veränderung der RP6I2Cmaster Library, um mit ihr den berührungslosen Temperatursensor MLX90614 anzusteuern. Die Änderungen ermöglichen einen Repeated Start zwischen dem Senden der I2C- und RAM-Adresse und dem Lesen der Sensor-Werte. Die Original-Library sendet an dieser Stelle ein Stop.

RP6 I2C-Adressen

Definierte I2C-Adressen des RP6-Systems:

Definition (RP6 Sensor Board: Demo-Software) I2C-
Adresse
Alternative I2C-Adressen Verwendung
I2C_RP6_BASE_ADR 10 RP6v2 Base: I2C-Slave
I2C_RP6_M32_ADR 12 * RP6 CONTROL M32: I2C-Slave
I2C_RP6_M128_ADR 14 * RP6 CCPRO M128: I2C-Slave
I2C_RP6_M256_ADR 16 * RP6 M256 WiFi: I2C-Slave
TCN75_ADR 0x90 ² 0x92, 0x98, 0x9a M128: TCN75 Temperatursensor
24LCXXX_ADR 0xa0 0xa2, 0xa4, 0xa6 M128: 24LCxxx EEPROM
PCF8574_8LEDS_ADR 0x70 RP6Base_I2CMaster_01 Example: PCF8574 **
PCF8591_4LDRS_ADR 0x90 ² RP6Base_I2CMaster_02 Example: PCF8591 **
SRF_ADR 0xe6 0xe0 (Standard) RP6Base_I2CMaster_03 Example: SRF08/SRF10 **
SRF_LEFT_ADR 0xe6 RP6Base_I2CMaster_04 Example: SRF08/SRF10 **
SRF_RIGHT_ADR 0xe8 RP6Base_I2CMaster_04 Example: SRF08/SRF10 **
I2C_SENSOR_LSM303DLHC_A_ADR (ACCELEROMETER) 0x32 ² RP6 Sensor Board: LSM303DLHC Accelerometer
I2C_SENSOR_LSM303DLHC_M_ADR (MAGNETOMETER) 0x3c RP6 Sensor Board: LSM303DLHC Magnetometer
I2C_SENSOR_PORTEXP_ADR (IOEXP1) 0x40 RP6 Sensor Board: MAX7311 I/O Port Expander
I2C_SENSOR_SERVO_ADR (PWMDRIVER) 0x88 RP6 Sensor Board: PCA9685 Servo Controller
I2C_SENSOR_LEDDRIVER_ADR (LEDDRIVER) 0x8a RP6 Sensor Board: TCA6507 LED Controller
I2C_SENSOR_TEMP_ADR (TEMPSENSOR) 0x90 ² RP6 Sensor Board: LM75B Temperatursensor
I2C_SENSOR_RTC_ADR (RTCLOCK) 0xd0 ² RP6 Sensor Board: DS1339 RTC
I2C_GPS_RECEIVER_ADR (GPS) 0xc8 0xca, 0xcc, 0xce, 0xd0 ², 0xd2,
0xd4, 0xd6, 0xd8, 0xda, 0xdc,
0xde
RP6 I2C GPS Receiver
I2C_ACCSENS_ADR (ADR_ACC_MODULE) 0x30 0x32 ² RP6 3D Accelerometer Modul
I2C_BHT_B_ADR (BAROMETER) 0xee RP6 BHT Modul: MS5607-02BA Pressure Sensor
I2C_BHT_HT_ADR (HYGROMETER) 0x80 RP6 BHT Modul: HTU21D Humidity Sensor

Zu *) Adresse nicht festgelegt. Empfehlung!

Zu **) Hardware nicht im RP6-System vorhanden.

Zu ²) Adress-Konflikt möglich!

WinAVR

Die neueste Version von WinAVR kann man hier oder hier herunterladen. WinAVR ist eine fertige Windows-Einrichtung eines Editors (Programmer's Notepad 2) und eines C-Compilers für Atmel AVR-Microcontroller (AVR-GCC).

Zu empfehlen ist ein Blick in folgende Anleitungen, die in der WinAVR-Installation enthalten sind:

  • WinAVR-user-manual.html (Benutzer-Handbuch im Stammverzeichnis)
  • pn2.chm (PN2 Hilfe-Datei im Unterverzeichnis \pn\help)

Programmer's Notepad 2

Programmer's Notepad 2 (PN2) ist der Editor von WinAVR, mit dem man Programme schreibt.

GCC

GCC ist eine Sammlung von Compilern, die auch eine C-Variante enthält (AVR-GCC), die für die Programmierung von AVR-Microcontrollern eingesetzt wird. In AVR-GCC wird auch der RP6 programmiert. In seiner Anleitung gibt es einen "C - Crashkurs" (Kapitel 4.4.).

Zusätzlich ist u.a. in der WinAVR-Installation folgende Referenz zu allen Definitionen und Funktionen der AVR-GCC-Libraries enthalten:

  • avr-libc-user-manual.pdf (Handbuch im Unterverzeichnis \doc\avr-libc)

Es gibt gute Tutorials, um die Sprache zu lernen:

Darüber hinaus gibt es natürlich auch Bücher:

Projekte

Ohne Anspruch auf Vollständigkeit habe ich hier Links zu wichtigen Software-Projekten für die RP6Base und die M32 aufgelistet. Wichtig war mir dabei, dass es sich um direkt nutzbare und vollständige Programme oder Libraries handelt.

... kann gern ergänzt werden ...

RP6 Base

CONTROL M32



RP6 CCPRO M128

Die RP6 CCPRO M128 Erweiterungsplatine (191563) hat zunächst keinen Microcontroller an Bord. Man muß daher das C-Control PRO MEGA128 Modul (198219) mit bestellen. Es gehört zum C-Control PRO System von CONRAD und enthält einen ATmega128 Microcontroller. Das CCPRO MEGA128 Modul wird in CompactC oder BASIC programmiert. Die Programme werden als Byte-Code von der IDE in das Modul geladen und dort von einem Byte-Code-Interpreter ausgeführt.

Dokumentation

Die Dokumentation (Anleitung, Schaltplan, Datenblätter) befindet sich hier.

Manuals

Schematics

Datasheets

Demo-Programme

Die RP6 CCPRO M128 Demo Programme sind hier zu finden.

CompactC

Hier ein Beispiel in CompactC:


// WICHTIG: Immer die RP6CCLib mit einbinden:
#include "../../RP6CCLib/RP6CCLib.cc"

void main(void)
{
    // WICHTIG! Immer als erstes aufrufen:
	RP6_CCPRO_Init(); // Auf Startsignal warten, LCD und andere Dinge initialisieren !

    // ------------------------------------------------------

    // Zwei Zeilen Text mit dem LCD anzeigen:
    showScreenLCD("RP6 CCPRO M128", "Hello World!");

    // Zweimal piepsen:
    beep(200,300,100);   // Format: beep (<tonhöhe>, <dauer>, <pause>)
    beep(100,100,100);

    // 2 Sekunden Pause:
    AbsDelay(2000);

    // Untere Zeile im LCD löschen:
    clearPosLCD(1,0,16);


    // ------------------------------------------------------
    // Lauflicht:
    byte runLight, dir;   // Variablen deklarieren
    runLight = 1;  // Lauflicht Variable
    dir = 0;       // Laufrichtung des Lauflichtes
    while(true)
    {
		// LEDs setzen:
		setLEDs(runLight);

        // Laufrichtung wechseln wenn die äusseren LEDs erreicht wurden:
		if(runLight >= 16) {
            dir = 1;
            // Laufrichtung im LCD anzeigen:
            setCursorPosLCD(1,4);
            printLCD("<<<<----");
        }
		else if (runLight <= 1) {
			dir = 0;
            // Laufrichtung im LCD anzeigen:
            setCursorPosLCD(1,4);
            printLCD("---->>>>");
        }

		// LED Bit weiter "shiften" - nach links oder rechts, je nach Richtung:
		if(dir == 0)
			runLight = runLight << 1;
		else
			runLight = runLight >> 1;

        // 150ms Pause:
        AbsDelay(150);
    }
}

BASIC

Hier das selbe Beispiel in BASIC:


' WICHTIG: Immer die RP6CCLib mit einbinden:
#include "../../RP6CCLib/RP6CCLib.cbas"

Sub main()
    Dim runLight, dir As Byte  ' Variablen deklarieren

    ' WICHTIG! Immer als erstes aufrufen:
	RP6_CCPRO_Init()  ' Auf Startsignal warten, LCD und andere Dinge initialisieren!

    ' ------------------------------------------------------

    ' Zwei Zeilen Text mit dem LCD anzeigen:
    showScreenLCD("RP6 CCPRO M128", "Hello World!")

    ' Zweimal piepsen:
    beep(200,300,100)   ' Format: beep (<tonhöhe>, <dauer>, <pause>)
    beep(100,100,100)

    ' 2 Sekunde Pause:
    AbsDelay(2000)

    ' Untere Zeile im LCD löschen:
    clearPosLCD(1,0,16)


    ' ------------------------------------------------------
    ' Lauflicht:

    runLight = 1  ' Lauflicht Variable
    dir = 0       ' Laufrichtung des Lauflichtes
    Do While True
        setLEDs(runLight)  ' LEDs setzen

        ' Laufrichtung wechseln wenn die äusseren LEDs erreicht wurden:
		If runLight >= 16 Then
            dir = 1
            ' Laufrichtung im LCD anzeigen:
            setCursorPosLCD(1,4)
            printLCD("<<<<----")
		Else
            If runLight <= 1 Then
              dir = 0
              ' Laufrichtung im LCD anzeigen:
              setCursorPosLCD(1,4)
              printLCD("---->>>>")
            End If
        End If

		' LED Bit weiter "shiften" - nach links oder rechts, je nach Richtung:
		If dir = 0 Then
			runLight = runLight << 1
		Else
			runLight = runLight >> 1
        End If

        AbsDelay(150)  ' 150ms Pause
    End While
End Sub

Library

Die RP6 CCPRO M128 Library besteht aus den beiden Dateien RP6CClib.cc (CompactC) und RP6CClib.cbas (BASIC). Ihr Inhalt ist identisch.

Versionen

Hier eine Tabelle der (mir) bekannten Library Versionen der CCPRO M128:

ZIP-Datum Version Version CompactC Version BASIC Bemerkungen
22.10.2008 1.0 1.0_16.10.08 1.0_07.10.08
31.01.2009 1.0 1.0_16.10.08 1.0_07.10.08 wie 22.10.2008 (?)

Bug-Report

Die Funktion void RP6_readRegisters(byte adr, byte start_reg, byte readBuffer[], byte reg_count) der RP6CClib liest "reg_count" Register des Controllers auf dem RP6 Mainboard über den I2C-Bus.

In diesem Teil:

    I2C_Start();
    I2C_Write(adr+1);
    byte i;
    for(i=0;i<reg_count;i++)
        readBuffer[i] = (I2C_Read_ACK());
    readBuffer[i+1] = (I2C_Read_NACK());
    I2C_Stop();

... werden die Register eingelesen.

Ist reg_count z.B. 10 (10 Register sollen gelesen werden), werden mit I2C_Read_ACK() die Register in readBuffer[0] bis readBuffer[9] abgelegt. Danach wird mit I2C_Read_NACK() noch das 11. Register in readBuffer[11] abgelegt. readBuffer[10] bleibt unberührt. Damit funktioniert diese Funktion zwar (d.h. in readBuffer[0..9] sind die gewünschten 10 Register vorhanden), aber es findet ein unnötiger Lesezyklus zusätzlich statt.

Man kann die RP6CClib.cc so anpassen:

    I2C_Start();
    I2C_Write(adr+1);
    byte i;
    for(i=0;i<(reg_count-1);i++)
        readBuffer[i] = (I2C_Read_ACK());
    readBuffer[i] = (I2C_Read_NACK());
    I2C_Stop();

In der RP6CClib.cbas sieht das so aus:

    I2C_Start()
    I2C_Write(adr+1)
    For i=0 To reg_count-2
        readBuffer(i) = I2C_Read_ACK()
    Next
    readBuffer(i) = I2C_Read_NACK()
    I2C_Stop()

Konfiguration

Die wesentlichen Hardware-Konfigurationen des RP6 finden sich am Anfang der M128 Library (RP6CClib). Dort steht eine Festlegung zur:

  • Encoder-Auflösung

Port-Verwendung

Am Anfang der M128 Library (RP6CClib) werden Bezeichnungen für einige Portpins der RP6 CCPRO M128 definiert, siehe Abschnitt "C-Control Standard Port Konfiguration auf dem RP6 CCPRO M128 Modul". Diese Bezeichnungen kann man anstelle der Port-Bit Nummern verwenden, um das Programm selbsterklärender zu machen. Weitere Definitionen am Anfang der M128 Library:

  • Port On/Port Off
  • LF, CR, SPACE
  • LED1..LED6

Die Festlegungen zur Verwendung der Ports des RP6 CCPRO M128 Microcontrollers finden sich am Ende der M128 Library in der Funktion RP6_CCPRO_Init(). Dort wird auch noch Folgendes gemacht:

  • SPI initialisieren
  • Schieberegister zurücksetzen
  • Serielle Schnittstelle initialisieren
  • I2C Modul initialisieren
  • LCD initialisieren

Hier eine Tabelle mit den Port-Definitionen der M128:

Erklärung der Spalten:
Port        -> Atmel Portpin Bezeichnung
Name        -> Atmel Funktionsbezeichnung
In/Out      -> Eingang (In) oder Ausgang (Out)
Pullup      -> Falls Eingang: Pullup ein- (1) oder ausgeschaltet (0)
Wert        -> Falls Ausgang: Logikpegel high (1) oder low (0)
Port-Bit    -> CCPRO Port-Bit Nummer (0..52) 
Bezeichnung -> Portpin Bezeichnung der Library
Stecker     -> Portpin verfügbar an STECKER: Pin
Anmerkungen -> Kommentare
Port Name In/Out Pullup Wert Port-Bit Bezeichnung Stecker Anmerkungen
PA0 AD0 0 AD0 * PORTA: 2 IC2/3 AD0
PA1 AD1 1 AD1 * PORTA: 1 IC2/3 AD1
PA2 AD2 2 AD2 * PORTA: 3 IC2/3 AD2
PA3 AD3 3 AD3 * PORTA: 4 IC2/3 AD3
PA4 AD4 4 AD4 * PORTA: 5 IC2/3 AD4
PA5 AD5 5 AD5 * PORTA: 7 IC2/3 AD5
PA6 AD6 6 AD6 * PORTA: 6 IC2/3 AD6
PA7 AD7 7 AD7 * PORTA: 8 IC2/3 AD7
PB0 SS In ** 8 PORT_SS SPI_I/O: 5 frei
PB1 SCK Out 1 9 PORT_SCK SPI_I/O: 6 IC4 CLK
PB2 MOSI Out 1 10 PORT_MOSI SPI_I/O: 3 IC4 D
PB3 MISO In 11 PORT_MISO SPI_I/O: 4 frei
PB4 OC0 12 PB4 SPI_I/O: 2 frei
PB5 OC1A 13 PB5 I/O: 1 SERVO: 1, frei
PB6 OC1B 14 PB6 I/O: 3 SERVO: 2, frei
PB7 OC2/OC1C 15 PB7 SPI_I/O: 1 SERVO: 3, frei
PC0 A8 16 A8 * PORTC: 1 IC3 A8
PC1 A9 17 A9 * PORTC: 2 IC3 A9
PC2 A10 18 A10 * PORTC: 3 IC3 A10
PC3 A11 19 A11 * PORTC: 4 IC3 A11
PC4 A12 20 A12 * PORTC: 5 IC3 A12
PC5 A13 21 A13 * PORTC: 6 IC3 A13
PC6 A14 22 A14 * PORTC: 7 IC3 A14
PC7 A15 23 A15 * PORTC: 8 IC3 A15
PD0 SCL/INT0 In 24 PORT_SCL XBUS: 10 XBUS SCL
PD1 SDA/INT1 In 0 25 PORT_SDA XBUS: 12 XBUS SDA
PD2 RXD1/INT2 26 PORT_RXD1 I/O: 8 RX 1, frei
PD3 TXD1/INT3 27 PORT_TXD1 I/O: 7 TX 1, frei
PD4 ICP1 28 PD4 (A16) * I/O: 6 frei (IC3 A16)
PD5 XCK1 Out 0 29 PORT_LCD_EN LCD: 6 LCD EN
PD6 T1 30 PD6 I/O: 4 frei
PD7 T2 31 PD7 I/O: 2 frei
PE0 RXD0/PDI 32 PORT_RXD0 PRG/U: 2 RX 0
PE1 TXD0/PDO 33 PORT_TXD0 PRG/U: 3 TX 0
PE2 XCK0/AIN0 Out 0 34 PORT_STR IC4 STR
PE3 OC3A/AIN1 Out 0 35 PORT_SND * I/O: 5 Beeper
PE4 OC3B/INT4 In ** 36 PORT_START PRG/U: 4 ² START_BOOT Taster
PE5 OC3C/INT5 In 37 PORT_PE5_INT * SPI_I/O: 7, XBUS: 8 XBUS INT1
PE6 T3/INT6 In 38 PORT_PE6_INT * XBUS: 9 XBUS INT3
PE7 ICP3/INT7 39 PE7 (EXT-DATA) SPI_I/O: 8 frei
PF0 ADC0 40 ADC0 ADC: 4 frei
PF1 ADC1 41 ADC1 ADC: 1 frei
PF2 ADC2 42 ADC2 ADC: 6 frei
PF3 ADC3 43 ADC3 ADC: 3 frei
PF4 ADC4/TCK 44 ADC4 ADC: 8 YADC4, frei
PF5 ADC5/TMS 45 ADC5 ADC: 5 frei
PF6 ADC6/TDO 46 ADC6 ADC: 7 YADC6, frei
PF7 ADC7/TDI 47 ADC7 ADC: 2 frei
PG0 WR 48 WE IC3 WE/
PG1 RD 49 OE IC3 OE/
PG2 ALE 50 ALE IC2 C
PG3 TOSC2 Out 0 51 PORT_LED1 * JP: YL1 Status LED1
PG4 TOSC1 Out 0 52 PORT_LED2 * JP: YL3 Status LED2
Zeichen:
*    Standard-Belegung! Über Jumper/Lötbrücke änderbar.
**   Pullup-Widerstand 100 kOhm!
²    Über Serienwiderstand 470 Ohm

Timer-Nutzung

Die Nutzung der Timer wird in der M128 Library in der Funktion RP6_CCPRO_Init() am Ende der Datei RP6CClib.cc oder RP6CClib.cbas festgelegt. Dort steht jedoch nur der Hinweis auf die Nutzung von Timer 3 für den Piezo Tongeber.

Timer 0

Frei für die eigene Nutzung.

Timer 1

Frei für die eigene Nutzung.

Timer 2

Interne CCPRO Zeitbasis (10ms Tick), z.B. für die Clock Funktion und die Thread-Ablaufsteuerung. Timer 2 kann vom eigenen Programm nicht anders konfiguriert werden, man kann aber den 10ms Tick im eigenen Programm nutzen.

Timer 3

Timer 3 wird in der Library für den Piezo Tongeber verwendet. Nutzt man die Funktionen beep(), beep_t() und die Macros sound(), sound_off() und tone() NICHT, kann man Timer 3 auch anders konfigurieren und nutzen.

C-Control PRO

C-Control PRO (CCPRO) ist eine Hardware- und Programmierumgebung von CONRAD. Sie ist angepaßt an die CCPRO Module MEGA32 und MEGA128. Das CCPRO MEGA128 Modul arbeitet auch auf der RP6 CCPRO M128 Erweiterungsplatine.

IDE

Die neueste Version der CCPRO-IDE und das CCPRO-Handbuch sind hier zu finden.

Um die Programmierung des C-Control PRO MEGA128 Moduls kennenzulernen, kann man sich auch die Demo-Programme ansehen. Achtung: Sie laufen nicht ohne Änderungen auf der RP6 CCPRO M128 Erweiterungsplatine!

Projekte

Derzeit gibt es nur ein interessantes Projekt als "Alternative" für die CCPRO IDE.

... kann gern ergänzt werden ...

CCPro-Loader

Hier gab es den CCPro-Loader. Mit diesem Programm von messier kann man HEX-Dateien, die man mit anderen Programmiersprachen erstellt hat, in das C-Control PRO MEGA128 Modul laden, ohne den Bootloader zu zerstören. Das eröffnet die Möglichkeit, das Modul nicht nur in CompactC oder BASIC (d.h. in Bytecode-Interpreter Sprachen) zu programmieren, sondern auch z.B. mit GCC oder BASCOM.

Projekte

Ohne Anspruch auf Vollständigkeit habe ich hier Links zu wichtigen Software-Projekten für die RP6 CCPRO M128 aufgelistet. Wichtig war mir dabei, dass es sich um direkt nutzbare und vollständige Programme oder Libraries handelt.

... kann gern ergänzt werden ...

CompactC

BASIC


Erfahrungsberichte

... kann gerne ergänzt werden ...


Siehe auch


Weblinks


Einzelne Projekte


Schule, Lehre und Ausbildung


Autoren

--sloti 22:23, 29. Dez 2007 (CET)

--Tobias1 18:30, 6. Apr 2010 (CET)

--Dirk 19:22, 09. Sep 2015 (CET)