From cb779f21d490ce7011d1884dbb862ade7e62d777 Mon Sep 17 00:00:00 2001 From: IMback Date: Tue, 16 May 2017 10:37:01 +0200 Subject: [PATCH] working pwm --- CMakeLists.txt | 6 +- main.cpp | 178 ++++++++++--------------------------------------- pwm.cpp | 58 +++++++++++++++- pwm.h | 20 +++++- 4 files changed, 115 insertions(+), 147 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 734a107..c3cd2f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,14 +3,14 @@ ## The settings here work for the Arduino Uno, Rev. 3. # Project name -project(cncextension) +project(rgbcontroller) # CMake version cmake_minimum_required(VERSION 2.6) # Options # Adjust to your board -set(MCU "m328p" CACHE STRING "Processor Type") +set(MCU "atmega328p" CACHE STRING "Processor Type") set(CPU_SPEED "16000000" CACHE STRING "Speed of the CPU") set(PORT "/dev/ttyUSB0" CACHE STRING "USB Port") set(PORT_SPEED "57600" CACHE STRING "Serial Port Speed") @@ -19,7 +19,7 @@ set(COMPILE_FLAGS "" CACHE STRING "Additional Compiler Flags") # Set own source files # Simply list all your C / C++ source (not header!) files here -set(SRC_FILES main.cpp serial.cpp WirelessRelay.cpp pwm.cpp encoder.cpp) +set(SRC_FILES main.cpp serial.cpp WirelessRelay.cpp pwm.cpp) # Compiler suite specification set(CMAKE_C_COMPILER /usr/bin/avr-gcc) diff --git a/main.cpp b/main.cpp index 09efe36..41124cd 100644 --- a/main.cpp +++ b/main.cpp @@ -6,172 +6,68 @@ #include "writepin.h" #include "WirelessRelay.h" #include "pwm.h" -#include "encoder.h" -bool serialDispatch(Serial* serial , WirelessRelay* relayOne, WirelessRelay* relayTow, WirelessRelay* relayThree, WirelessRelay* relayFour, Pwm16b* pwm) +bool serialDispatch(Serial* serial , WirelessRelay* relayOne, WirelessRelay* relayTow, WirelessRelay* relayThree, WirelessRelay* relayFour) { if(serial->dataIsWaiting()) { - char buffer[7]; + char buffer[20]; const int length = serial->getString(buffer, 7); - if(length == 4 && buffer[0] == 'S' && buffer[1] == 'T' && buffer[2] == 'A' && buffer[3] == 'T' ) return true; - else if(length == 5) - { - if (buffer[0] == 'C' && buffer[1] == 'H' ) - { - switch(buffer[2]) - { - case '0': - //writePin(&PORTB, PB3, buffer[4] == '1' ? true : false); pin is dead - serial->putString("OK\n"); - break; - case '1': - writePin(&PORTB, PB4, buffer[4] == '1' ? true : false); - serial->putString("OK\n"); - break; - case '2': - writePin(&PORTB, PB5, buffer[4] == '1' ? true : false); - serial->putString("OK\n"); - break; - } - } - else if (buffer[0] == 'W' && buffer[1] == 'R' ) - { - switch(buffer[2]) - { - case '0': - serial->putString("OK\n"); - buffer[4] == '1' ? relayOne->on() : relayOne->off(); - break; - case '1': - serial->putString("OK\n"); - buffer[4] == '1' ? relayTow->on() : relayTow->off(); - break; - case '2': - serial->putString("OK\n"); - buffer[4] == '1' ? relayThree->on() : relayThree->off(); - break; - } - } - else if (buffer[0] == 'O' && buffer[1] == 'P' && buffer[2] == 'T') - { - writePin(&PORTB, PB0, buffer[4] == '1' ? true : false); - serial->putString("OK\n"); - } - } - else if (length == 6 && buffer[0] == 'P' && buffer[1] == 'W' && buffer[2] == 'M') - { - char inNumber[2]; - inNumber[0]=buffer[4]; - inNumber[1]=buffer[5]; - pwm->setDuty(atoi(inNumber)); - serial->putString("OK\n"); - } - else if (length == 6 && buffer[0] == 'L' && buffer[1] == 'E' && buffer[2] == 'D') - { - switch(buffer[3]) - { - case '0': - writePin(&PORTC, PC4, buffer[5] == '1' ? true : false); - serial->putString("OK\n"); - break; - case '1': - writePin(&PORTC, PC5, buffer[5] == '1' ? true : false); - serial->putString("OK\n"); - break; - case '2': - writePin(&PORTD, PD4, buffer[5] == '1' ? true : false); - serial->putString("OK\n"); - break; - } - } } return false; } -void serialOutput(Serial* serial, Encoder* encoder, volatile unsigned char *inPort) -{ - serial->putString("VARS_"); - readPin( inPort, PC1 ) ? serial->putChar('0') : serial->putChar('1'); - readPin( inPort, PC2 ) ? serial->putChar('0') : serial->putChar('1'); - int16_t buffer = encoder->getPosition(); - serial->putString( (char*)&buffer, sizeof(buffer)); - serial->putChar('\n'); -} - int main() { - DDRB = 0b11111111; - DDRD = 0b11111011;//(1 << PD3) | (1 << PD7) | (1 << PD3); - DDRC = 0x00; - PORTC = 0xFF; - - writePin(&PORTD, PD7, false); - bool StepperEnable = false; + DDRB = 0xFF;//= (1 << PB5) | ( 1 << PB1); + DDRD = 0xFF;//= (1 << PD3) | (1 << PD5); + PORTB = 0x00; sei(); Serial serial; - Pwm16b pwm; - pwm.setDuty(0x0000); - pwm.on(); + + /* Pwm16b pwmA; + pwmA.setDuty(10); + pwmA.on();*/ - WirelessRelay relayOne(&PORTD, PD3, 0b1001110000000000); - WirelessRelay relayTow(&PORTD, PD3, 0b1001101000000000); - WirelessRelay relayThree(&PORTD, PD3, 0b1001100100000000); - WirelessRelay relayFour(&PORTD, PD3, 0b1001100010000000); + Pwm8b pwmTc0( &TCCR0A, &TCCR0B, &OCR0A, &OCR0B ); + //pwmB.on(); - Encoder encoder(&PINC, PC3, PC4); + Pwm8b pwmTc2( &TCCR2A, &TCCR2B, &OCR2A, &OCR2B, 0b00000101, false, true ); - serial.putString("CNCextension v1.2 starting\n"); + //pwmTc0.setDutyA(10); + //pwmTc0.setDutyB(10); + pwmTc2.setDutyB(128); + + /* + //fast 8 bit PWM pwm A + TCCR0A|= (1< -class Pwm16b +class Pwm16b //TC1 pwm on PB1 & PB2 { public: Pwm16b(); @@ -13,4 +13,22 @@ public: void on(); }; +class Pwm8b +{ +private: + volatile unsigned char *_timerControlRegisterA; //TCCRxA + volatile unsigned char *_timerControlRegisterB; //TCCRxB + volatile unsigned char *_compareRegisterA; //OCRxA + volatile unsigned char *_compareRegisterB; //OCRxB + uint8_t _speed = 0b00000011; + +public: + Pwm8b( volatile unsigned char *timerControlRegisterA, volatile unsigned char *timerControlRegisterB, volatile unsigned char *compareRegisterA, volatile unsigned char *compareRegisterB, const uint8_t speed = 0b00000011, const bool enableA = true, const bool enableB = true, const uint8_t dutyA = 0, const uint8_t dutyB = 0 ); + ~Pwm8b(); + void setDutyA(const uint8_t duty); + void setDutyB(const uint8_t duty); + void off(); + void on(); +}; + #endif