Ir ao conteúdo
  • Cadastre-se

Tiago Shimizu

Membro Pleno
  • Posts

    177
  • Cadastrado em

Reputação

0
  1. Olá a todos. Tenho dois servidores linux, um rodando debian 10 e samba 4 como ad e um novo servidor que estou tentando configurar com o ubuntu 18.04. No servidor debian, consigo configurar o compartilhamento das pastas e autenticar normalmente com os usuários/grupos do ad. Configurei meu segundo servidor com as seguintes informações: apt-get install samba krb5-user winbind smbclient ldap-utils acl attr libnss-winbind libpam-winbind /etc/krb5.conf [libdefaults] default_realm = DOMINIO.LOCAL dns_lookup_realm = false dns_lookup_kdc = true [realms] DOMINIO.LOCAL = { kdc = srvad.dominio.local admin_server = srvad.dominio.local } /etc/nsswitch.conf passwd: compat winbind group: compat winbind shadow: compat winbind /etc/samba/smb.conf [global] workgroup = DOMINIO realm = DOMINIO.LOCAL security = ADS netbios name = arquivos max log size = 50 template shell = /bin/bash winbind separator = + winbind enum users = Yes winbind enum groups = Yes winbind use default domain = Yes idmap config DOMINIO : schema_mode = rfc2307 idmap config DOMINIO : range = 10000000–29999999 idmap config DOMINIO : default = yes idmap config DOMINIO : backend = rid idmap config * : range = 20000–29999 idmap config * : backend = tdb [Teste] path = /teste browseable = yes read only = no admin users = administrator valid users = administrator teste kinit administrator net ads join -U administrador service winbind restart Até aqui, tudo tranquilo. Se dou um wbinfo -u ou um wbinfo -g, me retorna todos os usuários e grupos do servidor AD, porém se tento acessar o compartilhamento criado, só dá usuário e/ou senha incorretos. Alguém tem ideia do que pode ser? Obrigado.
  2. Olá a todos. Tenho um chart que possui 3 séries: 1ª- Valor minimo; 2ª- Valor real; 3ª- Valor máximo; Precisava validar que se o valor real ultrapassasse os valores minimo ou máximo pintasse de outra cor a parte que ultrapassou. O problema é que o minimo e máximo possuem 6 posições e o real pode ter fácil fácil mais que 500 posições. Alguém tem alguma ideia de como posso fazer isso? Obrigado desde já.
  3. Olá a todos. Tenho um programa bem "simples" em meu microcontrolador que apenas deve ler o que recebeu na porta serial. No momento não vou tratar o retorno ainda mas quero deixar tudo pronto. Segue o código: #define _XTAL_FREQ 20000000 // Definição do clock do sistema #pragma config FOSC = HS // Oscilador externo, HS #pragma config MCLRE = ON // Precisa resistor no pino MCLR de pull-up #pragma config WDT = OFF // Desabilita o Watchdog Timer (WDT). #pragma config PWRT = ON // Habilita o Power-up Timer (PWRT). #pragma config BOR = OFF #pragma config PBADEN = OFF // RB0,1,2,3 e 4 configurado como I/O digital. #pragma config LVP = OFF // Desabilita o Low Voltage Program. #include <xc.h> #include <p18f2550.h> #include <stdlib.h> #include <stdio.h> #define BUFFER_SIZE 256 typedef struct { unsigned char Index; unsigned char Data[BUFFER_SIZE]; } BUFFER; BUFFER Buffer; void interrupt interrupcao(void) { if (PIR1bits.RCIF) { Buffer.Index = 0; while (PIR1bits.RCIF) { Buffer.Data[Buffer.Index++] = RCREG; } PIR1bits.RCIF = 0; // Limpa a flag } } void main(void) { CMCON = 0x07; // Desliga os comparadores internos ADCON1 = 0x0F; // Define que todos os pinos são entradas/saídas digitais TRISC6 = 0; // Pino TX como saída TRISC7 = 1; // Pino RX como entrada SPBRG = 10.35; BRGH = 1; SYNC = 0; // Modo de trabalh assincrono SPEN = 1; // Habilita os pinos da porta serial TXEN = 1; // Habilita a transmissão de dados CREN = 1; // Habilita a recepção de dados TX9 = 0; // Modo 8-bit de envio de dados RX9 = 0; // Modo 8-bit de recepção de dados IPR1bits.RCIP = 1; // Define a interrupção de recepção como alta prioridade PIE1bits.RCIE = 1; // Habilita interrupção de recepção da USART PIR1bits.RCIF = 0; // Limpa flag de RX RCONbits.IPEN = 1; // Habilita interrupções com nível de prioridade INTCONbits.GIEH = 1; // Habilita interrupções de alta prioridade INTCONbits.PEIE = 1; // Habilita interrupções por periférico (USART) while (1) { } } O problema se encontra na linha Buffer.Index = 0; na interrupção. Se habilito essa linha, simplesmente não consigo ler o que está na porta, recebe um monte de caractere esquisito. Se comento ela, recebe ok, porém sempre vai empilhando o que recebe na porta, não começa na posição zero. Já tentei também criar esse buffer na própria interrupção e também não deu certo: void interrupt interrupcao(void) { unsigned char Index = 0; unsigned char Buffer[256]; if (PIR1bits.RCIF) { Buffer[Index++] = RCREG; } } Alguém já teve esse tipo de problema? Poderiam me ajudar? Obrigado desde já. Obs: Estou realizando os testes em componentes reais na protoboard.
  4. kkkk, bastante coisa né. Pois é, já havia percebido essa questão do LVP. Já deixei desligado até. Mas mesmo assim obrigado pela ajuda.
  5. #Bommu Perneta, obrigado pela ajuda. Então, quebrei um pouco mais a cabeça e avancei um pouquinho mais na resolução. Lendo um livro que tenho sobre programação c para o 18F4550, ele dizia que todas as configurações com respeito a comunicação usb deveriam ser colocadas no arquivo usb_descriptor.c porém não dava mais detalhes sobre que informações esse arquivo contém. Abri ele então e fui lendo, linha a linha. Uma das informações dizia respeito a "máxima corrente" consumida pelo dispositivo. A mesma estava bem baixa, o que as vezes, conforme a utilização de alguns outras dispositivos, acabava reiniciando o microcontrolador. Aumentei essa corrente máxima e parou de reiniciar por conta disso. Ainda não consegui fazer uma análise mais detalhada com o osciloscópio para ver a corrente máxima que estava sendo consumida pela placa. Bom, mas para entender, a "USB" que me refiro, é a comunicação entre o microcontrolador e e o computador, utilizando a interface usb do dispositivo. Quanto a "coleta de dados", utilizo deste os pinos I/O do microcontrolador, memórias externa, placas RF entre outros. Assim como você, já estava tão cansado de quebrar a cabeça que decidi ir dormir pois já não estava conseguindo mais pensar direito. #Isadora Ferraz, obrigado pela ajuda. Admiro muito seu conhecimento pois vejo e obsorvo várias dicas suas em outros post's. Vou revisar o software para ver se não estou tendo esse problema de uso conjunto das variáveis. "Mascare uma no início da outra e desmascare no fim" - tipo, seria mais ou menos isso: #pragma interrupt YourHighPriorityISRCode void YourHighPriorityISRCode() { INTCON3bits.INT0IE = 0; <-- Desabilita as interrupções da INT0 #if defined(USB_INTERRUPT) if (PIR2bits.USBIF) USBDeviceTasks(); #endif if (USBDeviceState < CONFIGURED_STATE) return 0; INTCON3bits.INT0IE = 1; <-- Habilita as interrupções da INT0 } #pragma interruptlow YourLowPriorityISRCode void YourLowPriorityISRCode() { // Trata informações da INT0 } Quanto a não poder postar o código, infelizmente é uma decisão da empresa. Agradeço desde já a ajuda de todos.
  6. Olá a todos. Tenho um desenvolvimento em MPLAB C18 com PIC 18F2550 em que preciso coletar algumas informações externas por meio da porta usb desse pic. Utilizo o programa exemplo da microship para isso porém, a conexão fica bem instável, onde em alguns momentos o dispositivo é desconectado. Só para entenderam o que preciso: 1º - Conexão estável com o PC, sem quedas e/ou perda de dados; 2º - Coletar esses dados por meio da porta serial e/ou outros métodos e enviar esses valores ao PC; 3º - Enviar pelo PC algumas informações para o microcontrolador para que ele realize algumas funções; Já possuo isso porém, como mencionado, está instável. Utilizo as interrupções de nível alto para a comunicação USB e a nível baixo para a coleta de dados. Visto se tratar de uma aplicação comercial, não posso postar o fonte do mesmo contudo, gostaria de verificar se alguém teria disponibilidade de me dar uma consultoria e ajuda para a correção do problema, quer ele seja físico (desenvolvimento da placa), quer seja software. Desde já agradeço a todos. adicionado 26 minutos depois Pessoal, atualizando o status: Separei em partes as comunicações: USB e coleta de dados. Se deixo somente a USB, funciona perfeitamente. A comunicação fica 100% e consigo Receber e enviar dados perfeitamente do controlador. Agora, se ativo a coleta de dados, no caso, as interrupções nível baixo, ferra com tudo. É possível digamos que, colocar isso em um "processamento paralelo" no microcontrolador para que ele opere os dois sem um interferir no outro? Sei que na rotina de nível baixo estou utilizando alguns delay's, pois é necessário. Contudo até onde sei, caso entre uma nova interrupção de nível alto ele aborta a de nível baixo e vai para a nível alto, não é isso? Obrigado.
  7. Isadora Ferraz, obrigado pela ajuda. Na realidade, estava simulando tanto pelo proteus quanto pelo PicKit3 diretamente no pic. Resolvi primeiro verificar se estava tudo certo e rodei o código diretamente no pic só que com a biblioteca de hardware do controlador e funcionou tudo certinho, então matei a parte de fuses e de montagem. porém, meu projeto utiliza os pinos padrões do I2C do pic para outra comunicação, e nessa altura do projeto, é melhor eu alterar a comunicação i2c para software mesmo. Utilizo essa comunicação para controlar outros dois dispositivos já, uma memória (24C128) e um expansor de I/O (PCF8574), ambos por meio da I2C por software e tudo funciona ok. Depois que coloquei a última mensagem aqui, quebrei mais a cabeça testando e percebi que quando acessava via hardware e logo após via software, ele pegava as informações certinho, porém reiniciava o controlador e tentava acessar via software direto não ia. Tentei alterar tudo que era coisa na comunicação via software mas não foi. porém, uma hora sem querer, realizei duas leituras consecutivas e na segunda leitura lê normal. Sempre, sem exceção, na primeira leitura ele faz todos os passos porém só retorna zero nos valores, daí posso ler e escrever a vontade no ds que ele aceita todos os comando certinho. Não entendi direito o porque disso pois via hardware não tenho esse problema. Sendo assim, sempre que inicio o controlador, realizo uma leitura porém descarto ela e as demais funcionam 100%. Obrigado pela ajuda.
  8. Olá, tive de dar uma pausa no projeto mas agora retomei nele, porém até agora nada. Filtrei todo o código e ficou assim: #include <p18f2550.h> #include "../Bibliotecas/i2c.h" unsigned char LeRelogio(void); unsigned char GravaRelogio(void); typedef struct { struct { unsigned char Horas; unsigned char Minutos; unsigned char Segundos; } Horario; struct { unsigned char Dia; unsigned char Mes; unsigned char Ano; } Data; } RELOGIO_CONFIG; RELOGIO_CONFIG Relogio; void main(void) { LeRelogio(); Temp[0] = '1'; Temp[1] = '7'; Relogio.Horario.Horas = StrToLong(Temp, 0, 2); Temp[0] = '2'; Temp[1] = '3'; Relogio.Horario.Minutos = StrToLong(Temp, 0, 2); Temp[0] = '5'; Temp[1] = '6'; Relogio.Horario.Segundos = StrToLong(Temp, 0, 2); Temp[0] = '2'; Temp[1] = '8'; Relogio.Data.Dia = StrToLong(Temp, 0, 2); Temp[0] = '1'; Temp[1] = '2'; Relogio.Data.Mes = StrToLong(Temp, 0, 2); Temp[0] = '1'; Temp[1] = '6'; Relogio.Data.Ano = StrToLong(Temp, 0, 2); GravaRelogio(); LeRelogio(); } ../Biblioteca/i2c.h #include <delays.h> #define DATA_LOW TRISBbits.TRISB2 = 0; // define macro for data pin output #define DATA_HI TRISBbits.TRISB2 = 1; // define macro for data pin input #define DATA_LAT LATBbits.LATB2 // define macro for data pin latch #define DATA_PIN PORTBbits.RB2 // define macro for data pin #define CLOCK_LOW TRISBbits.TRISB3 = 0; // define macro for clock pin output #define CLOCK_HI TRISBbits.TRISB3 = 1; // define macro for clock pin input #define SCLK_LAT LATBbits.LATB3 // define macro for clock pin latch #define SCLK_PIN PORTBbits.RB3 // define macro for clock pin void SWStopI2C(void); void SWStartI2C(void); void SWRestartI2C(void); void SWStopI2C(void); signed char SWAckI2C(void); signed char Clock_test(void); signed int SWReadI2C(void); signed char SWWriteI2C(unsigned char data_out); signed char SWGetsI2C(unsigned char *rdptr, unsigned char length); signed char SWPutsI2C(unsigned char *wrptr); #define SWPutcI2C SWWriteI2C #define SWGetcI2C SWReadI2C #define SWDelay Delay10TCYx(20) void SWNotAckI2C(void); far unsigned char I2C_BUFFER; // temp buffer for R/W operations far unsigned char BIT_COUNTER; // temp bufffer for bit counting void I2CRead(unsigned char Device, unsigned address, char *out, char length); void I2CWrite(unsigned char Device, unsigned address, const rom unsigned char *texto); // <editor-fold defaultstate="collapsed" desc="SWAckI2C"> signed char SWAckI2C(void) { SCLK_LAT = 0; // set clock pin latch to 0 CLOCK_LOW; // set clock pin to output to drive low DATA_HI; // release data line to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; CLOCK_HI; // release clock line to float high Delay1TCY(); // 1 cycle delay Delay1TCY(); // 1 cycle delay if (DATA_PIN) // error if ack = 1, slave did not ack { return ( -1); // return with acknowledge error } else { return ( 0); // return with no error } } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="SWNotAckI2C"> void SWNotAckI2C(void) { CLOCK_LOW; // make clock pin output to drive low DATA_LAT = 0; // set data pin latch to 0 DATA_LOW; // make data pin output to drive low //Delay10TCY(); // user may need to modify based on Fosc SWDelay; CLOCK_HI; // release clock line to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="Clock_test"> signed char Clock_test(void) { //Delay10TCYx(3); // user may need to adjust timeout period //DelayMs(1); SWDelay; if (!SCLK_PIN) // if clock is still low after wait { return ( -2); // return with clock error } else { return ( 0); // return with no error } } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="SWReadI2C"> signed int SWReadI2C(void) { BIT_COUNTER = 8; // set bit count for byte SCLK_LAT = 0; // set clock pin latch to 0 do { CLOCK_LOW; // set clock pin output to drive low DATA_HI; // release data line to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; CLOCK_HI; // release clock line to float high //Delay1TCY(); // user may need to modify based on Fosc //Delay1TCY(); SWDelay; if (!SCLK_PIN) // test for clock low { if (Clock_test()) // clock wait routine { return ( -2); // return with error condition } } I2C_BUFFER <<= 1; // shift composed byte by 1 I2C_BUFFER &= 0xFE; // clear bit 0 if (DATA_PIN) // is data line high I2C_BUFFER |= 0x01; // set bit 0 to logic 1 } while (--BIT_COUNTER); // stay until 8 bits have been acquired return ( (unsigned int) I2C_BUFFER); // return with data } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="SWGetsI2C"> signed char SWGetsI2C(unsigned char *rdptr, unsigned char length) { unsigned int thold; // define auto variable while (length--) // stay in loop until byte count is zero { thold = SWGetcI2C(); // read and save 1 byte if (thold & 0xFF00) { return ( -1); // return with error condition } else { *rdptr++ = thold; // save off byte read } if (!length) // initiate NOT ACK { CLOCK_LOW; // make clock pin output to drive low DATA_HI; // release data line to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; CLOCK_HI; // release clock line to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; } else // else initiate ACK condition { CLOCK_LOW; // make clock pin output to drive low DATA_LAT = 0; // set data pin latch to 0 DATA_LOW; // make data pin output to drive low //Delay10TCY(); // user may need to modify based on Fosc SWDelay; CLOCK_HI; // release clock line to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; } } return ( 0); // return with no error } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="SWWriteI2C"> signed char SWWriteI2C(unsigned char data_out) { BIT_COUNTER = 8; // initialize bit counter I2C_BUFFER = data_out; // data to send out SCLK_LAT = 0; // set latch to 0 do { if (!SCLK_PIN) // test if clock is low { // if it is then .. if (Clock_test()) // wait on clock for a short time { return ( -1); // return with error condition } } else { I2C_BUFFER &= 0xFF; // generate movlb instruction _asm rlcf I2C_BUFFER, 1, 1 // rotate into carry and test _endasm if (STATUS & 0x01) // if carry set, transmit out logic 1 { CLOCK_LOW; // set clock pin output to drive low DATA_HI; // release data line to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; CLOCK_HI; // release clock line to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; } else // transmit out logic 0 { CLOCK_LOW; // set clock pin output to drive low DATA_LAT = 0; // set data pin latch to 0 DATA_LOW; // set data pin output to drive low //Delay10TCY(); // user may need to modify based on Fosc SWDelay; CLOCK_HI; // release clock line to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; } BIT_COUNTER--; // reduce bit counter by 1 } } while (BIT_COUNTER); // stay in transmit loop until byte sent return ( 0); // return with no error } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="SWPutsI2C"> signed char SWPutsI2C(unsigned char *wrptr) { while (*wrptr) { if (SWPutcI2C(*wrptr++)) // write out data string to I2C receiver { return ( -1); // return if there was an error in Putc() } else { if (SWAckI2C()) // go read bus ack status { return ( -1); // return with possible error condition } } } return ( 0); // return with no error } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="SWRestartI2C"> void SWRestartI2C(void) { SCLK_LAT = 0; // set clock pin latch to 0 CLOCK_LOW; // set clock pin to output to drive low DATA_HI; // release data pin to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; CLOCK_HI; // release clock pin to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; DATA_LAT = 0; // set data pin latch to 0 DATA_LOW; // set data pin output to drive low //Delay10TCY(); // user may need to modify based on Fosc SWDelay; } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="SWStopI2C"> void SWStopI2C(void) { SCLK_LAT = 0; // set clock pin latch to 0 CLOCK_LOW; // set clock pin to output to drive low DATA_LAT = 0; // set data pin latch to 0 DATA_LOW; // set data pin output to drive low //Delay10TCY(); // user may need to modify based on Fosc SWDelay; CLOCK_HI; // release clock pin to float high //Delay10TCY(); // user may need to modify based on Fosc SWDelay; DATA_HI; // release data pin to float high //Delay1TCY(); // user may need to modify based on Fosc //Delay1TCY(); SWDelay; } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="SWStartI2C"> void SWStartI2C(void) { DATA_LAT = 0; // set data pin latch to 0 DATA_LOW; // set pin to output to drive low //Delay10TCY(); // user may need to modify based on Fosc SWDelay; } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="I2CWrite"> void I2CWrite(unsigned char Device, unsigned address, const rom unsigned char *texto) { SWStartI2C(); SWWriteI2C(Device); if (!SWAckI2C()) //Checa o bit ACK. { SWWriteI2C(((char*) &address)[1]); if (!SWAckI2C()) { SWWriteI2C(((char*) &address)[0]); if (!SWAckI2C()) { while (*texto) { if (*texto == '\n') break; SWWriteI2C(*texto++); SWAckI2C(); } } } } SWStopI2C(); } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="I2CRead"> void I2CRead(unsigned char Device, unsigned address, char *out, char length) { SWStartI2C(); SWWriteI2C(Device); // Endereço slave if (!SWAckI2C()) //Checa o bit ACK. { SWWriteI2C(((char*) &address)[1]); if (!SWAckI2C()) { SWWriteI2C(((char*) &address)[0]); if (!SWAckI2C()) { SWRestartI2C(); SWWriteI2C(Device + 1); if (!SWAckI2C()) { while (length-- > 1) { *out = SWGetcI2C(); SWNotAckI2C(); out++; } *out = SWGetcI2C(); SWAckI2C(); SWStopI2C(); } } } } } // </editor-fold> Quando simulo pelo proteus ele funciona perfeitamente contudo, quando monto o circuito, não vai de jeito nenhum... O problema anterior de ele se perder nas informações estava ocorrendo pois no arquivo i2c.h, o valor da linha #define SWDelay Delay10TCYx(20) estava #define SWDelay Delay10TCYx(2) e como estou utilizando um cristal de 20MHz, gerava erro. Alguma luz para esse problema? Obrigado desde já.
  9. Isadora Ferraz, primeiramente muito obrigado pela ajuda. Então, já havia feito exatamente isso que comentou. Por exemplo, até no código coloquei o endereço do DS como 0xD0 porém, percebi depois que ele não estava aceitando dessa forma, por isso alterei para 0b1101000 e ele começou a aceitar pelo menos o primeiro SWWriteI2C mas depois do comando de leitura e/ou escrita (SWWriteI2C(0x00); / SWWriteI2C(0x01);), já recusa o Ack.
  10. Olá pessoal. Estou precisando fazer um relógio utilizando o PIC 18F2550 e o DS1307 programando em C18 porém, não estou conseguindo de jeito algum...! Já tentei utilizando o I2C do pic via hardware e via software porém em nenhum dos dois funcionou. Descartei a comunicação pois tenho uma memória I2C e consigo ler e escrever na mesma sem problemas. Alguém poderia me ajudar? Obrigado. #include <p18f2550.h> #include <sw_i2c.h> #pragma config FOSC = HS #pragma config CPUDIV = OSC1_PLL2 #pragma config DEBUG = OFF #pragma config PWRT = OFF #pragma config WDT = OFF #pragma config PBADEN = OFF #pragma config MCLRE = ON #pragma config LVP = OFF unsigned char horas, minuto, segundo; unsigned char dia, mes, ano, semana; void ds1307_init(void) { BYTE seconds = 0; SWStartI2C(); SWWriteI2C(0xD0); // WR to RTC SWWriteI2C(0x00); // REG 0 SWRestartI2C (); SWWriteI2C(0xD1); // RD from RTC if (!SWAckI2C ( )) //Checa o bit ACK. { seconds = SWGetcI2C(); // Read current "seconds" in DS1307 SWStopI2C(); seconds &= 0x7F; DelayMs(3); SWStartI2C(); SWWriteI2C(0xD0); // WR to RTC SWWriteI2C(0x00); // REG 0 SWWriteI2C(seconds); // Start oscillator with current "seconds value SWRestartI2C (); SWWriteI2C(0xD0); // WR to RTC SWWriteI2C(0x07); // Control Register SWWriteI2C(0x10); // Disable squarewave output pin } SWStopI2C(); } BYTE bin2bcd(BYTE binary_value) { BYTE temp; BYTE retval; temp = binary_value; retval = 0; while(1) { // Get the tens digit by doing multiple subtraction // of 10 from the binary value. if(temp >= 10) { temp -= 10; retval += 0x10; } else // Get the ones digit by adding the remainder. { retval += temp; break; } } return(retval); } // Input range - 00 to 99. BYTE bcd2bin(BYTE bcd_value) { BYTE temp; temp = bcd_value; // Shifting upper digit right by 1 is same as multiplying by 8. temp >>= 1; // Isolate the bits for the upper digit. temp &= 0x78; // Now return: (Tens * 8) + (Tens * 2) + Ones return(temp + (temp >> 2) + (bcd_value & 0x0f)); } void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec) { sec &= 0x7F; hr &= 0x3F; SWStartI2C(); SWWriteI2C(0xD0); // I2C write address SWWriteI2C(0x00); // Start at REG 0 - Seconds SWWriteI2C(bin2bcd(sec)); // REG 0 SWWriteI2C(bin2bcd(min)); // REG 1 SWWriteI2C(bin2bcd(hr)); // REG 2 SWWriteI2C(bin2bcd(dow)); // REG 3 SWWriteI2C(bin2bcd(day)); // REG 4 SWWriteI2C(bin2bcd(mth)); // REG 5 SWWriteI2C(bin2bcd(year)); // REG 6 SWWriteI2C(0x10); // REG 7 - Disable squarewave output pin SWStopI2C(); } void main(void) { ADCON1 = 0x0F; ds1307_init(); ds1307_set_date_time(28, 11, 16, 2, 2, 25, 16); ds1307_get_date(dia, mes, ano, semana); }
  11. Pessoal, já não sei mais se estou fazendo certo agora.... ou se meus cálculos estão certos. Estou utilizando um cristal de 20MHz. Até onde sei, para microcontroladores da família 18F, o cálculo seria: // Fmaq = Fosc / 4 => Fmaq = 20MHz / 4 => 5MHz #define GetSystemClock() (20000000ul) // 20MHz #define GetInstructionClock() (GetSystemClock()/4) // 5MHz #define GetPeripheralClock() (GetSystemClock()/4) // 5MHz Nessas configurações, o ENC28J60 começa a querer comunicar mas logo em seguida desliga. Agora, se altero o valor de divisão do GetSystemClock() de 4 para valores bem mais altos, 40 por exemplo, ele começa a comunicar com o PC, fica uns 2 segundos, e cai a comunicação. Estou certo em meus cálculos?
  12. Olá pessoal, estou tendo problemas em configurar um módulo ENC28J60 em um microcontrolador 18F2550 no C18. Basicamente preciso abrir um socket de comunicação entre o pic e o pc para obter algumas informações. Utilizo um cristal de 20MHz e meu código está assim: #include <p18f2550.h> #define _XTAL_FREQ 20000000 // cristal de 20 Mhz #pragma config FOSC = HS #pragma config CPUDIV = OSC1_PLL2 #pragma config WDT = OFF #pragma config PBADEN = OFF #pragma config LVP = OFF #pragma config PWRT = ON #pragma config DEBUG= OFF #pragma config MCLRE = OFF #pragma udata void YourLowPriorityISRCode(); void YourHighPriorityISRCode(); #define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x08 #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x18 #pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS void Remapped_High_ISR (void) { _asm goto YourHighPriorityISRCode _endasm } #pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS void Remapped_Low_ISR (void) { _asm goto YourLowPriorityISRCode _endasm } #pragma code #pragma interrupt YourHighPriorityISRCode void YourHighPriorityISRCode() { } #pragma interruptlow YourLowPriorityISRCode void YourLowPriorityISRCode() { TickUpdate(); } void main(void) { static TICK t = 0; while (1) { TickInit(); InitAppConfig(); StackInit(); while (1) { if (TickGet() - t >= TICK_SECOND / 2ul) { t = TickGet(); } StackTask(); StackApplications(); #if defined(STACK_USE_TCP_SERVER) ServerSocketTCP(); #endif } } } static ROM BYTE SerializedMACAddress[6] = {MY_DEFAULT_MAC_BYTE1, MY_DEFAULT_MAC_BYTE2, MY_DEFAULT_MAC_BYTE3, MY_DEFAULT_MAC_BYTE4, MY_DEFAULT_MAC_BYTE5, MY_DEFAULT_MAC_BYTE6}; void InitAppConfig(void) { AppConfig.Flags.bIsDHCPEnabled = TRUE; AppConfig.Flags.bInConfigMode = TRUE; memcpypgm2ram((void*) &AppConfig.MyMACAddr, (ROM void*) SerializedMACAddress, sizeof (AppConfig.MyMACAddr)); memcpypgm2ram(AppConfig.NetBIOSName, (ROM void*) MY_DEFAULT_HOST_NAME, 16); FormatNetBIOSName(AppConfig.NetBIOSName); AppConfig.MyIPAddr.Val = MY_DEFAULT_IP_ADDR_BYTE1 | MY_DEFAULT_IP_ADDR_BYTE2 << 8ul | MY_DEFAULT_IP_ADDR_BYTE3 << 16ul | MY_DEFAULT_IP_ADDR_BYTE4 << 24ul; AppConfig.DefaultIPAddr.Val = AppConfig.MyIPAddr.Val; AppConfig.MyMask.Val = MY_DEFAULT_MASK_BYTE1 | MY_DEFAULT_MASK_BYTE2 << 8ul | MY_DEFAULT_MASK_BYTE3 << 16ul | MY_DEFAULT_MASK_BYTE4 << 24ul; AppConfig.DefaultMask.Val = AppConfig.MyMask.Val; AppConfig.MyGateway.Val = MY_DEFAULT_GATE_BYTE1 | MY_DEFAULT_GATE_BYTE2 << 8ul | MY_DEFAULT_GATE_BYTE3 << 16ul | MY_DEFAULT_GATE_BYTE4 << 24ul; AppConfig.PrimaryDNSServer.Val = MY_DEFAULT_PRIMARY_DNS_BYTE1 | MY_DEFAULT_PRIMARY_DNS_BYTE2 << 8ul | MY_DEFAULT_PRIMARY_DNS_BYTE3 << 16ul | MY_DEFAULT_PRIMARY_DNS_BYTE4 << 24ul; AppConfig.SecondaryDNSServer.Val = MY_DEFAULT_SECONDARY_DNS_BYTE1 | MY_DEFAULT_SECONDARY_DNS_BYTE2 << 8ul | MY_DEFAULT_SECONDARY_DNS_BYTE3 << 16ul | MY_DEFAULT_SECONDARY_DNS_BYTE4 << 24ul; } void ServerSocketTCP(void) { WORD lenA; BYTE i; static DWORD timeout[SERVER_CONNS]; static TCP_SOCKET MySocket[SERVER_CONNS]; //unsigned char buf[253]; unsigned char buf[]; static enum _TCPServerState { SM_HOME = 0, SM_LISTENING, } maquina_estado_servidor = SM_HOME; //maquina de estado switch (maquina_estado_servidor) { //---------------------------------------------------------------------- case SM_HOME: for (i = 0; i < SERVER_CONNS; i++) { //faz alocação de de buffer para os sockets MySocket[i] = TCPOpen(0, TCP_OPEN_SERVER, SERVER_PORT, TCP_PURPOSE_GENERIC_TCP_SERVER); timeout[i] = TickGet(); } maquina_estado_servidor = SM_LISTENING; break; //---------------------------------------------------------------------- case SM_LISTENING: for (i = 0; i < SERVER_CONNS; i++) { if (TCPIsConnected(MySocket[i])) { lenA = TCPIsGetReady(MySocket[i]); //se passou 15 segundos e nao recebeu nada desconecta if (TickGet() - timeout[i] >= TICK_SECOND * 15) { TCPDisconnect(MySocket[i]); } } else { timeout[i] = TickGet(); } } break; //---------------------------------------------------------------------- } } O arquivo HardwareProfile.h está assim: #ifndef __HARDWARE_PROFILE_H #define __HARDWARE_PROFILE_H #include "GenericTypeDefs.h" #include "Compiler.h" #define GetSystemClock() (20000000ul) // Hz #define GetInstructionClock() (GetSystemClock()/4) #define GetPeripheralClock() (GetSystemClock()/4) //ENC28J60 I/O pins #define ENC_RST_TRIS (TRISCbits.TRISC0) #define ENC_RST_IO (LATCbits.LATC0) #define ENC_CS_TRIS (TRISCbits.TRISC1) #define ENC_CS_IO (LATCbits.LATC1) #define ENC_SCK_TRIS (TRISBbits.TRISB1) #define ENC_SDI_TRIS (TRISBbits.TRISB0) #define ENC_SDO_TRIS (TRISCbits.TRISC7) #define ENC_SPI_IF (PIR1bits.SSPIF) #define ENC_SSPBUF (SSPBUF) #define ENC_SPISTAT (SSPSTAT) #define ENC_SPISTATbits (SSPSTATbits) #define ENC_SPICON1 (SSPCON1) #define ENC_SPICON1bits (SSPCON1bits) #define ENC_SPICON2 (SSPCON2) Alguém poderia me ajudar? Obrigado.
  13. Olá a todos. Venho recorrer mais uma vez a ajuda do pessoal do fórum. Bom, para começar, utilizo a seguinte configuração: MPLAB X IDE v3.40 Compilador C18 (v3.47) Tenho um projeto que para conseguir compilar o mesmo, preciso habilitar a opção: Project Properties -> Conf -> C18(Global Options) -> mcc18 -> Default storage class onde preciso alterar de Auto para Overlay. Não sei ao certo o porque precisa fazer isso, mas... O problema é que, nesse mesmo projeto, estou precisando incluir uma comunicação serial, utilizando a bibliotec <usart.h> porém, se a opção Default storage class estiver em Overlay, não compila a parte da comunicação serial, e se deixo ela em Auto, a parte antiga do sistema não compila... Alguém poderia me ajudar a entender qual é dessa função Default storage class e como poderia resolver essa dor de cabeça? Obrigado desde já.
  14. Olá a todos. Tenho o PSP2001 e um PS3 Slim junto com o Gran Turismo 5. Ouvi dizer que tem como utilizar o PS como retrovisor e como controle no jogo, mas não estou conseguindo. Algum sabe como fazer isso?
  15. Bem, para começar, tem como dar boot sim pelo hd externo... mas não se anima muito não..hehehe. Tem um tutorial explicando isso: http://forum.clubedohardware.com.br/como-instalar-windows/373382?p=2402593 Contudo, notei que quer utilizar o mesmo windows em 3 máquinas diferentes... impossível... o windows reconhece seu hardware e faz o windows reiniciar. Também estava com este pensamento... não sei se daria certo mas, se criar 3 partições e em cada uma instalar o windows no determinado micro que vai usar pode ser que de certo... Espero que tenha ajudado. Qualquer coisa posta ae que tentamos melhorar.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...