[an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Nikolaj 26 января 2006 г. 14:37
В ответ на: Лыжи не едут. В Меге 8 TWI вообще живой?? Ну никак не хочет даже Старт сделать... отправлено <font color=gray>Неспящие_с_Трезором</font> 26 января 2006 г. 14:21

#include
#include

#include "define.h"
#include "func.c"
#include "I2C_mega8.c"
#include "IrDa.c"

#ifdef Old_ADC_routine // Measurements
#include "measurement.c"
#else
#include "ADC_func.c"
#endif// End of ADC routine define


#ifdef Debugging
#include "DebugFunc.c"
#endif

void main(void)
{
/*
// unsigned short volatile __io *ptrSP = &SP;
unsigned short *ptrSP;// = &SP;
// unsigned int volatile *ptrSP;// = &SP;
ptrSP = SP;
ptrSP++;
*ptrSP = 0xAA;
*/

// Ports and Perefireal Units configuration
UnitCFG();
#ifdef Debugging
DebugFunc();
#endif


//########################################################################
/* Two-wire Serial Interface (TWI).
non interrupt.
Byte[0] - Status Word(Byte[0].7 = Read/nWrite (bit.7), Byte[0].6-0 = Number of chars (bit.6-0));
Byte[1] - Address;
Byte[2 - ...] - Data (for Transmit if Byte[0].7 = "1" or Reseive if Byte[0].7 = "0")
-----------------------------------------------------------------------------------------------------
Current project use for service of RTC DS1307 and story data.
*/
char I2C_mega8(char *BufferI2C){
char i, j;
// Checking Mode
if(*BufferI2C & 0x80){// "READ MODE" SELECTED ------------------------------------------
// Write beginning Address
TWCR = (1< while(!(TWCR & (1< if((TWSR & 0xF8) != START)ERROR('S'); // Check value of TWI Status Register. Mask prescaler bits. If status different from START ERROR
TWDR = SLA_W;
TWCR = (1< while(!(TWCR & (1< if((TWSR & 0xF8) != MT_SLA_W_ACK)ERROR('A'); // Check value of TWI Status Register. Mask prescaler bits. If status different from MT_SLA_ASK go to ERROR
++BufferI2C; TWDR = *BufferI2C; // Address Write
TWCR = (1< while(!(TWCR & (1< if((TWSR & 0xF8) != MT_DATA_ACK)ERROR('D'); // Check value of TWI Status Register. Mask prescaler bits. If status different from MT_DATA_ACK go to ERROR
TWCR = (1< BufferI2C--; for(i = 1; i; i++); // Delay()

// Read Data
TWCR = (1< while(!(TWCR & (1< if((TWSR & 0xF8) != START)ERROR('s'); // Check value of TWI Status Register. Mask prescaler bits. If status different from START ERROR
TWDR = SLA_R;
TWCR = (1< while(!(TWCR & (1< if((TWSR & 0xF8) != MT_SLA_R_ACK)ERROR('a'); // Check value of TWI Status Register. Mask prescaler bits. If status different from MT_SLA_ASK go to ERROR
j = 0;
for(i = (*BufferI2C & 0x3F); i; i--){// ------------------ begin "for()" -----------------
TWCR = (1< while(!(TWCR & (1< if((TWSR & 0xF8) != MR_DATA_ACK)ERROR(TWSR & 0xF8); // Check value of TWI Status Register. Mask prescaler bits. If status different from MT_DATA_ACK go to ERROR

// Test printing
// while(!( UCSRA & (1< while(!( UCSRA & (1< Time[7 & j++] = UDR = TWDR;
// End of Test printing

}// ------------------ end "for()" -----------------
TWCR = (1< while(!(TWCR & (1< if((TWSR & 0xF8) != MR_DATA_NOT_ACK)ERROR('E'); // Check value of TWI Status Register. Mask prescaler bits. If status different from MT_DATA_ACK go to ERROR
TWCR = (1<}
else{// "WRITE MODE" SELECTED ------------------------------------------
// Write beginning Address
TWCR = (1< while(!(TWCR & (1< if((TWSR & 0xF8) != START)ERROR('S'); // Check value of TWI Status Register. Mask prescaler bits. If status different from START ERROR
TWDR = SLA_W;
TWCR = (1< while(!(TWCR & (1< if((TWSR & 0xF8) != MT_SLA_W_ACK)ERROR('A'); // Check value of TWI Status Register. Mask prescaler bits. If status different from MT_SLA_ASK go to ERROR
for(i = *BufferI2C; i; i--){
++BufferI2C; TWDR = *BufferI2C; // Address and Data Write
TWCR = (1< while(!(TWCR & (1< if((TWSR & 0xF8) != MT_DATA_ACK)ERROR('D'); // Check value of TWI Status Register. Mask prescaler bits. If status different from MT_DATA_ACK go to ERROR
}
TWCR = (1<}
return 1;
}// End of "char I2C_mega8(char SW_I2C, ){"
//#############################################################################
void UnitCFG(void){
// Ports configuration
// DDRB = ; PORTB = ; // PB.0,1-REZERV; PB.2-"DamageLED"; Isolation: PB.3-IN,PB.4,5-OUT;
// DDRC = ; PORTC = ; // PC.0-3-ADC; PC.4-TWI_SDA, PC.5-TWI_SCL;
// DDRD = ; PORTD = ; // PD.0,1-RS485; PD.2-"ZeroDetector"; PD.3-IrDA_IN; PD.4-IrDA_OUT; PD.5-Starter; PD.6-Heater; PD.7-Free
// Config of ADC; (Normal conversions, single ended = 112 mkSec)
ADCSR = (1 << ADEN)|(1 << ADIE)|(6); // ADC - turn "ON"; Interrupt - enable; Prescaler = 110b what eq. 8 MHz/64 = 125kHz
// Config of TCNT1 (in Mode 4 - CTC)
TCCR1A = 0;
// TCCR1B = (1< TCCR1B = (1< TIMSK |= (1< OCR1A = Tic;
// Config of USART;
UBRRH = 0; // Set baud rate
UBRRL = 8;
UCSRB = (1< UCSRC = (1< // Config of TWI;
TWBR = 8; // Bit Rate setting
TWSR = 1; // Prescaler setting

return;
}// End of "void UnitCFG(void)"{ -------------------------------------------------------------------

// Error handler function
void ERROR(char i){
while(!(UCSRA & (1<while(1);}// End of "void ERROR(char i){" ----------------------------------------------------------

// USART service (non interrupt)
void USART_Transmit(unsigned char *ptrData){
unsigned char i;
while(!(UCSRA & (1<//old for(i = *ptrData; i; i--){
for(i = 0; *ptrData; ++i){
while(!(UCSRA & (1< UDR = *ptrData; ++ptrData; // Put data into buffer, sends the data
}
while(!( UCSRA & (1<}// End of "void USART_Transmit(unsigned char *ptrData){" ------------------------------------------

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru