Jeg er ved at lave mit første programmerings projekt. Jeg skal have lavet en farve sensor som fungere på RGB-princippet. farve sensoren skal bruges til at sortere vaksetøj i fem katergorier. jeg har lavet programmet til en ATMEGA16 microcontroller. Den har 2 infrarøde sensorer som input(til at bestemme længden og positionen af tøjet på transportbåndet). Motoren der styrer transportbåndet er også koblet til microcontrolleren vha. af en transistor. min kreds kan så styre en RGB-diode, og aktivere de tre farver individuelt. Samtidig med at de tre farver skiftevis er tændt måler jeg på en fotomodstand hvis signal kommer igennem ADC porten. Så laves der en række beregninger ud fra de værdier min kreds måler og tilsidste har jeg farven.
Det problem jeg har er at jeg får en fejl som hedder: Linker error: the program has no 'main' function. jeg arbejder i programmet CodevisionAVR.
- #include <mega16.h>
-
-
-
- int time_cntr = 0; //globale variable
- int counter1 = 0;
- int counter2 = 0;
- int counter3 =0;
- int tid = 0;
- int halvtid = 0;
- unsigned char r = 0;
- unsigned char g = 0;
- unsigned char b = 0;
- unsigned char r_adc = 0;
- unsigned char g_adc = 0;
- unsigned char b_adc = 0;
- int d = 0;
- int rd = 0;
- int gd = 0;
- int bd = 0;
- int hue = 0;
- unsigned char max = 0;
- unsigned char min = 0;
- int h = 0;
- int IRA1 = 0;
- int IRA2 = 0;
-
- //timer 0 overflow interrupt service routine (side 130)
- interrupt [TIM0_OVF] void timer0_ovf_isr(void)
- {
- TCNT0=177; //reload timer 0 for next period
- if (time_cntr++==100) //checks 10 times per second, increment counter
- {
- ++counter1;
- ++counter3;
- }
- time_cntr = 0; //reset timer 0 for next period
-
- }
- //ADC ISR
- interrupt [ADC_INT] void adc_isr(void)
- {
- unsigned int adc_data; // variable til data fra ADC
- adc_data=ADCW; // læs alle 10-bit ind i variablen
- r_adc=ADCW/4; // give
- g_adc=ADCW/4;
- b_adc=ADCW/4;
- ADCSRA=ADCSRA | 0x40; // start næste A-D konvertering
- }
-
- void main(){
-
- //Portopsætning
- PORTA = 0x00;
- DDRA = 0x00; //alle pins på port A sættes til input
- PORTB = 0x00;
- DDRB = 0x00; //alle pins på port B sættes til input
- PORTC = 0xFF;
- DDRC = 0XFF; // alle pins på port c sættes til output
- PORTD = 0xFF;
- DDRD = 0xFF; //alle pins på port D sættes til output
-
- //timer 0 initialisering herunder
- TCCR0=0x05; //clock sat til clk/1024
- TCNT0=0x00; //start timer 0 ved 0
- TIMSK=0x01; //Tillad Timer Overflow ISR
- SREG=0x80; //Tillader alle ISR
- IRA1=PINB.1;
- IRA2=PINB.2;
- while(IRA1==0)
- {
- #asm("sei"); // kaldt timer0 ISR
- }
- while(IRA1==1) //mens IRA1 er høj sker det i tuborg-parentesen
- {
- TCCR0=0x00; //stop timer/counter
- tid = counter1; //værdi gemmes
- counter1 = 0; //tælleren nulstilles, så den er klar til at tælle forfra næste gang interruptrutinen kaldes
- counter2 = 0;
- counter3 = 0;
- counter2 = counter1;
-
- if(IRA2==0)
- {
- halvtid = tid/2;
- TCCR0=0x05; //clock sat til clk/1024
- #asm("sei"); //kaldt timer0 ISR
- while(counter2==halvtid)
- {
- switch (counter3)
- {
- case '0':
- TCCR0=0x00; //stop Timer
- TCNT0=0x00; //nulstil Timer
- PIND.0=1; //outputpin til motor sættes høj
- PIND.1=1; //aktivering af RØD
- #asm("sei"); //kaldt timer0 ISR
- break;
-
- case '2':
- TCCR0=0x00; //stop timer
- ADMUX=0; //læs Analog signal på PINA.0
- ADCSRA=0xCE; // ADC-ISR kaldt, ADC tændt, clock/64, interrupts tilladt, interrupt started
- r_adc=r; // værdi mellem 0 og 255 givet til r
- PIND.1=0; //slukning af RØD
- #asm("sei"); // kaldt timer0 ISR
- break;
-
- case '7':
- TCCR0=0x00; //stop timer
- PIND.2=1; //aktivere GRØN
- #asm("sei"); // kaldt timer0 ISR
- break;
-
- case '':
- TCCR0=0x00; //stop timer
- ADMUX=0; //læs Analog signal på PINA.0
- ADCSRA=0xCE; //ADC-ISR kaldt, ADC tændt, clock/64, interrupts tilladt, interrupt started
- g_adc=g; //værdi mellem 0 og 255 givet til g
- PIND.2=0; //slukning af GRØN
- #asm("sei"); //kaldt timer0 ISR
- break;
-
- case '14':
- TCCR0=0x00; //stop timer
- PIND.3=1; //aktivere BLÅ
- #asm("sei"); //kaldt timer0 ISR
- break;
-
- case '16':
- TCCR0=0x00; //stop timer
- ADMUX=0; //læs Analog signal på PINA.0
- ADCSRA=0xCE; // ADC-ISR kaldt, ADC tændt, clock/64, interrupts tilladt, interrupt started
- b_adc=b; // værdi mellem 0 og 255 givet til b
- PIND.3=0; //slukning af BLÅ
- if ((250<= r <= 255) & (250 <= g <= 255) & (250 <= b <= 255))
- PINC.0=1; //så aktiveres Output.5(hvid) direkte
- else if ((0 <= r <= 5) & (0 <= g<= 5) & (0 <= b <= 5))
- PINC.1=1; //så aktiveres Output.6(sort) direkte
- else
- {
- if(r>g)
- max = r;
- else
- max = g; // find farven(r,g,b) med højeste intensitet
- if(b>max)
- max = b;
- if(r<g)
- min = r;
- else
- min = g; // find farven(r,g,b) med laveste intensitet
- if(b<min)
- min = b;
- d = ((max-min)/60); // differencen mellem max og min og skalering
- rd = (max - r)/d; //normalisering af farveintensiteterne
- gd = (max - g)/d;
- bd = (max - b)/d;
- if(b==max) {h = 240 + gd - rd;} // udregning af hue baseret på stærkeste farve
- if(g==max) {h = 120 + rd - bd;}
- if(r==max) {h = bd - gd;}
- if(h<0)
- hue=h + 360; // hvis hue er negativ adderes 360
- else
- hue=h;
-
- if (150 < hue < 270)
- PINC.2=1; //signal til Blålig
- else if (40<=h<=15)
- PINC.3=1; //signal til Grønlig
- else if ((270<=hue<=360) & (0<=hue<=40))
- PINC.4=1; //signal til Rødlig
-
- }
- break;
- }
-
- PIND.0=0; // start af motor
-
- time_cntr = 0; // initialiser alle variable og start motor
- counter1 = 0;
- counter2 = 0;
- counter3 =0;
- tid = 0;
- halvtid = 0;
- r = 0;
- g = 0;
- b = 0;
- r_adc = 0;
- g_adc = 0;
- b_adc = 0;
- d = 0;
- rd = 0;
- gd = 0;
- bd = 0;
- hue = 0;
- }
-
-
-
-
- }
- }
- }