2008-02-14
Ez a program kilóg a sorból, mert nem a már megszokott AVR1 tesztpanelhoz készült. A kapcsolás itt látható: (A kapcsolási rajzon találtam egy hibát, de lusta voltam kijavítani, a SER4 valójában SER5, a panelterv jó. )
Egyik kollégámmal beszélgettem, és elmondta, hogy régi vágya, hogy távolról tudjon otthon különböző dolgokat ki/be kapcsolni. Erre belelkesedtem, és egy este összedobtam neki a kapcsolást, a paneltervet, meg a chip programját. Másnap bevittem, neki a PC-n futó programot kellett volna megírnia, ahhoz állítólag ért. Aztán annyira mégsem érdekelte, hogy valamit neki is csinálnia kellett volna. Na mindegy. Azért lehet, hogy valaki használni tudja. Mivel nem készítettem el, nem 100%, hgy a program kifogástalan, de azért jó esély van rá :). Igy a panelt sem tudtam lefényképezni.
A kapcsolás lényege, hogy PC-hez, vagy bármi máshoz szabványos RS232 (soros) porton keresztűl csatlakozik. A soros porton keresztűl küldött parancsokkal lehet vezérelni. A parancsok .-tal kezdődnek, és ENTER-rel záródnak, pont mint a negyedik programban. Itt csak egyoldalú kommunikáció van, a panel nem tud válaszolni. Tulajdonképpen majdnem ugyan az, mint a negyedik program, egy kicsit változtattam a parancssornak történő karekter átadásban.
/*******************************************************************************
* Author - 3 BYTE MI *
* http://haromb.freeweb.hu *
* Date - 2009.01.13. *
* Chip - Atmel ATtiny2313 *
* Hardware - AVR_R1 panel *
* Compiler - avr-gcc (WinAVR 20080610) 4.3.0 *
* *
* USART kezelesehez IT-t hasznalja. *
* USART-on keresztul az alabbi parancsokat fogadja: *
* *
* A parancsok '.'-tal kezdodnek, es ENTER-re zarodnak. *
* .1B - Relay 1 bekapcsolasa *
* .1K - Relay 1 kikapcsolasa *
* .2B - Relay 2 bekapcsolasa *
* .2K - Relay 2 kikapcsolasa *
* .3B - Relay 3 bekapcsolasa *
* .3K - Relay 3 kikapcsolasa *
* .4B - Relay 4 bekapcsolasa *
* .4K - Relay 4 kikapcsolasa *
* *
********************************************************************************
* PonyProg Configuration and Security Bits - bepipalva: *
* Belso 4MHz-es osszc.: SUT0, CKSEL3, CKSEL2, CKSEL0 *
* *
*******************************************************************************/
#include "attiny2313_3bmi.h"
#include
#include
#ifndef F_CPU
#define F_CPU 4MHz
#endif
#define BAUDRATE 9600
#define CMD_LINE_LENGHT 12 // input buffer hossza
// PORTB bitjei
#define RELAY1 0
#define RELAY2 1
#define RELAY3 2
#define RELAY4 3
//Relay-k vezerlese
#define RELAY1_ON BS( PORTB, RELAY1)
#define RELAY1_OFF BC( PORTB, RELAY1)
#define RELAY2_ON BS( PORTB, RELAY2)
#define RELAY2_OFF BC( PORTB, RELAY2)
#define RELAY3_ON BS( PORTB, RELAY3)
#define RELAY3_OFF BC( PORTB, RELAY3)
#define RELAY4_ON BS( PORTB, RELAY4)
#define RELAY4_OFF BC( PORTB, RELAY4)
void cmd_line( UC);
ISR( USART_RX_vect) // USART megszakitas kezelese
{
cmd_line( UDR); // USART kiolvasasa, atadasa parancs feldolgozonak
}
int main( void)
{
DDRB= 0B00001111; // szukseges labak kimenetre allitasa
UBRRL= ( F_CPU/( BAUDRATE* 16UL))- 1; // USART init
UBRRH= (( F_CPU/( BAUDRATE* 16UL))- 1)>> 8;
UCSRC= ASYNCRON+ BIT_8+ PARITY_NO+ STOPBIT_1;
UCSRB= RX_ENABLE+ IT_RX_ENABLE;
IT_ENABLE;
while( 1); // maga a program hurok
return 0;
}
void cmd_line( UC c) // parancssor feldolgozo
{
static UC buff[ CMD_LINE_LENGHT]; // parancs sor buffer
static UC cbuff= 1; // szamlalo buffer-hez
static UC * pbuff= buff; // mutato buffer-hez, elejere allitas
switch( c) // parancs lezaras jott be?
{
case 10: break; // LF - kihagy, eldob
case 13: // CR - parancs lezaras -> feldolgozas
{
*pbuff= '\0'; // sorveg, string lezarasa
pbuff= buff; // mutato allitasa a buffer elejere
if ( *pbuff == '.') // megvan a parancs eleje, teljes a parancs
{
switch( *++pbuff)
{
case '1':
if ( *++pbuff == 'B') RELAY1_ON;
else RELAY1_OFF;
break;
case '2':
if ( *++pbuff == 'B') RELAY2_ON;
else RELAY2_OFF;
break;
case '3':
if ( *++pbuff == 'B') RELAY3_ON;
else RELAY3_OFF;
break;
case '4':
if ( *++pbuff == 'B') RELAY4_ON;
else RELAY4_OFF;
break;
default:; // imeretlen parancs
}
}
cbuff= 1; // parancs feldolgozasa utan buffer torlese
pbuff= buff;
*pbuff= '\0';
break;
}
default: // nem parancs vege, bejott karakter letarolasa buffer-be
{
if( ( c > 96) && ( c < 123)) c-= 32; // ascii upper - a..z -> A..Z
*pbuff= c;
if( cbuff != CMD_LINE_LENGHT) // limit
{
cbuff++;
pbuff++;
}
}
}
}
Itt a vége, fuss el véle, legytek az én vendégeim, innen letölthetitek a hozzávalókat összecsomagolva.