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

[atmega32][C]program którego nie w sposób uruchomić...

margas4542 13 Paź 2010 16:52 900 3
  • #1 8614963
    margas4542
    Poziom 16  
    Witam. Na początek dla jasności..przekopałem elektrodę..zagłębiłem się w datasheta...ale to okazało się za mało by PCF8583 zaczął wreszcie gadać z moją atmegą 32. Nie potrafię dojść dlaczego kompilator się pluje o zbyt wiele definicji w funcjii TWI_read której definicja jak wyczytałem z postów jest poprawna. Proszę pomóżcie bo ten program spać mi już nie daje i mam koszmary w "C" w tle.To część programu odpowiedzialna za pogawędki dwóch kostek..
    
    //#######################################
    //########## A T M E G A _ 3 2 ##########
    //#######################################
    #include <stdint.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h> 
    #include "HD44780.h"
    
    //-----obsługa TWI dla PCF8583
    #define ACK 1
    #define NOACK 0
    static void TWI_start(void)
    {
     TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
     while (!(TWCR & (1<<TWINT)));
    }
    static void TWI_stop(void)
    {
     TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
     while ((TWCR & (1<<TWSTO)));
    }
    static void TWI_write(char data)
    {
     TWDR = data;
     TWCR = (1<<TWINT) | (1<<TWEN);
     while (!(TWCR & (1<<TWINT)));
    }
    static char TWI_read(char ack)
    {
     TWCR = ack ? ((1 << TWINT) | (1 << TWEN) | (1 << TWEA)) : ((1 << TWINT) | (1 << TWEN)) ;
     while (!(TWCR & (1<<TWINT)));
     return TWDR;
    }
    //-----define obsługa przerwań PCF8582
    volatile int interrupt_time=0;
    void INT1_inicjacja(void)
    {
     MCUCR = 0x01;     
     GICR = 0x40;   
    }
    ISR(INT1_vect)   
    {
     interrupt_time=1;
    }
    //-----define nastaw i wyświetlania czasu zegara
    #define zegar 0xA0 				// A0 PCF8583 do plusa
    unsigned char PCF8583;
    unsigned char buffer_t[16];
    unsigned char czas_hh,czas_h,czas_mm,czas_m,czas_ss,czas_s;
    unsigned char set_hh,set_h,set_mm,set_m,set_ss,set_s;
    
    //***** MAIN
    int main()
    {
     DDRA=0xC0;		//flaga  PA6
     PORTA=0x80; 	//pul-up klawisza podświetlenia LCD
     DDRB=0x01;		//podświetlenie LCD (reszta pinów 4 bity,RS,RW,E pod LCD)
     DDRC=0xFC;		//wyjścia sterujące oraz SCL SDA układu PCF8583 oraz 24C04
     PORTC=0x03;	//pul-up dla SCL SDA INT1 układu PCF8583 oraz 24C04
     DDRD=0x00;		//wejścia klawiatura oraz INT1 układu PCF8583
     PORTD=0xF8;	//pull-up klawiatura oraz INT1 układu PCF8583
    //----- LCD init
     LCD_Initalize();
     _delay_ms(200);
    //----- TWI init
     TWSR=0x00;			//preskaler I2C
     TWBR=0x48;			//((F_CPU / 100000UL - 16) / 2);
     INT1_inicjacja(); 
     sei(); 
     while(1)
     {    
    //------------reszta programu
    	}
        if(!(PINA & _BV(7)))
    	{
    	_delay_ms(30);
         PORTB ^=_BV(0);   //podświetlenie LCD PORTB pin 1
    	 while(!(PINA & _BV(7)))
         _delay_ms(30);
    	}//end 
    //--------------------------zegar oraz data
        for(;;)
        {
         if (interrupt_time==1)				//ustaw flage odczytu danych  
         {
          PCF8583 =TWI_read(zegar,0x04);
          czas_hh =(PCF8583 & 0x30) >> 4; 	// dziesatki_godzin         
          czas_h =PCF8583 & 0x0F;      		// godziny
          PCF8583 =TWI_read(zegar,0x03);
          czas_mm =PCF8583 >> 4;            // dziesatki_minut
          czas_m =PCF8583 & 0x0F;      		// minuty
          PCF8583 =TWI_read(zegar,0x02);
          czas_ss =PCF8583 >> 4;            // dziesatki_sekund
          czas_s =PCF8583 & 0x0F;      		// sekundy
      
          interrupt_time=0;					//zeruj flage odczytu danych 
         }
        }
       }
      } 
    //--------------------------
      LCD_GoTo(1,0);   LCD_WriteText("16/10/10");	//będzie wyświetlanie daty
      LCD_GoTo(11,0);  LCD_WriteText(itoa(czas_hh,buffer_t,10));//jednostki godzin
      LCD_GoTo(12,0);  LCD_WriteText(itoa(czas_h,buffer_t,10));//dziesiatki godzin
      LCD_GoTo(13,0);  LCD_WriteText(":");	//dwukropek
      LCD_GoTo(14,0);  LCD_WriteText(itoa(czas_mm,buffer_t,10));//jednostki minut
      LCD_GoTo(15,0);  LCD_WriteText(itoa(czas_m,buffer_t,10));//dziesiatki minut
      LCD_GoTo(16,0);  LCD_WriteText(":");	//dwukropek
      LCD_GoTo(17,0);  LCD_WriteText(itoa(czas_ss,buffer_t,10));//jednostki sekund
      LCD_GoTo(18,0);  LCD_WriteText(itoa(czas_s,buffer_t,10));//dziesiatki sekund
    //------------------------------------
     }//end while
    return;
    }//end main
    //********** END MAIN **********
    
  • #2 8615042
    szelus
    Poziom 34  
    Raczej nie zbyt wiele definicji, a użycie niezgodne z definicją. Definiujesz TWI_read z jednym argumentem, a wywołujesz z dwoma. To co kompilator ma z tym zrobić?
  • #3 8615051
    arrevalk
    Poziom 25  
    Zobacz na implementacje funkcji TWI_read() oraz na jej wykorzystanie w kodzie i porównaj liczbę parametrów.
    ---EDIT------
    i się spóźniłem ;)
  • #4 8615118
    margas4542
    Poziom 16  
    No tak cztery oczy a nie widzi... [TWI_write(char data)]...jest jeden parametr OK ale to nie zmienia faktu że ta nadal chodzić nie będzie...co radzicie..bo mnie już tak bili głowa że nic mądrego nie wymyśle....usunięcie drugiego parametru [zegar] spowodowało wyczyszczenie LCD i taktowanie PORT2 na którym siedzi obsługa innej definicji...toż to koszmar...
REKLAMA