From 72c34b6ba439f32023a1cb8d35ced98832bedd4c Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Fri, 7 Jun 2019 10:34:08 +0200 Subject: [PATCH] =?UTF-8?q?register=20zugriff=20versch=C3=B6nert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- control/examples/register/main.cpp | 29 ++++++++++++++--------------- control/src/drv/b15f.cpp | 8 ++++---- control/src/drv/b15f.h | 9 +++++++-- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/control/examples/register/main.cpp b/control/examples/register/main.cpp index 27a15ba..ec23afc 100644 --- a/control/examples/register/main.cpp +++ b/control/examples/register/main.cpp @@ -5,31 +5,30 @@ const char PLOT_FILE[] = "plot.bin"; -constexpr uint8_t SFR_OFFSET = 0x20; -constexpr uint8_t SFR_DDRB = 0x04; -constexpr uint8_t SFR_WDTCSR = 0x60; -constexpr uint8_t SFR_PORTB = 0x05; - /* * Dieses Beispiel erzeugt einen 300ms langen Impuls an PB0. * */ int main() { - uint8_t DDRB, PORTB; + uint8_t tmp; B15F& drv = B15F::getInstance(); - DDRB = drv.getRegister(SFR_DDRB + SFR_OFFSET); - DDRB |= (1<<0); - drv.setRegister(SFR_DDRB + SFR_OFFSET, DDRB); - PORTB = drv.getRegister(SFR_PORTB + SFR_OFFSET); - PORTB |= (1<<0); - drv.setRegister(SFR_PORTB + SFR_OFFSET, PORTB); + tmp = drv.getRegister(&DDRB); + tmp |= (1<<0); + drv.setRegister(&DDRB, tmp); + + + tmp = drv.getRegister(&PORTB); + tmp |= (1<<0); + drv.setRegister(&PORTB, tmp); + drv.delay_ms(300); - PORTB = drv.getRegister(SFR_PORTB + SFR_OFFSET); - PORTB &= ~(1<<0); - drv.setRegister(SFR_PORTB + SFR_OFFSET, PORTB); + + tmp = drv.getRegister(&PORTB); + tmp &= ~(1<<0); + drv.setRegister(&PORTB, tmp); } diff --git a/control/src/drv/b15f.cpp b/control/src/drv/b15f.cpp index cf44ccc..b07cbbc 100644 --- a/control/src/drv/b15f.cpp +++ b/control/src/drv/b15f.cpp @@ -393,14 +393,14 @@ bool B15F::pwmSetValue(uint8_t value) return aw == MSG_OK; } -bool B15F::setRegister(uint8_t adr, uint8_t val) +bool B15F::setRegister(volatile uint8_t* adr, uint8_t val) { usart.clearInputBuffer(); uint8_t rq[] = { RQ_SET_REG, - adr, + static_cast(reinterpret_cast(adr)), val }; @@ -411,14 +411,14 @@ bool B15F::setRegister(uint8_t adr, uint8_t val) return aw == val; } -uint8_t B15F::getRegister(uint8_t adr) +uint8_t B15F::getRegister(volatile uint8_t* adr) { usart.clearInputBuffer(); uint8_t rq[] = { RQ_GET_REG, - adr + static_cast(reinterpret_cast(adr)) }; usart.transmit(&rq[0], 0, sizeof(rq)); diff --git a/control/src/drv/b15f.h b/control/src/drv/b15f.h index bedca64..3580058 100644 --- a/control/src/drv/b15f.h +++ b/control/src/drv/b15f.h @@ -18,6 +18,11 @@ #include "driverexception.h" #include "timeoutexception.h" +// wichtig für die Register-Zugriffe +#define _AVR_IO_H_ 1 // Erzwinge die Inklusion +#include "/usr/lib/avr/include/avr/sfr_defs.h" +#include "/usr/lib/avr/include/avr/iom1284p.h" + typedef std::function errorhandler_t; @@ -217,14 +222,14 @@ public: * \param val Neuer Wert für das Register * \throws DriverException */ - bool setRegister(uint8_t adr, uint8_t val); + bool setRegister(volatile uint8_t* adr, uint8_t val); /** * Liefert den Wert eines MCU Registers. * \param adr Speicheradresse des Registers * \throws DriverException */ - uint8_t getRegister(uint8_t adr); + uint8_t getRegister(volatile uint8_t* adr); /*************************/