Ir ao conteúdo
  • Cadastre-se

Thiago Felipe Soares Gonçalves

Membro Pleno
  • Posts

    86
  • Cadastrado em

  • Última visita

Tudo que Thiago Felipe Soares Gonçalves postou

  1. Vou tentar ser o mais objetivo possível, vamos esquecer o display a partir de agora já que este esta dando muita dor de cabeça e não é o objetivo principal do projeto e vamos nos concentrar a partir de agora no controle de potência. Para controlar a potência eu utilizo o circuito da figura abaixo: Neste esquemático temos os módulos necessários para fazer esse controle potência a partir do angulo de potencia do TRIAC, mas o que seria esse angulo potência, basicamente é o ponto na senoide onde o TRIAC é disparado e entra em condução, podemos observar isso na figura a baixo: O principio é simples, temos um semiciclo de senoite que compreendi o angulo de 0°~180°, no nosso caso a frequência da onda senoidal é 60Hz e o seu semiciclo possui a frequência de 120Hz que equivale em tempo a 8,333ms, chaveando um TRIAC sempre na mesma ponto deste semiciclo obtemos o efeito de controlar a tensão RMS aplicada a uma carga e por consequência a potência já que P=V²/R, desta maneira conseguimos a potência desejada apenas mudando a posição aonde é disparado o TRIAC. A teoria é simples, mas a pratica é um pouco mais complicado, já que o uC precisa saber aonde disparar o TRIAC para obter a potência desejada e para isso ele precisa saber em que ponto do semiciclo da senoide ele esta e em que ponto ele deve disparar o TRIAC para obter a potência desejada. Assim sendo eu utilizamos um circuito Zero Crossing para sincronizar o uC com a rede elétrica, este circuito enviar um sinal (pulso) para o uC toda vez que identifica uma passagem por zero na onda senoidal, conforme a figura abaixo: Os ponto em vermelho na figura são representam as passagens por zero na onda senoidal, o circuito de Zero Crossing retifica essa onda senoidal deixando ela puramente positiva e nas proximidades do zero ele envia um pulso para uC, neste momento o uC sabe que esta no inicio de um semiciclo de onda, a partir deste ponto ele conta o tempo necessário para disparar o TRIAC e obter a potência desejada. No firmware desse uC precisamos ter então uma interrupção externa para captar esse sinal e a partir dele habilitar uma interrupção por timer que no seu estouro dispara o TRIAC no angulo certo para a potência desejada. Por esta razão é necessário configurar o Timer para disparar no intervalo entre 0°~180°, equivalente em tempo 0ms~8,333ms. O programa que já enviei aqui funciona a parte de sincronização, o uC sabe onde esta no semiciclo, mas esta se perdendo onde dispara o TRIAC, porque o Timer1 não esta funcinando direito o que deixa ele bem louquinho chaveando em qualquer posição. Não consegui ser muito objetivo.
  2. @Isadora Ferraz O display já esta funcionando da maneira que deveria, ele deixou de ser problema, no diagrama que mandei ele não esta presente, pois são placas separadas, mas tem o conjunto de pinos ao qual ligo o display, agora o problema é o Timer que não esta disparando e eu não sei o porque, revi varias vezes os registradores e não sei o que estou errando na configuração deles, a conversão que faço é necessária pois o timer1 do atema328p tem dois registradores que armazenam o valor do contador de 0-65535, os dois registradores OCR1AH e OCR1AL armazenam respectivamente os 8 bits mais significativos e o outro os 8 bits menos significativos para ter um total de 16 bits do OCR1A correspondente ao valor de 0-65535. Por isso o valor do tempo que eu calculo naquela regrinha de 3 tem que ser convertido, vou descrever abaixo: Se eu tenho um clock de 16Mhz seu período é o inverso da frequência que é 62,5ns, o máximo de tempo que posso ter no timer1 sem preescaler é então (62,5ns*(2^16)) que é equivalente a 4,096ms. Lembrando que estou chaveando um TRIAC entre o intervalo de 1/120Hz que é equivalente a um período de 8,333ms que é metade de uma senoide, sendo assim o timer1 sem preescaler não atende minhas necessidades. Agora se eu usar o clock de 16Mhz com um preescaler de 8, vou ter um período de 500ns (1/2Mhz), o que me possibilita o tempo máximo de 32,768ms (500ns*(2^16)) no timer1, sendo mais do que necessário para minha aplicação. Agora a regra de três: O timer1 é um timer de 16 bits o que significa que posso ter um contador de 0-65535. Sendo assim: 32,786 ms--------------------65535 ciclos 8,333 ms--------------------~16656 ciclos Como calculo a potência injetada na minha carga: 0 %------------------------100 % >>> setPoint 0 ms-----------------------8,333 ms 0 ciclos -------------------~16656 ciclos >>> Tempo PWR = setPoint*16656/100; Esse valor esta em float preciso dele em int. Tempo = (int)(16656 - PWR); Agora separo os bits mais e menos significativos nas variáveis que passarei para os registradores. msbyte = (Tempo & 0xFF00) >> 8; >>>> mais significativo; lsbyte = Tempo; >>>> menos significativo; Por fim, passo esses valores para os registradores correspondentes. OCR1AH = msbyte; OCR1AL = lsbyte; Espero ter deixado mais claro o que estou fazendo.
  3. Vamos lá depois de ler o que me escreveram eu modifiquei o código. @Isadora Ferraz o tempo de 8333 us é o meio período de uma senoide ou seja 1/120, preciso desse controle preciso pois estarei trabalhando futuramente com controle PID e para manter meu sistema estável preciso controlar a potência da maneira sensível possível. Assim vou poder chavear o TRIAC sempre na mesma posição calculando um valor entre 500us - 7800us, esse recuo se faz necessário para não interferir no meu zero crossing, assim o controle não se perde. @aphawk o que você escreveu esta extremamente certo, eu errei ao tentar mudar frequência de clock pelo código, eu fazia isso no MSP430 setando o clock interno dele e pensei que dava pra fazer isso no atemega328p, então mudei a ideia usando o clock de 16MHz com o preescaler de 8, configurei o Timer1 para fazer interrupção por comparação, sendo assim eu calculo meu tempo no main(), separo os bits mais e menos significavos e transfiro ela para os registradores OCR1AH e OCR1AL e depois a interrupção externa habilita a interrupção pelo Timer1, esse deveria começa a contar e quando desse o estouro a interrupção do Timer1 devia se desabilitar e dar um pulso no meu pino PD2. O que tenho hj um display que funciona bem e uma interrupção de timer1 que não funciona. #include <avr/io.h> #include<avr/interrupt.h> #include <util/delay.h> #define F_CPU 16000000UL float PWR = 1000.00; volatile int Tempo = 1000; char msbyte = 0; char lsbyte = 0; volatile int setPoint = 25; volatile char num[10] = {0x00,0x02,0x08,0x0A,0x04,0x06,0x0C,0x0E,0x01,0x03}; volatile int dez = 0; volatile int uni = 0; volatile int flag_display = 0; void config_uC(){ //Configuração das portas do uC DDRB |= 0xFF; PORTB &= ~0xFF; DDRC &= ~0x03; PORTC |= 0x03; DDRD |= (1<<PD2); PORTD &= ~(1<<PD2); } void config_interrupt(){ //Configuração da interrupção externa PD3/INT0 cli(); EICRA |= (1<<ISC10); EICRA |= (1<<ISC11); EIMSK |= (1<<INT1); sei(); } void config_interrupt_PCINT(){ //Configuração do PCINT cli(); PCICR |= (1<<PCIE1); PCMSK1 |= (1<<PCINT8); PCMSK1 |= (1<<PCINT9); sei(); } void config_interrupt_timer(){ //Configuração da interrupção pelo Timer1 cli(); TCCR1A = 0x00; TCCR1B = (1<<WGM12) + (1<<CS11); //Comparação com OCR1A e Preescaler de 8 OCR1AH = 0x03; //Bits mais significativo OCR1AL = 0xE8; //Bits menos significativo TIMSK1 = 0x00; //Desabilitada a interrupção pelo Timer1 sei(); } void display(int flag){ if(setPoint<10){ setPoint = 10; } if(setPoint>90){ setPoint = 90; } dez = setPoint/10; uni = setPoint%10; if(flag_display){ PORTB &= ~(1<<PB4); PORTB &= ~(0x0F); PORTB |= num[uni]; PORTB |= (1<<PB5); }else{ PORTB &= ~(1<<PB5); PORTB &= ~(0x0F); PORTB |= num[dez]; PORTB |= (1<<PB4); } } void pulso(){ PORTD |= (1<<PD2); _delay_us(10); PORTD &= ~(1<<PD2); } ISR(INT1_vect){ TIMSK1 = 0x02; //Habilita interrupção pelo Timer1 OCR1AH = msbyte; //Transfere os bits mais significativos do tempo calculado OCR1AL = lsbyte; //Transfere os bits menos significativos do tempo calculado flag_display = ~flag_display; display(flag_display); } ISR(PCINT1_vect){ if(PINC&(1<<PC0)){ setPoint++; } if(PINC&(1<<PC1)){ setPoint--; } } ISR(TIMER1_COMPA_vect){ TIMSK1 = 0x00; //Desabilita a ineterrupção pelo Timer1 pulso(); } int main(void) { config_uC(); config_interrupt(); config_interrupt_PCINT(); config_interrupt_timer(); while(1){ PWR = setPoint*16665/100.00; //Calcula o tempo a partir do setPoint inc/decrementado da interrupção PCINT Tempo = (int)(16665 - PWR); //Calcula o tempo e transforma para inteiro. msbyte = (Tempo & 0xFF00) >> 8; //Separa dos bits mais significativos do tempo lsbyte = Tempo; //Separa dos bits menos significativos do tempo } } As linhas a seguir: PWR = setPoint*16665/100.00; Tempo = (int)(16665 - PWR); O numero 16665 é equivalente em tempo a 8333us, que é basicamente uma regra de 3. O (int) serve pra converter o float em um int. O PDF a seguir contem meu esquemático do circuito, aonde tenho meu zero crossing e o circuito de chaveamento do TRIAC. Só falta isso funcionar para eu poder seguir em frente com esse projeto. 12.pdf
  4. O que eu realmente quero fazer é um controle de potência pelo angulo de potência de um triac, eu consegui fazer isso para um PIC16F688 com o clock interno de 4MHz utilizando uma interrupção pelo timer que contava com períodos de 1us. Quero fazer a mesma coisa agora controlar a potência de uma carga, porém quero utilizar um display que projetei com dois botões que controla quanto de potência esta sendo injetada. Segue o código: #include <avr/io.h> #include<avr/interrupt.h> #include <util/delay.h> #define F_CPU 8000000UL //Baixei o clock da CPU para 8MHz, mas não mudei o cristal oscilador que continua com 16MHz //Quero conseguir um periodo de 1us float PWR = 0; float T1 = 0; volatile int Tempo = 0; //Tempo que espero para disparar o TRIAC char msbyte = 0; //Bytes mais significatos do Tempo char lsbyte = 0; //Bytes menos significatos do Tempo volatile int setPoint = 25; volatile char num[10] = {0x00,0x02,0x08,0x0A,0x04,0x06,0x0C,0x0E,0x01,0x03}; volatile int dez = 0; volatile int uni = 0; volatile int flag_display = 0; void config_uC(){ DDRB |= 0xFF; PORTB &= ~0xFF; DDRC &= ~0x03; PORTC |= 0x03; DDRD |= (1<<PD2); PORTD &= ~(1<<PD2); } void config_interrupt(){ //Configuração da Interrupção externa que sincronisa com a rede elétrica (Funcionando direito) cli(); EICRA |= (1<<ISC10); EICRA |= (1<<ISC11); EIMSK |= (1<<INT1); sei(); } void config_interrupt_PCINT(){ //Configuração de interrupção PCINT dos botões que incrementão e decrementão o display (Funciona //Direito) cli(); PCICR |= (1<<PCIE1); PCMSK1 |= (1<<PCINT8); PCMSK1 |= (1<<PCINT9); sei(); } void config_interrupt_timer(){ //Configuração da Interrupção pelo Timer1 deve contar de 1us em 1us até chegar ao tempo //especificado nos registradores OCR1AH e OCR1AL quando estrourar a contagem deve jogar um pulso //em PD2. (Esta parte não esta funcionando.) cli(); TCCR1A = 0x00; TCCR1B |= (1<<WGM12) + (1<<CS11); //Configuro para o mode CTC e divisor de clock por 8. OCR1AH = 0x00; OCR1AL = 0x00; TIMSK1 &= ~0x02; //Inicia desabilitado sei(); } void display(int flag){ //Função do display. (Funciona direito) if(setPoint<10){ setPoint = 10; } if(setPoint>95){ setPoint = 95; } dez = setPoint/10; uni = setPoint%10; if(flag_display){ PORTB |= (1<<PB5); PORTB &= ~(0x0F); PORTB |= num[uni]; _delay_ms(1); PORTB &= ~(1<<PB5); }else{ PORTB |= (1<<PB4); PORTB &= ~(0x0F); PORTB |= num[dez]; _delay_ms(1); PORTB &= ~(1<<PB4); } } void pulso(){ //Função do Pulso. (Funciona Direito) PORTD |= (1<<PD2); _delay_us(10); PORTD &= ~(1<<PD2); } ISR(INT1_vect){ //Aparentemente executa correntamente a interrupção externa pois o display funcina perfeitamente. //porém não tenho certeza se esta habilitando minha interrupção pelo timer1. lsbyte = Tempo; //Pago o bytes menos significativos do tempo. msbyte = (Tempo & 0xFF00) >> 8; //Pago o bytes mais significativos do tempo. OCR1AH = msbyte; //Passo o bytes mais significativos do tempo. OCR1AL = lsbyte; //Passo o bytes menos significativos do tempo. TIMSK1 |= 0x02; //Habilito a interrupção do timer1 flag_display = ~flag_display; //Flag que controla qual segmento do display estou mostrando display(flag_display); //Chamo a função do display } ISR(PCINT1_vect){ //Interrupção PCINT, funciona direito pois muda o valor do meu display. if(PINC&(1<<PC0)){ setPoint++; } if(PINC&(1<<PC1)){ setPoint--; } } ISR(TIMER1_COMPA_vect){ //Interrupção do Timer um por comparação OCR1A, não esta funcionando direito pois não estou //conseguindo controlar o ponto de disparo do TRIAC. TIMSK1 ^= 0x02; //Essa função eu tentei dessa maneira também TIMSK1 &= ~0x02 e também TIMSK1 = 0; pulso(); } int main(void) { config_uC(); config_interrupt(); config_interrupt_PCINT(); config_interrupt_timer(); while(1){ PWR = setPoint*255.00/100.00; T1 = 32.60*(255.00 - PWR); Tempo = (int)T1; //Converto o tempo de float para uma variavél inteira. } } Inseri os comentários de algumas coisas que estou fazendo e o que acho que esta dando problema, sei que a interrupção externa funciona direito com o display, mas a interrupção pelo timer não funciona pois a tensão que meso com o multímetro não muda quando estou setando com o display. Espero que assim tenha explicado melhor o problema. Valeu o interesse de todos no meu probleminha.
  5. Só mais uma pergunta, eu consigo deixar a frequência de clock do meu microcontrolador num período de 1us, pois dai posso usar o time1 do atmega328p para gerar interrupções num período variante de 0 a 8333 us. A ideia é chavear um triac no momento certo para controlar a potência do meu sistema, mas utilizando o delay na interrupção externa interfere demais no meu display. Por isso estava tentando fazer a interrupção pelo timer.
  6. Boa noite, estou tentando fazer uma temporização de 1us usando um atmega328p com cristal oscilador de 16Mhz, só que não esta funcionando direito. Segue o código: #include <avr/io.h> #include<avr/interrupt.h> #include <util/delay.h> #define F_CPU 16000000UL // Variaveis do display volatile int setPoint = 25; volatile char num[10] = {0x00,0x02,0x08,0x0A,0x04,0x06,0x0C,0x0E,0x01,0x03}; volatile int dez = 0; volatile int uni = 0; volatile int cont = 0; void config_uC(){ DDRB |= 0xFF; PORTB &= ~0xFF; DDRC &= ~0x03; PORTC |= 0x03; } void config_interrupt_PCINT(){ cli(); PCICR |= (1<<PCIE1); PCMSK1 |= (1<<PCINT8); PCMSK1 |= (1<<PCINT9); sei(); } void config_interrupt_timer(){ /* cli(); // Temporização de 1ms TCCR0A = 0; TCCR0B |= (1<<CS00) + (1<<CS01); TCNT0 = 5; TIMSK0 |= 0x01; sei(); */ cli(); // Temporização de 1us TCCR0A = 0; TCCR0B |= (1<<CS00); TCNT0 = 239; TIMSK0 &= ~0x01; sei(); } void display(){ if(setPoint<10){ setPoint = 10; } if(setPoint>95){ setPoint = 95; } dez = setPoint/10; uni = setPoint%10; PORTB |= (1<<PB5); PORTB &= ~(0x0F); PORTB |= num[uni]; _delay_ms(1); PORTB &= ~(1<<PB5); PORTB |= (1<<PB4); PORTB &= ~(0x0F); PORTB |= num[dez]; _delay_ms(1); PORTB &= ~(1<<PB4); } ISR(PCINT1_vect){ if(PINC&(1<<PC0)){ } if(PINC&(1<<PC1)){ } } ISR(TIMER0_OVF_vect){ cont++; TCNT0 = 239; if(cont == 10000){ display(); cont = 0; } } int main(void) { config_uC(); config_interrupt_PCINT(); config_interrupt_timer(); while(1){ TIMSK0 |= 0x01; _delay_ms(1000); TIMSK0 &= ~0x01; _delay_ms(1000); } } O que deveria fazer o programa é acender um display em 1 em 1 segundo, isso acontece direito quando uso a temporização de 1ms o display fica acesso sem intermitência, o que rola é que quando uso a temporização de 1us é que ele acende mais com intermitência. Acender de 1 em 1 segundo funciona nos dois, o que estou tentando explicar que a aparencia do de 1ms é mais constante do que o de 1us. Alguém poderia me ajudar a configurar essa temporização de 1us direito.
  7. @Isadora Ferraz Deu certo, o que estava errando alem do vetor de interrupção errado era o recuo antes da passagem de zero, estava muito próximo e por isso o circuito perdia o sincronismo. Segue o código: #include <avr/io.h> #include<avr/interrupt.h> #include <util/delay.h> #define F_CPU 16000000UL float POWER = 10.00; float POWER2 = 10.00; volatile int PWR = 50; volatile int T1 = 0; void config_uC(){ DDRB |= 0xFF; PORTB &= ~0xFF; DDRC &= ~0x03; PORTC |= 0x03; DDRD |= (1<<PD2); PORTD &= ~(1<<PD2); } void config_interrupt(){ cli(); EICRA |= (1<<ISC10); EICRA |= (1<<ISC11); EIMSK |= (1<<INT1); sei(); } ISR(INT1_vect){ _delay_us(T1); PORTD |= (1<<PD2); _delay_us(10); PORTD &= ~(1<<PD2); } int main(void) { config_uC(); config_interrupt(); while(1){ if(POWER<95){ POWER = POWER + 1; PWR = POWER*255.00/100.00; if(POWER == 95){ POWER2 = 95; } } if(POWER2>10){ POWER2 = POWER2 - 1; PWR = POWER2*255.00/100.00; if(POWER2 == 10){ POWER = 10; } } T1 = 32.60*(255.00 - PWR); _delay_ms(50); } }
  8. uhsauhushuashuashu @Isadora Ferrazeu não fiz ctrl-c ctrl-v, semestre passado eu tive que desenvolver um controle de potência AC em Arduíno dai fiz o código que mostrei acima, só que agora precisava desse código em AVR, tentei converter meio que diretão só que não deu boassssssssssssssssss. Por isso estou pedindo socorro aqui, porque para continuar o projeto tenho que controlar essa carga AC sem usar o bootload do arduino Agora estou em casa vou ficar mexendo nisso, se tiver resultado mando aqui kkk
  9. O que ocorre é que a luz fica piscando em vez alternar gradativamente entre a máxima e a minima luminosidade. é a parte do _delay_us(10) deveria ser um inteiro foi um descuido meu. Chegando em casa verei isso.
  10. Estou com o seguinte problema, estou tentando converter um programa que fiz em arduino para AVR, o código em arduino é o seguinte: int Vout = 6; float POWER = 2.00; float POWER2 = 2.00; volatile float PWR = 0; void setup() { pinMode(Vout, OUTPUT); attachInterrupt(0, ZeroCross, RISING); } void loop() { if(POWER<96){ POWER = POWER + 1; PWR = POWER*255.00/100.00; if(POWER == 95){ POWER2 = 95; } } if(POWER2>2){ POWER2 = POWER2 - 1; PWR = POWER2*255.00/100.00; if(POWER2 == 2){ POWER = 2; } } delay(150); } void ZeroCross(){ float T1 = 32.60*(255.00 - PWR); delayMicroseconds(T1); digitalWrite(Vout, HIGH); delayMicroseconds(8.33); digitalWrite(Vout, LOW); } Esse código funciona direitinho, é basicamente um dimmer que fica aumentando a intensidade de uma lampada e diminuindo. O que quero fazer e transforma esse código para baixo nivel. Segue minha tentativa falha: #include <avr/io.h> #include <util/delay.h> #include<avr/interrupt.h> float POWER = 2.00; float POWER2 = 2.00; volatile float PWR = 0; void config_uC(){ DDRD &= ~(1<<PD2); PORTD |= (1<<PD2); DDRD |= (1<<PD6); PORTD &= ~(1<<PD6); } void config_interrupt(){ cli(); EICRA |= (1<<ISC00); EICRA |= (1<<ISC01); EIMSK |= (1<<INT0); sei(); } ISR(INT0_vect){ float T1 = 32.60*(255.00 - PWR); _delay_us(T1); PORTD |= (1<<PD6); _delay_us(8.33); PORTD &= ~(1<<PD6); } int main(void) { config_uC(); while(1){ if(POWER<96){ POWER = POWER + 1; PWR = POWER*255.00/100.00; if(POWER == 95){ POWER2 = 95; } } if(POWER2>2){ POWER2 = POWER2 - 1; PWR = POWER2*255.00/100.00; if(POWER2 == 2){ POWER = 2; } } _delay_ms(150); } } Espero que alguém possa me ajudar, porque faz um tempo que estou tentando fazer isso.
  11. Realmente eu errei ali, depois que troquei para public ele funcionou, porém estou com mais um probleminha, deixa eu explicar o que é, nessa parte do codigo: class aluguel:public cadastro, imovel, tipo { private: float aluguels; int prazo; cadastro proprietario; public: aluguel(); aluguel(char n[], char t[], char e[], char b[], float a, int q, char ti[], float al, int pr, cadastro prop); void getdata(); void putdata(); }; eu preciso chamar as variáveis da classe cadastro, então faço "cadastro proprietário", quando faço um getdata ou putdata funciona bem, mas quando tempo iniciar uma variável com argumentos dai as coisa ficam confusas, segue o metodo: aluguel::aluguel(char n[], char t[], char e[], char b[], float a, int q, char ti[], float al, int pr, cadastro prop):cadastro(n,t),imovel(e,b,a,q),tipo(ti){ aluguels = al; prazo = pr; } Eu não sei como fazer isso para iniciar com argumento.
  12. @vangodp Na verdade a classe venda tem uma herança que é a classe tipo. ta declarada logo acima.
  13. @vangodpValeu amigo isso vai ajudar muito, não tava entendendo direito o que era pra fazer. Aproveitando o post, agora estou com problema nesse código, segue: CLASS class cadastro { private: char nome[30]; char telefone[20]; public: cadastro(); cadastro(char n[], char t[]); void getdata(); void putdata(); }; class imovel { private: char endereco[30]; char bairro[20]; float area; int quartos; public: imovel(); imovel(char e[], char b[], float a, int q); void getdata(); void putdata(); }; class tipo { private: char tip[20]; public: tipo(); tipo(char ti[]); void getdata(); void putdata(); }; class venda: private cadastro, imovel, tipo { private: float valor; public: venda(); venda(char n[], char t[], char e[], char b[], float a, int q, char ti[], int v); void getdata(); void putdata(); }; class aluguel:private cadastro, imovel, tipo { private: float aluguels; int prazo; cadastro proprietario; public: aluguel(); aluguel(char n[], char t[], char e[], char b[], float a, int q, char ti[], float al, int pr); void getdata(); void putdata(); }; METODOS #include <iostream> #include <string.h> #include "cadastro.h" using namespace std; cadastro::cadastro(){ strcpy(nome,""); strcpy(telefone,"");; } cadastro::cadastro(char n[], char t[]){ strcpy(nome,n); strcpy(telefone,t); } void cadastro::getdata(){ cout << "\nNome: "; cin >> nome; cout << "\nTelefone: "; cin >> telefone; } void cadastro::putdata(){ cout << "\nNome: " << nome; cout << "\nTelefone: " << telefone; } imovel::imovel(){ strcpy(endereco,""); strcpy(bairro,""); area = 0; quartos = 0; } imovel::imovel(char e[], char b[], float a, int q){ strcpy(endereco,e); strcpy(bairro,b); area = a; quartos = q; } void imovel::getdata(){ cout << "\nEndereco: "; cin >> endereco; cout << "\nBairro: "; cin >> bairro; cout << "\nArea Util: "; cin >> area; cout << "\nQuartos: "; cin >> quartos; } void imovel::putdata(){ cout << "\nEndereco: " << endereco; cout << "\nBairro: " << bairro; cout << "\nArea Util: " << area; cout << "\nQuartos: " << quartos; } tipo::tipo(){ strcpy(tip,""); } tipo::tipo(char ti[]){ strcpy(tip,ti); } void tipo::getdata(){ cout << "\nTipo: "; cin >> tip; } void tipo::putdata(){ cout << "\nTipo: " << tip; } venda::venda():cadastro(),imovel(),tipo(){ valor = 0; } venda::venda(char n[], char t[], char e[], char b[], float a, int q, char ti[], int v){ cadastro(n,t); imovel(e,b,a,q); tipo(ti); // -> Aqui da um erro de sombreamento valor = v; } void venda::getdata(){ cout << "\nProprietario: "; cadastro::getdata(); cout << "\nImovel: "; imovel::getdata(); tipo::getdata(); cout << "\nValor R$: "; cin >> valor; } void venda::putdata(){ cout << "\nProprietario:"; cadastro::putdata(); cout << "\n\nImovel:"; imovel::putdata(); tipo::putdata(); cout << "\tValor: " << valor; } aluguel::aluguel():cadastro(),imovel(),tipo(){ aluguels = 0; prazo = 0; } aluguel::aluguel(char n[], char t[], char e[], char b[], float a, int q, char ti[], float al, int pr){ cadastro(n,t); imovel(e,b,a,q); tipo(ti); // -> Aqui da um erro de sombreamento aluguels = al; prazo = pr; } void aluguel::getdata(){ cout << "\nProprietario: "; proprietario.getdata(); cout << "\nInquilino: "; cadastro::getdata(); cout << "\nImovel: "; imovel::getdata(); tipo::getdata(); cout << "\nAluguel: "; cin >> aluguels; cout << "\nPrazo de Contrato: "; cin >> prazo; } void aluguel::putdata(){ cout << "\nProprietario: "; proprietario.putdata(); cout << "\n\nInquilino: "; cadastro::putdata(); cout << "\n\nImovel: "; imovel::putdata(); tipo::putdata(); cout << "\n\nAluguel: " << aluguels; cout << "\tPrazo de Contrato: " << prazo; } Aonde marquei no código da um erro que eu não consigo reverter aparece o seguinte aviso "declaration of 'tipo tip' shadows a parameter". Mas procuro no codigo e não acho a sobreposição.
  14. Minha professora passou esse exercício mas não entendi direito o que é pra fazer. Segue exercicio: •Defina uma classe chamada String. •A classe deve permitir comparações (<, >, ==) e concatenações (+ , +=). * •Criar um programa principal para testar a classe. *Sobrecarga O que fiz até agora: CLASSE class caracter{ private: char palavra[20]; public: caracter(); caracter(char p[]); caracter operator <(caracter p); caracter operator >(caracter p); caracter operator == (caracter p); caracter operator + (caracter p); caracter operator += (caracter p); }; METODOS #include <iostream> #include <string.h> #include "caracter.h" using namespace std; caracter::caracter(){ palavra[0] = '/0'; } caracter::caracter(char p[]){ strcpy(palavra,p); } caracter caracter::operator <(caracter p){ } caracter caracter::operator >(caracter p){ } caracter caracter::operator == (caracter p){ } caracter caracter::operator + (caracter p){ } caracter caracter::operator += (caracter p){ } O que não entendi é as comparações e concatenações que tem que fazer. Não achei exemplos na internet.
  15. Como configuro o ADC do MSP430 para fazer aquisição de leitura de duas portas, pois preciso ler dois sensores. O que tentei fazer foi isso. void config_adc(){ ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON + ADC10IE + MSC; ADC10CTL1 = INCH_7 + CONSEQ_3; ADC10AE0 |= BIT6 + BIT7; ADC10DTC1 = 2; }
  16. @aphawk Desculpe incomodar, mas tem algo a mais que devo saber, ou tipo uma instrução de como fazer a gravação quero eliminar essa variável de uma vez do projeto.
  17. @aphawk O que exatamente você usa pra fazer a gravação, falo dos programas, pois estou usando o codeblocks pra compilar o programa e gravando usando uma tools que utiliza o AVRDUDESS, quando tento gravar direto pelo ARVDUDESS não da certo sempre falha. @test man*~ Então vou tentar usando essa configuração de fuses se der certo aviso. adicionado 6 minutos depois @test man*~ Então não deu certo com esses fuses. contia o mesmo problema.
  18. Estou com o seguinte problema, estou testando um hardware que projetei é basicamente um Arduíno standealone com um cristal oscilador de 16Mhz. Estou gravando um codigo blink simples e utilizo a porta PB5 para acender o led e gravo utilizando um USBasp usando a configuração ICSP. O problema é que a oscilação do led que defini em 1000ms esta demorando muito mais tempo do que especifiquei. Segue a configuração dos fuses: #include <avr/io.h> FUSES = { .low = LFUSE_DEFAULT, .high = HFUSE_DEFAULT, .extended = EFUSE_DEFAULT }; Ja tentei mudar o fuse .extended para: .extended = 0x3F .extended = 0x7F .extended = 0xE0 Segue codigo blink gravado: #include <avr/io.h> #include <util/delay.h> void config_uc(){ DDRB |= (1<<PB5); PORTB &= ~(1<<PB5); } int main(void){ config_uc(); while(1){ PORTB ^= (1<<PB5); _delay_ms(1000); } return 0; } Segue a imagem do esquemático do projeto: Se alguém poder dar uma luz eu agradeceria muito.
  19. Então a ideia não é fazer um VU kkkkkk Era fazer uma barra pra mostrar um máximo e minimo, e como vou estar usando interrupção para as operações não tem problema esse consumir processamento. Segue o vídeo novamente. @aphawk WhatsApp_Video_2017-05-27_at_21_21_29.mp4
  20. Dae pessoal retornando com o resultado das sugestões e solução que me falaram. Consegui fazer o bargraph de leds usando apenas duas portas do arduino. Segue abaixo o código que utilizei. int CLK = 9; // set o pino que gera a contagem int RST = 8; // set o pino que reset a contagem int i = 0; int n = 0; void setup() { pinMode(CLK, OUTPUT); pinMode(RST, OUTPUT); digitalWrite(CLK, LOW); digitalWrite(RST, LOW); Serial.begin(9600); } void loop() { n = analogRead(0); n = map(n, 0, 1020, 1, 10); // não usar até o fim da escala do AD para evitar piscar o ultimo led Serial.println(n); for(i=1;i<n;i++){ digitalWrite(CLK, HIGH); delay(1); digitalWrite(CLK, LOW); delay(1); } digitalWrite(RST, HIGH); delay(1); digitalWrite(RST, LOW); delay(1); } O diagrama esquemático do circuito que fiz para o bargraph segue abaixo. A ideia é simples o FOR faz a contagem dos leds conforme o valor do AD lido de um potenciômetro, essa contagem acende cada um dos leds individualmente, porém como a contagem é muito rápida a impressão visual é a de que os leds estão todos acesos ao mesmo tempo. O papel do reset nesse circuito é a de fazer a contagem voltar para o zero, espero que eu tenha sido claro na explicação se tiverem duvidas estarei aqui pra responder. Segue tambem um videosinho. WhatsApp_Video_2017-05-27_at_21_21_29.mp4
  21. Então pessoal, pelo tempo e pelo custo, optei por usar o atmega 328, para acelerar o projeto, acho que ele vai ser o suficiente para conseguir fazer o projeto, porém a unica coisa que ainda não sei configurar nele ainda e o ADC, vou programa-lo usando o AVR, pois a ideia é fazer algo comercial. Vou utilizar o esquema de um arduino standalone e gravar com um drive FTDI, se alguém tiver alguma ideia melhor estou escutando. Ta valendo tudo. A deixa eu agradecer a todos que me responderam você ajudam demais.
  22. Ola, estou com o seguinte problema quero fazer um display de 7 segmentos ou barra de led array, porém estou limitado pelo numero de pinos do microcontrolador. O quero fazer é um display de 7 segmentos conforme a imagem abaixo mas queria diminuir o numero de pinos utilizando algum outro CI. A segunda ideia que queria fazer é um barramento de leds estilo aquele equalizadores de som que acendem gradativamente cada um dos leds até todos estiverem acesos no barramento. E para isso preciso de CI que faça essa contagem mantendo os leds acesos. Alguém poderia me ajudar?
  23. É muito conhecimento numa pagina só, vou verificar tudo o que vocês me mandaram. Acho que vai rolar fazer esse projeto de maneira bem econômica e eficaz. Obrigado @Isadora Ferraz e @Bommu Perneta, vocês sempre estão a pronta disposição.
  24. Não consigo achar o microcontrolador st8m8s005k6t6 no site da microchip. Pode me mandar o link. E como você ganhou o programador ST me interesso muito kkkk
  25. Valeu, vou pensar na sua ideia depois te falo o que fiz, beleza.

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!