Dirk (Diskussion | Beiträge) K (→Bug-Report) |
Dirk (Diskussion | Beiträge) K (→Bug-Report) |
||
Zeile 1.481: | Zeile 1.481: | ||
I2C_Stop(); | I2C_Stop(); | ||
</pre> | </pre> | ||
− | ... 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. | + | ... 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. | 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. | ||
Zeile 1.493: | Zeile 1.495: | ||
I2C_Stop(); | I2C_Stop(); | ||
</pre> | </pre> | ||
− | In der RP6CClib.cbas: | + | In der RP6CClib.cbas sieht das so aus: |
<pre> For i=0 To reg_count-2 | <pre> For i=0 To reg_count-2 | ||
readBuffer(i) = I2C_Read_ACK() | readBuffer(i) = I2C_Read_ACK() |
Version vom 17. Juni 2012, 18:00 Uhr
Inhaltsverzeichnis
- 1 Allgemein
- 2 RP6Loader
- 3 RP6 Base und CONTROL M32
- 4 RP6 CCPRO M128
- 5 Erfahrungsberichte
- 6 Siehe auch
- 7 Weblinks
- 8 Autoren
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 ist 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 |
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
- RP6FlashWriter: Der Opensource RP6 Loader
- RP6Loader für .Net oder CLR Schreiben
- rpyutils 0.1 Loader und Term in Python für Linux
- ...
RP6 Base und CONTROL M32
Der RP6 (191524) und die M32 (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 (hier) heruntergeladen werden.
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 |
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.31beta vom 03.02.2012 könnt ihr hier finden.
RP6RobotBase
Die RP6 Base Library existiert inzwischen in der Version 1.4 vom 29.04.2008. Gegenüber der Version 1.0 vom 10.04.2007 wurden neben Bugfixes auch einige Verbesserungen vorgenommen:
- Power On LED Funktion
- ACS Einstellungen in die RP6Config.h verlagert (um sie ändern zu können)
- Universelle Timer Variable mit 100 us Auflösung
- Anpassung an neuere WinAVR Versionen
Bug-Report
Derich2 hat hier darauf hingewiesen, dass die Stopwatches nicht genau arbeiten. Durch eine kleine Änderung in der Timer 0 Compare ISR (ISR (TIMER0_COMP_vect)) kann man Abhilfe schaffen.
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.1 vom 28.09.2007 (evtl. existiert auch eine Version 1.2 vom 12.09.2008 ??). Von Dirk wurde hier eine Version 1.31beta veröffentlicht mit folgenden Verbesserungen:
- Neue Task ADC
- Funktionen für die freien I/O-Portpins
- Tonfrequenz-Konstanten für den Beeper
Bug-Report
Derich2 hat hier darauf hingewiesen, dass die Stopwatches nicht genau arbeiten. Durch eine kleine Änderung in der Timer 0 Compare ISR (ISR (TIMER0_COMP_vect)) kann man Abhilfe schaffen. Diese Änderung ist ab Version 1.31beta der Library schon berücksichtigt.
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 10.09.2007 die Version 1.1. Gegenüber der Version 1.0 vom 10.04.2007 sind die Empfangsfunktionen jetzt Interrupt-basiert und verfügen über einen Ringpuffer.
Die RP6uart Library ist standardmäßig in die RP6Base und CONTROL M32 Library eingebunden.
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.
Bug-Report
Dieser interessante Thread von RolfD dreht sich um 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.
WinAVR
Die neueste Version von WinAVR kann man 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
- Library:
- LCD Ansteuerung (Demo, Library):
- Servoansteuerung (Grundlagen, Demos, Library):
- Ansteuerung externer I2C-Hardware (Demo):
- Kamera Minimallösung (Demo):
- Kamera-Projekt (Demo):
- Clock (Library):
- DCF77-Decoder/Clock (Library):
- Linienfolger (Demo):
- PC-Verbindung über Bluetooth (Grundlagen):
- PC-Fernsteuerung (Demo):
- RC-Fernsteuerung (Demo):
- IR-Fernsteuerung (Demo):
- IR-Kommunikation (Demo):
- RP6 und BASCOM (Demo):
- RP6 und LabView (Demo):
- Morse-Code senden/empfangen (Demo, Library):
- Verschiedenes:
CONTROL M32
- Library:
- Servoansteuerung (Library):
- Ansteuerung des zweiten SPI-EEPROMs (Library):
- Messgeräte (Demo):
- Kamera-Projekt (Demo):
- TRX433 (CS-8 C, 190045, Library):
- Clock (Library):
- DCF77-Decoder/Clock (Library):
- Spiele (Demo):
- PC-Fernsteuerung (Demo):
- Morse-Code senden/empfangen (Demo, Library):
- Verschiedenes:
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.
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.
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:
For i=0 To reg_count-2 readBuffer(i) = I2C_Read_ACK() Next readBuffer(i) = I2C_Read_NACK()
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 gibt 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
- Stopwatches (Library):
- DCF77-Decoder/Clock (Library):
- Servo-Ansteuerung (Demo):
- PC-Fernsteuerung (Demo):
- Morse-Code senden/empfangen (Demo, Library):
BASIC
- DCF77-Decoder/Clock (Library):
- Servo-Ansteuerung (Demo):
Erfahrungsberichte
... kann gerne ergänzt werden ...
Siehe auch
Weblinks
- HTW Berlin: Robotik-Projekt
- FH-Wiesbaden: Anwendung der Prozessdatenverarbeitung - Home
- FH-Wiesbaden: Anwendung der Prozessdatenverarbeitung - Doku
- FEEIT, Skopje Macedonia: H&S 2011
- Uni Regensburg: Bacholorarbeit "LabView-Fernsteuerungs-Tool mit diversen Routinen"
Autoren
--Sloti 22:23, 29. Dez 2007 (CET)
--Tobias1 18:30, 06. Apr 2010 (CET)
--Dirk 17:03, 13. Jun 2012 (CET)