V pohodě, já toho chlapce bral jako srandu… Přikládám teda celý projekt. Zobrazovaní nemám ještě udělaný přes přerušení, to měl být další krok… Jakto že ten příkaz pro delay není přesný? To jsem netušil. Tu přesnost 1/10 myslíte tak, že při zpoždění třeba 460uS může být nepřesnost ±46uS? V tom případě bych to musel napsat na dvakrát a nebo udělat zpoždění přes časovač.
#define F_CPU 16000000
#define port7seg_data PORTB //port pro data na 7SEG +nastavit DDRx=0xff jako vystupni
#define port7seg_pos PORTC //port pro pozice na 7SEG bity 0…3 pro pozici 0-3 +nastavit DDRx=0x?f jako vystupni
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define FLIPBIT(ADDRESS,BIT) (ADDRESS ^= (1<<BIT))
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/pgmspace.h>
#include <math.h>
const unsigned char Cislice_tab7SEG[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //Tabulka cisel pro 7SEG Px.0-Px.7 odpovida A,B…G,tecka
//Tabulka znaku na pro 7SEG
const unsigned char Font_tbl[128] =
{
0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49, 0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,
0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49, 0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,
0x00,0x82,0x22,0x49,0x49,0x49,0x49,0x02, 0x49,0x49,0x49,0x49,0x49,0x40,0x80,0x52,
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x49,0x49,0x49,0x48,0x49,0x53,
0x7B,0x77,0x49,0x39,0x49,0x79,0x71,0x7D, 0x76,0x06,0x0E,0x49,0x38,0x49,0x37,0x3F,
0x73,0x49,0x49,0x6D,0x49,0x3E,0x49,0x49, 0x49,0x6E,0x5B,0x39,0x64,0x0F,0x23,0x08,
0x20,0x5F,0x7C,0x58,0x5E,0x7B,0x71,0x6F, 0x74,0x04,0x0E,0x49,0x06,0x49,0x54,0x5C,
0x73,0x67,0x50,0x6D,0x78,0x1C,0x49,0x49, 0x49,0x6E,0x5B,0x46,0x30,0x70,0x01,0x49
};
void text_7seg (unsigned char text[4],unsigned char jas) //4 znaky na 7seg, jas 0-255
{
unsigned char temp,znak,poz_disp;
temp=jas;
for(znak=0,poz_disp=8;znak<4;znak++) //posila znak od nejvyssi pozice dokud je znak<4
{
port7seg_pos|=0x0f; //maska portu na xxxx1111
port7seg_pos&=~poz_disp; //negovana maska pozice na LN portu
port7seg_data=~Font_tbl[text[znak]]; //zobrazi negovany znak na aktualni pozici (spolecna anoda)
while(jas>0) jas–; //doba zobrazeni podle jasu
port7seg_data=0xff; //zhasni data
port7seg_pos|=0x0f; //zhasni pozici
jas=255-temp; //jas=doba zhasnuti
while(jas>0) jas–; //doba zhasnuti podle jasu
jas=temp; //obnoveni jasu z temp
poz_disp>>=1; //pozice na nizsi
}
}
void num_7seg (int val,unsigned char jas) //rozsah pouze pro hodnoty -999 az 9999 4sedmisegmentovky
{
unsigned char temp,i,poz_disp,minus;
if (val<-999|val>9999) text_7seg("-OF-",jas); //kdyz je val mimo rozsah zobrazovace vypis chybu/preteceni
else
{
if (val<0) {minus=1; val=abs(val);} else minus=0; //kdyz je val zaporny nastav minus a uloz ABS do val
temp=jas; //jas do temp
for (i=0,poz_disp=1;i<4;i++) //posila cislici od nejnizsi pozice
{
port7seg_pos|=0x0f; //maska portu na xxxx1111
port7seg_pos&=~poz_disp; //negovana maska pozice na LN portu
if ((minus==1)&(poz_disp==8)) port7seg_data=~64; //kdyz minus=1 a pozice 8 zobraz minus (na nejvyssi pozici)
else
port7seg_data=~Cislice_tab7SEG[val%10]; //zobrazi negovanou cislici na aktualni pozici (spolecna anoda)
while(jas>0) jas–; //doba zobrazeni podle jasu
port7seg_data=0xff; //zhasni data
port7seg_pos|=0x0f; //zhasni pozici
jas=255-temp; //jas=doba zhasnuti
while(jas>0) jas–; //doba zhasnuti podle jasu
jas=temp; //obnoveni jasu z tempu
poz_disp<<=1; //posun pozice na vyssi
val=val/10;
}
}
}
unsigned char cidlo_reset (void) //reset cidla
{
unsigned char stav=0;
SETBIT(DDRA,0); //prepnuto na vystup
CLEARBIT(PORTA,0); //stahnout na 0
_delay_us(480);
CLEARBIT(DDRA,0); //prepnuto na vstup-uvolnit
_delay_us(70);
if (CHECKBIT(PINA,0)==0) stav=0; //kdyz cidlo vrati 0 je zresetovano
else stav=1;
_delay_us(410);
return(stav);
}
void cidlo_write(unsigned char val) //zapise bajt
{
unsigned char i;
SETBIT(DDRA,0); //prepnout na vystup
for (i=8; i>0; i–) //zapis Byte
{
CLEARBIT(PORTA,0); //stahnout na 0-start timeslot
_delay_us(6);
if (val&0x01==1)
{
CLEARBIT(DDRA,0); //prepni na vstup-uvolni
_delay_us(64);
}
else
{
_delay_us(54);
CLEARBIT(DDRA,0); //prepni na vstup-uvolni
_delay_us(10);
}
val=val/2;
}
}
unsigned char cidlo_read(void) //precte bajt
{
unsigned char i;
unsigned char value=0;
SETBIT(DDRA,0); //prepnuto na vystup
for (i=8;i>0;i–)
{
value>>=1;
CLEARBIT(PORTA,0); //stahnout na 0-start timeslot
_delay_us(6);
CLEARBIT(DDRA,0); //prepnout na vstup-uvolnit
_delay_us(9);
if (CHECKBIT(PINA,0)==1) value|=0x80; //precti stav sbernice
_delay_us(55); //cekej na konec timeslotu
}
return(value);
}
int scratchpad_read(void) //precte teplotu-dva bajty
{
unsigned char i;
int value=0;
SETBIT(DDRA,0); //prepnout na vystup
for (i=16;i>0;i–)
{
value>>=1;
CLEARBIT(PORTA,0); //stahnout na 0-start timeslot
_delay_us(6);
CLEARBIT(DDRA,0); //prepnout na vstup-uvolnit
_delay_us(9);
if (CHECKBIT(PINA,0)==1) value|=0x80; //precti stav sbernice
_delay_us(55); //cekej na konec timeslotu
}
return(value);
}
void main(void)
{
DDRB=0xff; //port B vystupni
DDRC=0x0f; //port C0-C3 vystupni zbytek vstup
PORTC=0xff;
int s;
while (cidlo_reset()==1); //pri neuspesnem resetu se tady zacykli
cidlo_write(0xcc); //skip ROM
cidlo_write(0x44); //prevod T
while (CHECKBIT(PINA,0)==0); //cekej na dokonceni prevodu
while (cidlo_reset()==1); //pri neuspesnem resetu se tady zacykli
cidlo_write(0xcc); //skip ROM
cidlo_write(0xbe); //read scratchpad
s=scratchpad_read();
while(1)
{
num_7seg(s,255); //zobrazeni na 7seg
}
}