Цитата(yung @ Jun 14 2005, 10:49)
И еще одна мысль. Чем заниматься длительными рассуждениями, дай четкую постановку - чего хочешь. Если только того, что написал, то укажи параметры UART - скорость, число бит, сколько старт-стоп и частоту твоего кварца. Проще написать готовую прогу,остальное вставишь, чем заниматься демагогией (особо веселые товарищи последнее слово могут поправить)
// Programm by G14 POWER aka Mejia
// ICC-AVR application builder : 11.03.2002 20:01:52
// Target : 2313
// Crystal: 3.6864Mhz~4Mhz
//poluchaem 16 bit s kompa, analiziruem pervie 4 bita, esli ix
//soderjimoe=0, to smotrim sled. 8 bit, i po nim vkluchaem, ili
//vikluchaem svetodiodi na sootv. nojkax, nojki opisivautsa
//kak massiv nojkas
//ZADACHA: ZASTAVIT SVETODIODI MORGAT

s kompa konechno cherez
//COM PORT
//PROBLEMA(THE LAST): NE PONATNO KAK GENERIROVAT PRERIVANIE
//na prixod s kompa
#include <math.h>
#include <stdlib.h> //project started June 1,2005
#include <stdio.h>
#include <string.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
///special for MICRODEVICE
#include <io2313v.h>
#include <macros.h>
#define max_count 312
// po rez emul - signal
// s periodom bolle 2 ms schitaetsa
// nizkochastotnim
//////////////////////////
/// global peremennie
unsigned int temp; // ñîõðàíèòåëü ðåçóëüòàòà
char no_INT0=1; // INT0 îáíóëÿåò ýòó ïåðåìåííóþ
unsigned int counter; // ïåðåìåííàÿ ñ÷åò÷èê
char dig_out; // öèôðà äëÿ âûâîäà ïî rs232
short int nojkas[]={0,1,2,3,4,5,6,7}; //zdes nomera nojek
char x[20]; //ves massiv polucenii iz COM
short int prinataya_stroka;//zdes vixodnoya stroka
//////////////////////////
/// prototipi functii
void port_init(void); // initializatia porta
void uart0_init(void); // init baud rate for komp
void int0_isr(void);
void init_devices(void);
//////////////////////////
//get_result(void); //(ne napisano) //prosto doljna prinat short int
//int 0-15 bit or 2 bait for win
// 15-14-13-12 bit, - bit komandi
// 0000 - svetodiodi
// 0001 - dvigatel
// 0010 - ventilator
//11-10-9-8-7-6-5-4 biti dla svetodioda pri 0000
//3-2-1-0 reserved, ne ispolzuutsa
void svetodiodon(short int nojka); //vkluchaet svetodiod
void svetodiodoff(short int nojka); //vikluchaet svetodiod
void main(void)
{
init_devices();
while(1)
{
short int temp;
short int komanda; // 4 bita komandi
short int i;
short int soderjimoe; // soderjimoe komandi
short int tem;
temp=get_result();//polucili v temp komandu
if (temp) {
komanda=temp;
komanda>>=11; //v komande teper komanda
soderjimoe=temp;
soderjimoe<<=4;
soderjimoe>>=4;// v soderjimom teper soderjimoe
if (komanda==0)
{
char a; //suda budut vitesnatsa soderjimoe
char b; //vremenno xranitsa char chtob udobnee bilo
itoa(&a,soderjimoe,10); // v a xranitsa maska bitov
for (i=0;i<8;i++)
{
b=a;
b<<=i;
b>>=i;
if (b==1) svetodiodon(nojkas[i]);
if (b==0) svetodiodoff(nojkas[i]);
}
}
// if (komanda==1) {dvigatel;}
// if (komanda==2) {ventilator;}
}
}
}
// getting short int from COM PORT
#pragma interrupt_handler get_result:8
void get_result()
{
short int temprez; //zdes vremenie resultati
short int tempdes; //zdes vrem. xranatsa desatki
short int temped; // a zdes edinici
short int temp;
//poluchaet pachku bait nado preobrazovat etu xnu v short int
// v RXD -doljno bit podrad 4 baita poslanie s kompa
// 0-bait, kod
// 1-sotni
// 2-desatki
// 3-edinici
//x[0]=RXD;// 1 bait // kod
//x[1]=RXD;// 2 bait
//x[2]=RXD;// 3 bait
//x[3]=RXD;// 4 bait
// nujno temp= 0000xxxxyyyyzzzzpppp
// ^^^^ - kod operacii
// dopustim mi polucili 0123 nado preobr v verhnee
x[0]=getchar();
x[1]=getchar();
x[2]=getchar();
x[3]=getchar();
x[0]<<=4;
x[0]>>=4; //obnuli kod
itoa(&x[0],temp,10); // v a xranitsa maska bitov
//temp=x[0]; //pixnuli x[0] v temp (tolko tipi nado soglasovat)
temp<<=12; //sdvinuli vlevo
itoa(&x[0],temprez,10); // v a xranitsa maska bitov
//temprez=x[1]*100;
temprez=temprez*100;
itoa(&x[1],tempdes,10); // v a xranitsa maska bitov
tempdes=tempdes*10;
itoa(&x[2],temped,10); // v a xranitsa maska bitov
temprez=temprez+tempdes+temped;
temp=temp+temprez; //krainie levie 4 razrada ne smogut zateretsa

prinataya_stroka=temp;//zdes vixodnoya stroka
main();
}
////////////////////////////////////////////////
void svetodiodon(short int nojka)
{
PORTB &=~BIT (nojka);
}
void svetodiodoff(short int nojka)
{
PORTB ^= BIT (nojka);
}
//////////////////////////////////////////////////////////////
void port_init(void)
{
DDRB =0xFF; //init port B na vixod
PORTB = 0xFF; // initial timer
PORTD = 0x7F;
DDRD = 0x00;
}
//call this routine to initialise all peripherals
void init_devices(void)
{
CLI();
port_init();
uart0_init();
TCCR1B = 0x00;
TCNT1H = 0x00;
TCNT1L = 0x00;
TCCR1A = 0x00;
MCUCR = 0x02;
GIMSK = 0x00;
TIMSK = 0x02;
SEI();
}
//////////////////////////////////////////////////////////////
//TIMER0 initialisation - prescale:1024
// desired value: 50Hz
// actual value: 50,000Hz (0,0%)
//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9600 (0,0%)
//
void uart0_init(void)
{
UCR = 0x00; //disable while setting baud rate
UBRR = 0x17; //set baud rate
UCR = 0x08; //enable
}