UART 1200 Baud, 8Bit, 1 Stop, kein Hardware Handshake
Intern läuft der µProzessor auf 16Mhz. / 8 / 50Hz = 40000
FUSES / 8 / WDTON, BROWNOUT 4.3Volt
der Takt wird durch 40.000 geteilt, was einen 50Hz PWM erzeugt.
Dieser passt gut zu Servos
PWM kann von 0 bis 49999 ausgegeben werden.
Servos arbeiten jedoch etwa vom 0.8 Millisekunden bis 2 Millisekunden.
Also ist nur ein PWM von 2000 bis 4000 Sinnvoll.
Nach dem Einschalten wird 3000 ausgegeben…(~etwa Mitte)
Es ist explizit erst der PWM Wert zu stellen und dann mit 3PO
einzuschalten.
Format des Befehls:
PING<13> -à „Pong“
NEU Dazugekommen:
Device <13>
à "Blaue
Box-Servo Lambda/4tel"
PWM1,{WERT} Kanal 1 wird auf WERT gestellt + Carriage Return
PWM2,{WERT} Kanal 2 wird auf WERT gestellt + Carriage ReturGETMODE
<13> à Byterückgabe gu8Mode ,
#define
MODE_PREFIX_ENABLE
0x01
#define
MODE_TX_TRAFFIC
0x02
#define
MODE_SERVOS_ACTIVE
0x04
#define
MODE_SERVOS_POWERFALLBACK 0x08
STAT1 oder Stat2 <13> à gibt gewählte reale PWM
zurück 2000….3000
PF, PO Servos POWER OFF, POWER ONICR,[0..65535] Stellt die Zeit
Basis des Rückstell-Vergleichstimers um. Default 20000.
Jede Textausgabe wird mit einem CarriageReturn ( 13 ) abgeschlossen.
Jeder Input-Befehl wird mit einem CR ( 13 ) akzeptiert.Sinvolle Sequenz:
PO<13> (Power On)
Pwm1,Value [1000..5000]; PO (Power on);
Warten ~1Sekunde;
PF<13> (Power Off)
DEFAULT VOM STARTWEG IST
AutoPower OFF ~1 Sekunde eingestellt
PWM = 3000 = MITTE
Also muss selbst mit PWM1,xxx ~2000 der Servo gestellt weren
//LINKSANSCHLAG pwm1,2000
//RECHTSSANSCHLAG pwm1,4000 23mS
// PWM1,2000 1MS
// PWM1,4000 2MS
/*
PWM werden im 16 Bit Timer mit OCR1A(B erzeugt
*/
// 1200 BAUD
//------------------------------------------------------------------------------
// Programmed by Christof Ermer
//------------------------------------------------------------------------------
libusb0.dll
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=373283
!!!!!!!!!!!!!!
Unter Windows NT,2000,XP,Vista? braucht AVRDUDE einen Treiber
GIVEIO.SYS, um auf die Ports zugreifen zu können.
Du kannst den Treiber durch den Aufruf der Batchdatei
WinAVR\bin\install_giveio.bat installieren.
in PonyProg Häckcen Setzen
Bits in PDF sind umzudrehen
eine 0(PDF) ist ein Häckchen setzen in PonyProg,
eine 1(PDF) ist Kästchen frei,
WDTON = V Watchdog timer oN
//4.3Volt
Bodlevel 2 = X
Bodlevel 1 = V
Bodlevel 0 = V
#define UART_BAUD_RATE 9600
#define F_CPU 16000000
*/
/*
in io.h
#elif defined (__AVR_ATtiny2313__)
#include <avr/iotn2313.h>
*/
//CONSTANT ARRAYs IN .TEXT = ROM ARREA .DATA IST SRAM !!
.BSS SRAM
//const char MCA_VERSION[] PROGMEM = VERSION;
#ifdef TEXT_SERVICE_USE_ENABLED
void CheckOrder(char* pcStr);
void PrintCR(void);
#endif
// GLOBALE VARIABLEN
#ifdef UART_USE_ENABLED
volatile char* gpcRxPars;
static char gcaRxStr[RX_STRMAX + 1]; //+1 for the 0
#endif
#ifdef TEXT_SERVICE_USE_ENABLED
//static char gcaNumStr[NUMMAX + 1]; //+1 for the 0
static char gcaStr[STRMAX + 1]; //+1 for the 0
static COMMAND_TYPE gsCmd;
#endif
static uint32_t gu32_Ticks; // T2 timeCounter,
only NN_Counter for Keypressings
static uint8_t gu8Mode;
#ifdef TIMERxTICK_USED
// ****************************************************************
//volatile SIGNAL(TIMER2_OVF_vect) //oder
SIGNAL--INTERRUPT(SIG_OVERFLOW2) = mit SEI am Anfang
//SIGNAL( TIMER0_OVF_vect ) //oder SIGNAL--INTERRUPT(SIG_OVERFLOW2) =
mit SEI am Anfang
SIGNAL( SIG_WDT_OVERFLOW )
// *******************************************************************
{
sei();
#ifdef UART_USE_ENABLED
UART_TXRX_Check(); //IMMER VORNAHANDEN !! IN ALLEN
LOOPS DIE ZEIT BRAUCHEN
#endif
};
#endif
#ifdef UART_USE_ENABLED
// *******************************************************************
void UART_TXRX_Check(void)
/*
* Get received character from ringbuffer
* uart_getc() returns in the lower byte the received character and
* in the higher byte (bitmask) the last receive error
* UART_NO_DATA is returned when no data is available.
*/
// *******************************************************************
{
uint16_t uiRxUart = uart_getc();//!FETCH ALLWAYS BYTE FROM RX RINGBUFF
INTERRUPT!
if ( !(uiRxUart & UART_NO_DATA) ) //0x0100
{
// * new data available from UART
// * check for Frame or Overrun error
#ifdef UART_ERRORMSG
if( uiRxUart & (UART_FRAME_ERROR |
UART_OVERRUN_ERROR | UART_BUFFER_OVERFLOW) )
{
ResetRxBuff();
uart_init(
UART_BAUD_SELECT(UART_BAUD_RATE, F_CPU) );// !! Init UART interface
// Framing Error detected, i.e no stop bit detected
uart_puts_p(PSTR("UartEr");
uart_putc(13);
};
#endif
//NOW SELCT ACTION FROM ORDER
//Check CR
if(gpcRxPars < (gcaRxStr +
RX_STRMAX)) //ENDANSCHLAG ERREICHT ?
{
switch( (unsigned
char)uiRxUart )
{
case 10: //
order!! from Terminal
{
break;
};
case 13: //
order!! from Terminal
{
#ifdef COMMANDS_ENABLED
CheckOrder(gcaRxStr);
#endif
//uart_init( UART_BAUD_SELECT(UART_BAUD_RATE, F_CPU) );//!! Init UART
interface
ResetRxBuff();
break;
};
default:
//Accumulate
{
//Accumulate
String only to gcaRxStr with uiAAA Parser
*gpcRxPars++ = (unsigned char)(uiRxUart &
0x0FF);//Append rxByte
*gpcRxPars = 0; //ZERO carry
};
};//switch
}// if (pcRxPars < (gcaRxStr +
RXSTRMAX))
else // To much data Rx, than clear simple all
{
//overflow of RX clears all
ResetRxBuff();
// Clear Rx Parspointer in Buff an terminate RxStr with 0
};//if(gpcRxPars < (gcaRxStr +
RXSTRMAX))
// ENDE DER RX EMPFANGSAUSWERTUNG
};
};
#endif
if( (pStrTok = strtok_r( NULL, gcaStr, &pucStrEnd)) != NULL)//Hole
nun einen Value nach "#3,COMMAND,VALUE
{
gsCmd.uiCmdVal_1 = atol( pStrTok );// Und dann TO
long
};
// *****************************************************
int main(void)
// *****************************************************
{
//static uint16_t uiNN;
//static uint32_t u32Now;
//static uint8_t u8Val;
//static uint16_t u16Val;
//INITS
//The global interrupt flag is maintained in the I bit of the status
register (SREG).
cli();
//Wichtige Schritte.. so bald wie möglich
#ifdef UART_USE_ENABLED
UART_TXRX_Check();
#endif
}; // main END END *************
};
// ******************* MAIN END
********************************************
#ifndef MAIN_HEADER //Prevents multiple includes
#define MAIN_HEADER
/*
Watchdog kann Interrupt
jede menge ADC eingänge
http://www.rn-wissen.de/index.php/Avr-gcc
*/
//TickCounter MUSS SEIN !!!
#define UART_USE_ENABLED
//#define PREFIX_ENABLE
#define COMMANDS_ENABLED
#define TEXT_SERVICE_USE_ENABLED
//#define UART_ERRORMSG
//#define SONDER_TEXT_SERVICE
//#define TIMERxTICK_USED
//#define USE_TOGGLE_FLAG
/*
Jedes Port hat drei Register
DDxN
PORTXn
PINxn
IF PortX ist INPUT an PORTX= set to 1, PullUP IS ENABLED
//sfr |= _BV(bit) --- sfr &= ~(_BV(bit))
*/
/*
Text verbraucht Speicher
Statt Pointer geht evtl auch diese Form
PSTR ( "So geht s auch in den Progspeicher" ); // aber ohne Namen)