logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8][C] Błędna kompilacja - brak mi pomysłów

MEN8989 17 Maj 2009 16:11 1599 4
REKLAMA
  • #1 6541084
    MEN8989
    Poziom 11  
    Witam. Próbuje podpiąć do mojej atmegi klawiaturę, wykorzystując protokół ps2 - kod zaczerpnięty ze strony
    http://radzio.dxp.pl/pckeyboard/
    lecz wyskakuje mi błąd kompilacji i nie wiem dlaczego pomocy!!

    
    {
    switch(i)
    {
      case 0 :
      dane = 0;
      i++;
      break;
      case 1 :
      if(ATKbdGetDta()) dane |= 0x01;
      i++;
      break;
      case 2 :
      if(ATKbdGetDta()) dane |= 0x02;
      i++;
      break;
      case 3 :
      if(ATKbdGetDta()) dane |= 0x04;
      i++;
      break;
      case 4 :
      if(ATKbdGetDta()) dane |= 0x08;
      i++;
      break;
      case 5 :
      if(ATKbdGetDta()) dane |= 0x10;
      i++;
      break;
      case 6 :
      if(ATKbdGetDta()) dane |= 0x20;
      i++;
      break;
      case 7 :
      if(ATKbdGetDta()) dane |= 0x40;
      i++;
      break;
      case 8 :
      if(ATKbdGetDta()) dane |= 0x80;
      i++;
      break;
      case 9 :
      i++;
      break;
      case 10 :
      nowy = 1;
      i = 0;
      break;
      }
    }


    błąd:
    
    > "make.exe" all
    avr-gcc -g -Wall -O2 -mmcu=atmega8    -c -o atkeyboard.o atkeyboard.c
    atkeyboard.c:13: warning: return type defaults to `int'
    atkeyboard.c: In function `ISR':
    atkeyboard.c:60: warning: control reaches end of non-void function
    avr-gcc -g -Wall -O2 -mmcu=atmega8  -Wl,-Map,atkeyboard.map -o atkeyboard.elf atkeyboard.o 
    C:/WinAVR/bin/../lib/gcc/avr/3.4.1/../../../../avr/lib/avr4/crtm8.o(.init9+0x0): undefined reference to `main'
    make.exe: *** [atkeyboard.elf] Error 1
    


    Jak mogę to naprawić??

    Poprawiłem tytuł i treść wiadomości - regulamin p.11,15.
    [zumek]
  • REKLAMA
  • REKLAMA
  • #3 6541195
    MEN8989
    Poziom 11  
    atkeyboard.c
    
    #include "atkeyboard.h"
    int dane = 0, nowy = 0,i=0 ;
    
    // procedura obsługi przerwania zewnętrzneg
    #if ATKbdClk == PD2
      #define USE_INT0
      ISR(INT0_vect)
    #elif ATKbdClk == PD3
      #define USE_INT1
      ISR(INT1_vect)
    #endif
    
    {
    switch(i)
    {
      case 0 :
      dane = 0;
      i++;
      break;
      case 1 :
      if(ATKbdGetDta()) dane |= 0x01;
      i++;
      break;
      case 2 :
      if(ATKbdGetDta()) dane |= 0x02;
      i++;
      break;
      case 3 :
      if(ATKbdGetDta()) dane |= 0x04;
      i++;
      break;
      case 4 :
      if(ATKbdGetDta()) dane |= 0x08;
      i++;
      break;
      case 5 :
      if(ATKbdGetDta()) dane |= 0x10;
      i++;
      break;
      case 6 :
      if(ATKbdGetDta()) dane |= 0x20;
      i++;
      break;
      case 7 :
      if(ATKbdGetDta()) dane |= 0x40;
      i++;
      break;
      case 8 :
      if(ATKbdGetDta()) dane |= 0x80;
      i++;
      break;
      case 9 :
      i++;
      break;
      case 10 :
      nowy = 1;
      i = 0;
      break;
      }
    }
    // funkcja inicjalizujšca porty oraz przerwania
    // wykorzystywane przy obsłudze klawiatury.
    void initATkbd(void)
    {
    ATKbdDtaIn(); // linia DATA pracuje jako wej?cie
    ATKbdSetDta();// właczenie rezystora podcišgajacego linii DATA
    ATKbdClkIn(); // linia CLK pracuje jako wej?cie
    ATKbdSetClk();// właczenie rezystora podcišgajšcego lini CLK
    
    #ifdef USE_INT0
      GICR |= (1 << INT0);  // zezwolenie na przerwanie INT0
      MCUCR |= (1 << ISC01); // przerwanie INT0 wyzwalane zboczem opadajšcym
    #endif
    
    #ifdef USE_INT1
      GICR |= (1 << INT1);  // zezwolenie na przerwanie INT1
      MCUCR |= (1 << ISC11); // przerwanie INT1 wyzwalane zboczem opadajšcym
    #endif
    
    sei(); // globalne odblokowanie przerwań
    }
    
    // funkcja odczytujaca kod naci?niętego klawisza
    unsigned char getATkbd(void)
    {
    while(!nowy); // oczekiwanie na odebranie nowego znaku
    nowy = 0; // zerowanie flagi odebrania znaku
    return dane;
    }
    


    atkeyboard.h

    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    //
    #define ATKbdPort PORTD
    #define ATKbdPin  PIND
    #define ATKbdDir  DDRD
    //
    #define ATKbdClk  PD2
    //
    #define ATKbdDta  PD0
    //
    #define ATKbdGetDta() (ATKbdPin & (1 << ATKbdDta))
    #define ATKbdGetClk() (ATKbdPin & (1 << ATKbdClk))
    //
    #define ATKbdSetDta() ATKbdPort |= (1 << ATKbdDta)
    #define ATKbdClrDta() ATKbdPort &= ~(1 << ATKbdDta)
    //
    #define ATKbdSetClk() ATKbdPort |= (1 << ATKbdClk)
    #define ATKbdClrClk() ATKbdPort &= ~(1 << ATKbdClk)
    
    #define ATKbdDtaOut() ATKbdDir |= (1 << ATKbdDta)
    #define ATKbdDtaIn()  ATKbdDir &= ~(1 << ATKbdDta)
    
    #define ATKbdClkOut() ATKbdDir |= (1 << ATKbdClk)
    #define ATKbdClkIn()  ATKbdDir &= ~(1 << ATKbdClk)
    
    unsigned char getATkbd(void);
    void initATkbd(void);
    
  • REKLAMA
  • Pomocny post
    #4 6541266
    28aug240
    Poziom 14  
    Witam

    Widzę że kolega po prostu nie zapisał funkcji main...

    pliki które masz są tylko instrukcjami których musisz użyć w swoim programie
    czyli

    int main(void){
    ...
    tu komendy itp...
    }
    


    Jeśli to twój pierwszy program daj na PRV postaram się pomóc
  • #5 6545335
    MEN8989
    Poziom 11  
    Dziękuję użytkownikowi 28aug240 za pomoc klawiatura działa.
    Dziekuje. Temat zamknięty.
REKLAMA