pomoc w kompilacji

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
pemopemo
-
Posty: 10
Rejestracja: 24 sie 2009, 8:19
Lokalizacja: Starachowice

pomoc w kompilacji

Post autor: pemopemo » 11 wrz 2009, 7:57

witam. mam problem z kompilacja pomoze ktos? lub skompiluje. pozdrawiam

Kod: Zaznacz cały

$crystal <Attiny2313.h> 
$regfile <Delay.h> 

#define Sw Pind.6 
#define Jmp Pinb.0 
#define Vcc Pinb.2 
#define Clk Portb.3 
#define Rst Portb.4 
#define In Portb.1 
#define Out Pinb.1 
#define Led Portd.0 
#define Buzz Portd.1 
#define Prz Portb.5 

#define Del 15 


Char Pytanie[48] = {1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 0} ; / / Tablica Zawierajaca Zadawane Karcie Pytanie 
Char Int_licz , Int_licz1 , Int_licz2 = 0 , Wrong_card ; / / Na Podstawie Ktorego Generuje Ona Odpowiedz 
Unsigned Int Bin; 
Bit Ok = 1; 
Eeprom Unsigned Int Chip_code[20] ; / / Tablica Przechowujaca Aktywowane Karty Telefoniczne 
Eeprom Int Licz_kart; 

Char N; 
Int Li_kart; 


Void Reset(void) / / Procedura Resetujaca Karte Chipowa 
{ 
Rst = 1; 
Delay_us(del); 
Clk = 1; 
Delay_us(del); 
Clk = 0; 
Delay_us(del); 
Rst = 0; 
Delay_us(del); 
} 

Void Inc_adss(void) / / Procedura Zwiekszajaca Adres Na Karcie Chipowej 
{ 
Rst = 0; 
Delay_us(del); 
Clk = 1; 
Delay_us(del); 
Clk = 0; 
Delay_us(del); 
} 

Void Wr_bit(void) / / Procedura Zapisujaca Bit 
{ 
Rst = 1; 
Delay_us(del); 
Rst = 0; 
Delay_us(del); 
Clk = 1; 
Delay_us(del); 
Clk = 0; 
Delay_us(del); 
} 

Void Wr_carry(void) / / Procedura Zapisujaca Bit Carry Na Karcie Chipowej 
{ 
Rst = 1; 
Delay_us(del); 
Rst = 0; 
Delay_us(del); 
Clk = 1; 
Delay_us(del); 
Clk = 0; 
Delay_us(del); 
Rst = 1; 
Delay_us(del); 
Rst = 0; 
Delay_us(del); 
Clk = 1; 
Delay_us(del); 
Clk = 0; 
Delay_us(del); 
} 


Unsigned Int Get_code(void) / / Pobiera Unikalne 16 Bitowe Slowo Karty 
{ / / Na Podstawie Slowa Wejsciowego 
Char I , J , K , L; 
Unsigned Int Code = 0 , Bin; 

In = 1; 
Ddrb.1 = 1; 
Reset(); 

Code = 0; 

 For(i = 0 ; I < 110 ; I + + ) 
 { 
 Inc_adss(); 
 } 
Wr_bit(); 
 For(i = 0 ; I < 177 ; I + + ) 
 { 
 Inc_adss(); 
 } 
 For(j = 0 ; J < 48 ; J + + ) 
 { 
 In = Pytanie[j]; 
 Inc_adss(); 
 } 
Ddrb.1 = 0; 
In = 1; 
For(k = 0 ; K < 16 ; K + + ) 
{ 
 For(l = 0 ; L < 160 ; L + + ) 
 { 
 Inc_adss(); 
 } 
  If(out == 1) 
  {code = Code + 1; 
  } 
 If(k! = 15) Code = Code << 1; 
} 

 Return Code; 
} 

Void Dzwiek(void) / / Generuje Dzwiek - Podwojny Krotki 
{ Int Q; 
For(q = 0 ; Q < 2 ; Q + + ) 
{ 
    Buzz = 0; 
       Delay_ms(70); 
       Buzz = 1; 
       Delay_ms(40); 
} 
} 


Char Check_card(void) / / Procedurka Porownujaca Slowo Pobrane Z Karty Z 
{unsigned Int C ; / / Zawartoscia Eepromu Jezeli Ok. To Zwraca 1 
 Int J; 
 C = Get_code(); 
 For(j = 0 ; J < Licz_kart ; J + + ) 
 {if(chip_code[j] == C) 
  Return 1; 
 } 
Return 0; 
} 


 / / Procedurka Obslugi Przerwania Od Timera T0(generowane Co Ok. 10ms) 

Interrupt [tim0_ovf] Void Timer0_ovf_isr(void) 
{ 

#asm( "cli") 
 If(!sw && Vcc) 
 { Bin = Get_code(); 
  If(!check_card() && Bin! = 0 && Bin! = 65535 && Licz_kart < 20) 
    {chip_code[licz_kart] = Bin; 
    Licz_kart + = 1; 
    Li_kart + = 1; 
    Dzwiek(); 
    Wrong_card = 0 ; } 
    Else 
    { 
    } 
    While(vcc) 
    ; 
 } 


Ddrd.6 = 0 ; / / Sw Jako Wejscie 
Portd.6 = 1; 

If(sw == 0) 
 {if( + + Int_licz2 > 15) 
   { Int_licz2 = 0; 
       Buzz = 0; 
       Led = 1; 
       Delay_ms(400); 
       Buzz = 1; 
       Led = 0; 
       Licz_kart = 0; 
       Li_kart = 0; 
   } 
 } Else {int_licz2 = 0; 
        } 

    If(wrong_card > 4) 
   { Int_licz1 = 0; 
    Wrong_card = 0; 
    Buzz = 0; 
    Prz = 0; 
       For(n = 0 ; N < 20 ; N + + ) 
       Delay_ms(1000); 
       Buzz = 1; 
       } 

   If( + + Int_licz1 == 3000) 
  { Wrong_card = 0; 

     } 


If (jmp == 0 && Prz == 1) 
{ 
   If(vcc == 0) 
   { 
      Prz = 0 ; 
    } 
}


Void Main(void) 
{ 

Portb = 56; 
Ddrb = 56; 
Portd.0 = 1; 
Ddrd.0 = 1; 
Portd.1 = 1; 
Ddrd.1 = 1; 
Tccr0 = 0x05; 
Tcnt0 = 0x00; 
Tccr1a = 0x00; 
Tccr1b = 0x00; 
Tcnt1h = 0x00; 
Tcnt1l = 0x00; 
Ocr1ah = 0x00; 
Ocr1al = 0x00; 
Gimsk = 0x00; 
Mcucr = 0x00; 
Timsk = 0x02; 
Acsr = 0x80; 

Ddrb.2 = 0 ; / / Vcc Jako Wejscie 
Portb.2 = 1; 

Ddrd.6 = 0 ; / / Sw Jako Wejscie 
Portd.6 = 1; 


Ddrb.0 = 0 ; / / Jmp Jako Wejscie 
Portb.0 = 1; 

Clk = 0; 
Rst = 0; 
Led = 0; 
Li_kart = Licz_kart; 

#asm( "sei") 

While(1) 
      { 
 Int I; 
    Delay_ms(3); 
    If(vcc == 1) 
    {led = 1; 
        Bin = Get_code(); 
        If(check_card() && Bin! = 0 && Bin! = 65535) 
        { 
         If(jmp == 1) 
         { 
            Dzwiek(); 
         Prz = !prz; 
         } 
         Else 
         { 
         Prz = 1; 
         Dzwiek(); 
         } 
        } 
         Else 
        { 
         Wrong_card + = 1; 
         Int_licz1 = 0; 
      } 
      Led = 0; 
     While(vcc == 1) 
     ; 
     } 
      }; 
}

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 11 wrz 2009, 8:53

Ani slowa o kompilatorze...
W C na pewno slowa kluczowe (char, void, main, else, return, etc.) pisze sie malymi literami. Po drugie nie wiem czy istnieje dyrektywa #asm, w kazdym razie takowej nie widzialem jeszcze. Po trzecie nie jestem pewien, czy odnenie sie do rejestrow w taki sposob: Ddrd.6 jest dozwolone. Po czwarte wydaje mi sie, ze nazwy rejestrow sa pisane duzymi literami, czyli np. DDRD.

pemopemo
-
Posty: 10
Rejestracja: 24 sie 2009, 8:19
Lokalizacja: Starachowice

Post autor: pemopemo » 11 wrz 2009, 19:13

w takiej postaci sciagnołem ten listing.. zaczynam dopiero z micro... wiec nie wiem wszystkiego.. mogłby pan to jakos poprawic?? byl bym wdzieczny..pozdrawiam.

atelszewski
Użytkownik
Posty: 143
Rejestracja: 12 sie 2005, 9:36
Lokalizacja: Banie

Post autor: atelszewski » 11 wrz 2009, 23:19

Witam,

Powyższy program to jakaś mieszanka Bascoma (chyba, że składnia się zmieniła...) i C i nie ma prawa się skompilować ani w Bascomie ani w GCC.
zaczynam dopiero z micro... wiec nie wiem wszystkiego..
Proponuję zacząć od jakiegoś prostszego programu. Po informacje n/t programowania w Bascomie i C (GCC) odsyłam do EdW.

pemopemo
-
Posty: 10
Rejestracja: 24 sie 2009, 8:19
Lokalizacja: Starachowice

Post autor: pemopemo » 12 wrz 2009, 8:21

no wlasnie to jest projekt z EdW... avt2689
osla łączke powoli przerabiam...

atelszewski
Użytkownik
Posty: 143
Rejestracja: 12 sie 2005, 9:36
Lokalizacja: Banie

Post autor: atelszewski » 12 wrz 2009, 10:32

Witam,

Podaj adres spod którego ściągnąłeś źródła.

pemopemo
-
Posty: 10
Rejestracja: 24 sie 2009, 8:19
Lokalizacja: Starachowice

Post autor: pemopemo » 13 wrz 2009, 14:01


kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 13 wrz 2009, 14:22

Nie wiem co ty skopiowałeś, na pewno to nie jest ten kod który pokazałeś. Ten jest poprawny i kompiluje sie :

Kod: Zaznacz cały

#include <90s2313.h>   
#include <delay.h>
                    
#define  	SW	PIND.6 
#define  	JMP	PINB.0 
#define  	VCC	PINB.2 
#define   	CLK	PORTB.3
#define  	RST	PORTB.4
#define  	IN	PORTB.1
#define  	OUT	PINB.1
#define  	LED	PORTD.0
#define     BUZZ PORTD.1
#define     PRZ PORTB.5

#define  del 15


char pytanie[48]={1,0,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,0,0,0,0,1,1,1,0,1,0,1,0,1,1,0};  // tablica zawierajaca zadawane karcie pytanie
char int_licz,int_licz1,int_licz2=0,wrong_card;							    // na podstawie ktorego generuje ona odpowiedz
unsigned int bin; 
bit ok=1;   
eeprom unsigned int chip_code[20];	// tablica przechowujaca aktywowane karty telefoniczne
eeprom int licz_kart;

char n;
int li_kart;


void reset(void)		// procedura resetujaca karte chipowa
{
RST=1;
delay_us(del);
CLK=1;
delay_us(del);
CLK=0;  
delay_us(del);
RST=0;
delay_us(del);
}     

void inc_adss(void)		// procedura zwiekszajaca adres na karcie chipowej
{
RST=0;
delay_us(del);
CLK=1;
delay_us(del);
CLK=0;
delay_us(del);
}

void wr_bit(void)		// procedura zapisujaca bit 
{
RST=1;
delay_us(del);
RST=0;
delay_us(del);
CLK=1;
delay_us(del);
CLK=0;
delay_us(del);
}

void wr_carry(void)		// procedura zapisujaca bit carry na karcie chipowej
{
RST=1;
delay_us(del);
RST=0;
delay_us(del);
CLK=1;
delay_us(del);
CLK=0;
delay_us(del);
RST=1;
delay_us(del);
RST=0;
delay_us(del);
CLK=1;
delay_us(del);
CLK=0;
delay_us(del);
}
        

unsigned int get_code(void)		// pobiera unikalne 16 bitowe slowo karty 
{                          			// na podstawie slowa wejsciowego
char i,j,k,l;   
unsigned int code=0,bin;  

IN=1;      
DDRB.1=1;   
reset(); 

code=0;

 for(i=0;i<110;i++)
 { 
 inc_adss();
 }
wr_bit();
 for(i=0;i<177;i++)
 {
 inc_adss();
 }
 for(j=0;j<48;j++)
 { 
 IN=pytanie[j];
 inc_adss();
 }
DDRB.1=0;
IN=1; 
for(k=0;k<16;k++)
{  
 for(l=0;l<160;l++)
 { 
 inc_adss();
 }     
  if(OUT==1)
  {code=code+1;
  }
 if(k!=15) code=code<<1;                    
}

 return code; 
}       

void dzwiek(void)		// generuje dzwiek - podwojny krotki
{  int q;
for(q=0;q<2;q++)
{
	   BUZZ=0;
       delay_ms(70);
       BUZZ=1;
       delay_ms(40);
}
} 


char check_card(void)	// procedurka porownujaca slowo pobrane z karty z
{unsigned int c;		// zawartoscia EEPROMU jezeli ok. to zwraca 1
 int j;
 c=get_code();
	for(j=0;j<licz_kart;j++)
	{if(chip_code[j]==c)
	 return 1;
	}
return 0;
}	 

 
// procedurka obslugi przerwania od timera T0 (generowane co ok. 10ms)                              

interrupt [TIM0_OVF] void timer0_ovf_isr(void) 
{  

#asm("cli")     
 if(!SW && VCC)
 { bin = get_code();
  if(!check_card() && bin!=0 && bin!=65535 && licz_kart<20)
    {chip_code[licz_kart]=bin;
    licz_kart+=1;
    li_kart+=1;
    dzwiek(); 
    wrong_card=0;}
    else
    { 
    }
    while(VCC)
    ;
 }  
 
 
DDRD.6=0;   // SW jako wejscie
PORTD.6=1;

if(SW==0)
 {if( ++int_licz2>15)         
   {   int_licz2=0;
       BUZZ=0;
       LED=1;
       delay_ms(400);
       BUZZ=1;
       LED=0;
       licz_kart=0;
       li_kart=0;  
   }
 } else {int_licz2=0;
        }            
     
    if(wrong_card>4)
	  { int_licz1=0;
	   wrong_card=0;
	   BUZZ=0;
	   PRZ=0;
       for(n=0;n<20;n++)
       delay_ms(1000);
       BUZZ=1;
       }
       
   if(++int_licz1==3000)  
 	{ wrong_card=0;
	    
     }
     
 
if( JMP==0 && PRZ==1)
{   if(++int_licz==30)
{int_licz=0;
 PRZ=0;}
}
else int_licz=0;
 
#asm("sei")
}


void main(void)
{

PORTB=56;
DDRB=56;
PORTD.0=1;
DDRD.0=1; 
PORTD.1=1;
DDRD.1=1;
TCCR0=0x05;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x02;            
ACSR=0x80;

DDRB.2=0;   // VCC jako wejscie
PORTB.2=1;   

DDRD.6=0;   // SW jako wejscie
PORTD.6=1;   


DDRB.0=0;   // JMP jako wejscie
PORTB.0=1;   

CLK=0;
RST=0;
LED=0;
li_kart=licz_kart;

#asm("sei")
   
while (1)
      {  
 int i;             
    delay_ms(3);  
    if(VCC==1)
    {LED=1; 
       	bin=get_code();
       	if(check_card() && bin!=0 && bin!=65535)
       	{
       		if(JMP==1)	   
       		{
       	    dzwiek();
       		PRZ=!PRZ;
       		} 
       		else 
       		{   
       		PRZ=1;
       		dzwiek();
       		}
        }
         else
        {
         wrong_card+=1;
         int_licz1=0;
 	    } 
 	    LED=0;
 	   while(VCC==1)
 	   ; 
     }
      };
}
   

pemopemo
-
Posty: 10
Rejestracja: 24 sie 2009, 8:19
Lokalizacja: Starachowice

Post autor: pemopemo » 13 wrz 2009, 16:51

kompiluje i wyskakuja błedy

Kod: Zaznacz cały

Error : 1     Line :   1     Unknown statement [#INCLUDE < 90S2313.H>]  , in File : C:\DOCUMENTS AND SETTINGS\PEMO\PULPIT\NONAME1.BAS
Error : 1     Line :   2     Unknown statement [#INCLUDE < DELAY.H>]  , in File : C:\DOCUMENTS AND SETTINGS\PEMO\PULPIT\NONAME1.BAS
Error : 1     Line :   4     Unknown statement [#DEFINE SW PIND.6]  , in File : C:\DOCUMENTS AND SETTINGS\PEMO\PULPIT\NONAME1.BAS
Error : 1     Line :   5     Unknown statement [#DEFINE JMP PINB.0]  , in File : C:\DOCUMENTS AND SETTINGS\PEMO\PULPIT\NONAME1.BAS
Error : 1     Line :   6     Unknown statement [#DEFINE VCC PINB.2]  , in File : C:\DOCUMENTS AND SETTINGS\PEMO\PULPIT\NONAME1.BAS
Error : 1     Line :   7     Unknown statement [#DEFINE CLK PORTB.3]  , in File : C:\DOCUMENTS AND SETTINGS\PEMO\PULPIT\NONAME1.BAS
Error : 1     Line :   8     Unknown statement [#DEFINE RST PORTB.4]  , in File : C:\DOCUMENTS AND SETTINGS\PEMO\PULPIT\NONAME1.BAS
Error : 1     Line :   9     Unknown statement [#DEFINE IN PORTB.1]  , in File : C:\DOCUMENTS AND SETTINGS\PEMO\PULPIT\NONAME1.BAS
Error : 1     Line :   10    Unknown statement [#DEFINE OUT PINB.1]  , in File : C:\DOCUMENTS AND SETTINGS\PEMO\PULPIT\NONAME1.BAS
Error : 1     Line :   11    Unknown statement [#DEFINE LED PORTD.0]  , in File : C:\DOCUMENTS AND SETTINGS\PEMO\PULPIT\NONAME1.BAS
Error : 1     Line :   12    Unknown statement [#DEFINE BUZZ PORTD.1]  , in File : C:\DOCUMENTS AND SETTINGS\PEMO\PULPIT\NONAME1.BAS

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 13 wrz 2009, 17:35

Ehh.. to jest kod w C a nie bascomie. Skompiluj to w Winavr

pemopemo
-
Posty: 10
Rejestracja: 24 sie 2009, 8:19
Lokalizacja: Starachowice

Post autor: pemopemo » 14 wrz 2009, 6:24

W Winavr rowniez bledy....

atelszewski
Użytkownik
Posty: 143
Rejestracja: 12 sie 2005, 9:36
Lokalizacja: Banie

Post autor: atelszewski » 14 wrz 2009, 6:46

Witam,

Kod: Zaznacz cały

interrupt [TIM0_OVF] void timer0_ovf_isr(void) 
Program jest w C, ale pisany pod kompilator IAR lub inny.

pemopemo
-
Posty: 10
Rejestracja: 24 sie 2009, 8:19
Lokalizacja: Starachowice

Post autor: pemopemo » 14 wrz 2009, 20:25

w zadnym kompilatorze sie nie kompiluje.. przynajmniej nie u mnie.

[ Dodano: 2009-09-17, 19:39 ]
heh.. widze ze nikt nie moze tego rozkminic.. dzieki za checi. pozdrawiam.

ODPOWIEDZ