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 **********
