AVR - R1 program - relé vezérlés

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.