LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: g3net em 15 de Novembro de 2016, 08:53
-
Boas pessoal,
Estou á procura de alguém que consiga programar ATMEL/AVR para um projecto que estou a desenvolver, temos tudo feito só algumas dificuldades agora com a compilação da rotina. Somos de Lisboa, aguardo vossas respostas obrigado.
-
Estas num forum, podes colocar directamente o problema e eventualmente alguem que saiba pode responder logo.
ou estas à procura de ajuda presencial?
-
Mas dificuldades ao nivel de compilação em si?
Ou falta de know how na programação?
É Atmel mesmo ou é arduino(a usar o IDE/blibiotecas do mesmo)?
Sem mais informação é complicado de ajudar.
/tinfoilHat:
Tens um ip engraçado..
-
Boas Pessoal,
A dificuldade que encontrei foi na compilação e não tou a conseguir ultrapassar, a rotina está feita em C e estou a usar o ATMEL STUDIO 7 para compilar e escrever no micro, mas começei por ter erros nas bibliotecas e agora tenho erros por falta de instruções.
É mesmo ATMEL e não ARDUINO estou a usar o micro controlador ATMEGA32L
O programa é:
#include <Mega32.h>
#include <delay.h>
#include <stdio.h>
#define begin {
#define end }
#define terminator 15
#define LCDwidth 16
char lcd_buffer[17];
int pulse_counter;
int light_timer;
int pong_timer;
int count;
int v1, v2, v3, v4, v5, v6, v7;
int avg;
int total_count;
int dist;
char c;
int timer;
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
void light_flashing(void);
interrupt [TIM2_COMP] t2_compare(void)
begin
if((count==0) || (count==4) || (count==8) || (count==12) || (count==16))// || (count==20))
begin
PORTB = 0xff;
end
if((count==2) || (count==6) || (count==10) || (count==14) || (count==18))// || (count==22))
begin
PORTB = 0xfe;
if (count==2)
begin
pong_timer = 0;
end
TCNT1 = 0;
end
count++;
if(count==700)
begin
count = 0;
pulse_counter++;
end
pong_timer++;
end
void light_flashing(void)
begin
light_timer++;
if ((avg>0) && (avg <= 15))
begin
PORTA = 0x3f;
end
else if ((avg > 15) && (avg <= 20))
begin
PORTA = 0x1f;
end
else if ((avg > 20) && (avg <= 25))
begin
PORTA = 0x0f;
end
else if ((avg > 25) && (avg <= 30))
begin
PORTA = 0x07;
end
else if ((avg > 30) && (avg <= 35))
begin
PORTA = 0x03;
end
else if (avg > 35)
begin
PORTA = 0x01;
end
end
void sound_gen(void)
begin
if(timer==0)
begin
TCCR0=0;
end
if((avg>0) && (avg <= 15))
begin
if(timer==3)
begin
TCCR0 = 0x1c;
end
timer++;
if(timer>=6)
begin
timer = 0;
end
end
if((avg>15) && (avg <= 20))
begin
if(timer==5)
begin
TCCR0 = 0x1c;
end
timer++;
if(timer>=10)
begin
timer = 0;
end
end
if((avg>20) && (avg <= 25))
begin
if(timer==6)
begin
TCCR0 = 0x1c;
end
timer++;
if(timer>=12)
begin
timer = 0;
end
end
if((avg>25) && (avg <= 30))
begin
if(timer==7)
begin
TCCR0 = 0x1c;
end
timer++;
if(timer>=14)
begin
timer = 0;
end
end
if((avg>30) && (avg <= 35))
begin
if(timer==8)
begin
TCCR0 = 0x1c;
end
timer++;
if(timer>=16)
begin
timer = 0;
end
end
if(avg>35)
begin
if(timer==9)
begin
TCCR0 = 0x1c;
end
timer++;
if(timer>=18)
begin
timer = 0;
end
end
end
void main(void)
begin
TCCR2=0x09;
OCR2 = 49;
TCCR0 = 0;
OCR0 = 7;
TIMSK = 0x80;
DDRB = 0x01;
PORTB = 0x00;
DDRA = 0xff;
PORTA = 0;
pulse_counter = 0;
light_timer = 0;
pong_timer = 0;
count = 0;
c=1;
v1=0;
v2=0;
v3=0;
v4=0;
v5=0;
v6=0;
v7=0;
total_count = 0;
timer = 0;
lcd_init(LCDwidth);
lcd_clear();
PushState = NoPush;
lcd_clear();
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"%-i",value);
lcd_puts(lcd_buffer);
lcd_gotoxy(0,0);
lcd_putsf("BIKE ALERT ULTRASONIC 2016");
lcd_init(LCDwidth);
lcd_clear();
#asm
sei
#endasm
while(1)
begin
if ((count>=40) && (PINB.1))
begin
v1=pong_timer;
v1 = ((int)(((double)v1)*.2125)/2.0);
pulse_counter = 0;
avg = (v1+v2+v3+v4+v5+v6+v7)/7;
v2 = v1;
v3 = v2;
v4 = v3;
v5 = v4;
v6 = v5;
v7 = v6;
total_count++;
sound_gen();
if ((c==1) && (total_count==7))
begin
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%-i",dist);
lcd_puts(lcd_buffer);
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"%-i",v1);
lcd_puts(lcd_buffer);
lcd_gotoxy(0,0);
lcd_putsf("Distancia = ");
lcd_gotoxy(12,0);
sprintf(lcd_buffer,"%-i",avg);
lcd_puts(lcd_buffer);
c++;
total_count = 0;
end
if ((c==2) && (total_count==7))
begin
lcd_gotoxy(8,0);
sprintf(lcd_buffer,"%-i",avg);
lcd_puts(lcd_buffer);
c++;
total_count = 0;
end
if ((c==3) && (total_count==7))
begin
lcd_gotoxy(14,0);
sprintf(lcd_buffer,"%-i",avg);
lcd_puts(lcd_buffer);
c++;
total_count = 0;
end
light_flashing();
end
begin
PORTA = 0x00;
TCCR0 = 0;
end
end
end
-
Esse código é ilegível. :o
Substituir parte da linguagem com #defines é para ninguém conseguir tocar no código. A ajuda que precisam vai para além do que se dá num fórum, é trabalho para ser remunerado. I'm out :-X
-
Boas
Não nos importamos k seja renumerado, pois temos de apresentar o prototipo e precisamos de adaptar ainda melhor o software ao hardware que ja temos todo feito e testado por blocos e estamos presos por isto.
Se alguém tiver interessado e for de Lisboa digam que marcamos uma reuniao onde quiserem, obrigado.
-
Realmente fica difícil ajudar com algo assim tão vago e com tão poucos comentários no código...
Mas da leitura do código só fiquei foi a pensar o que é que o pessoal tem contra as chavetas!? Só me lembra código em Pascal ;)
-
Realmente esse begin e esse end :/
O que é que está ligado a cada pino?
O que é que não funciona?
Estão a usar algum cristal externo?
Se sim, de quantos Mhz?
Há esquema que possam/queiram aqui postar?
Ajudava um bocadinho.
O begin e o end a substituir {} não faz qualquer sentido e só causa mais confusão a ler o código.
Não precisam de #asm sei quando podem simplesmente usar sei();
O código tanto do pisca leds e do som podem ser BASTANTE simplificados, dado que um é á primeira vista uma comparação com meia duzia de valores, bastava ler meia duzia de valores de um array e não precisam de ligar e desligar o timer um monte de vezes é só mudar o valor do OCR para 0 ou 255 conforme o que lá têm pendurado para não fazer mais barulho, mas deve ser um buzzer.
O pisca pisca dos leds é right shift( >> )
Que biblioteca de lcd estão a usar?
Usar um equ __ para definir algo que o mais certo é ser definido no .h da biblioteca para o lcd é no minimo meio estranho :/
Está a usar um sonar com saida pwm e a usar input capture para contar pulsos e a partir dai ter um valor de distância?
Incrementam o valor de c três vezes e depois nunca mais fazer nada á variável nem a voltam a meter a 1 para o primeiro if voltar a dar true, que provavelmente deve ser um dos vossos muitos problemas com o código.
Código ligeiramente formatado e com o minimo de comentários..
#include <Mega32.h>
#include <delay.h>
#include <stdio.h>
#include <avr/interrupt.h>
#define terminator 15
#define LCDwidth 16
char lcd_buffer[17];
int pulse_counter;
int light_timer;
int pong_timer;
int count;
int v1, v2, v3, v4, v5, v6, v7;
int avg;
int total_count;
int dist;
char c;
int timer;
#asm
.equ __lcd_port=0x15
#}asm
#include <lcd.h>
void light_flashing(void);
interrupt [TIM2_COMP] t2_compare(void){
if((count==0) || (count==4) || (count==8) || (count==12) || (count==16)){ // || (count==20))
PORTB = 0xff;
}
if((count==2) || (count==6) || (count==10) || (count==14) || (count==18)){ // || (count==22))
PORTB = 0xfe;
if (count==2){
pong_timer = 0;
}
TCNT1 = 0;
}
count++;
if(count==700){
count = 0;
pulse_counter++;
}
pong_timer++;
}
void light_flashing(void){
light_timer++;
if ((avg>0) && (avg <= 15)){
PORTA = 0x3f;
}
else if ((avg > 15) && (avg <= 20)){
PORTA = 0x1f;
}
else if ((avg > 20) && (avg <= 25)){
PORTA = 0x0f;
}
else if ((avg > 25) && (avg <= 30)){
PORTA = 0x07;
}
else if ((avg > 30) && (avg <= 35)){
PORTA = 0x03;
}
else if (avg > 35){
PORTA = 0x01;
}
}
void sound_gen(void){
if(timer==0){
TCCR0=0;
}
if((avg>0) && (avg <= 15)){
if(timer==3){
TCCR0 = 0x1c; //0001 1100
//_BV(COM00)|_BV(WGM01)|_BV(CS02)
//CTC mode
//Toggle OC0 on compare match
//CLK/256 prescaller
//
}
timer++;
if(timer>=6){
timer = 0; //timer off
}
}
if((avg>15) && (avg <= 20)){
if(timer==5){
TCCR0 = 0x1c;
}
timer++;
if(timer>=10){
timer = 0;
}
}
if((avg>20) && (avg <= 25)){
if(timer==6){
TCCR0 = 0x1c;
}
timer++;
if(timer>=12){
timer = 0;
}
}
if((avg>25) && (avg <= 30)){
if(timer==7){
TCCR0 = 0x1c;
}
timer++;
if(timer>=14){
timer = 0;
}
}
if((avg>30) && (avg <= 35)){
if(timer==8){
TCCR0 = 0x1c;
}
timer++;
if(timer>=16){
timer = 0;
}
}
if(avg>35){
if(timer==9){
TCCR0 = 0x1c;
}
timer++;
if(timer>=18){
timer = 0;
}
}
}
void main(void){
TCCR2=0x09; //0000 1001 _BV(WGM21)|_BV(CS20)
//Timer 2 in CTC MODE with OCR2 as TOP
//No prescalling of CLK
//
OCR2 = 49; //6us period(at 8Mhz) ???
TCCR0 = 0; //Free runing timer
OCR0 = 7;
TIMSK = 0x80; //_BV(OCIE2) Timer/Counter2 Output Compare Match Interrupt Enable
DDRB = 0x01;
PORTB = 0x00;
DDRA = 0xff;
PORTA = 0;
pulse_counter = 0;
light_timer = 0;
pong_timer = 0;
count = 0;
c=1;
v1=0;
v2=0;
v3=0;
v4=0;
v5=0;
v6=0;
v7=0;
total_count = 0;
timer = 0;
lcd_init(LCDwidth);
lcd_clear();
PushState = NoPush;
lcd_clear();
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"%-i",value);
lcd_puts(lcd_buffer);
lcd_gotoxy(0,0);
lcd_putsf("BIKE ALERT ULTRASONIC 2016");
lcd_init(LCDwidth);
lcd_clear();
sei();
while(1){
if ((count>=40) && (PINB.1)){
v1=pong_timer;
v1 = ((int)(((double)v1)*.2125)/2.0);
pulse_counter = 0;
avg = (v1+v2+v3+v4+v5+v6+v7)/7;
v2 = v1;
v3 = v2;
v4 = v3;
v5 = v4;
v6 = v5;
v7 = v6;
total_count++;
sound_gen();
if ((c==1) && (total_count==7)){
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%-i",dist);
lcd_puts(lcd_buffer);
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"%-i",v1);
lcd_puts(lcd_buffer);
lcd_gotoxy(0,0);
lcd_putsf("Distancia = ");
lcd_gotoxy(12,0);
sprintf(lcd_buffer,"%-i",avg);
lcd_puts(lcd_buffer);
c++;
total_count = 0;
}
if ((c==2) && (total_count==7)){
lcd_gotoxy(8,0);
sprintf(lcd_buffer,"%-i",avg);
lcd_puts(lcd_buffer);
c++;
total_count = 0;
}
if ((c==3) && (total_count==7)){
lcd_gotoxy(14,0);
sprintf(lcd_buffer,"%-i",avg);
lcd_puts(lcd_buffer);
c++;
total_count = 0;
}
light_flashing();
}
//{ useless brakets
//
PORTA = 0x00;
TCCR0 = 0;
//}
}
}
Comecem a debitar respostas sff.
Isto é trabalho de quê?
PAP?
Universidade?(medo :/ )
Secundário?
Não, não vos vou bater, mas quero ter noção de que nivel de educação têm e de como vos posso responder para que entendam a coisa.
-
Esse código é ilegível. :o
Substituir parte da linguagem com #defines é para ninguém conseguir tocar no código. A ajuda que precisam vai para além do que se dá num fórum, é trabalho para ser remunerado. I'm out :-X
:%s/foo/bar/g
gg=G
E metade do horror fica bonito em 2 segundos ;)
-
alguém que lhe ensine ou que meta o código com bbcode pra código
(editar-lhe o post e meter o codigo)
-
Não deves ter visto a minha resposta..
-
Aqui vao as respostas Senso
Realmente esse begin e esse end :/
O que é que não funciona?
O Hardware está todo a funcionar, claro simulando os sinais que o micro deveria gerar. Este codigo foi enviado por uns colegas de uma universidade americana para um projecto que tinhamos em conjunto, sendo que o codigo era totalmente deles, a mim so me interessou projectar o hardware para o que eles me indicaram necessitar e claro que me enviaram o fluxograma do codigo mas o codigo propriamente dito nao me interessou por nao ser eu que o estava a desenvolver, o problema começou quando esse elemento americano simplesmente saiu do projecto e enviou isto assim... Apesar de isto fazer parte de apenas 1 dos módulos do projecto (e a unica que estavamos dependentes deles), é uma parte muito importante pois é o modulo de sonar e sem ele o resto fica cego...
Estão a usar algum cristal externo?
Se sim, de quantos Mhz?
Sim, 16MHz
Há esquema que possam/queiram aqui postar?
Basicamente neste módulo recorresse a um ATMEGA32L que á parte das ligações obvias temos o PB0 com a ligação ao circuito emissor que tem um amplificador pelo caminho e o tx do transceiver. Na porta PB1 temos a recepção com recurso previo a um amplificador e um Schmitt trigger, depois da PA0 á PA7 temos saidas que são accionadas consoante os niveis da recepção. Depois estes sinais vão accionar outros modulos. Na porta PD0 a PD7 temos a ligação do LCD e PC6 e PC7 tambem ao LCD.
Ajudava um bocadinho.
O begin e o end a substituir {} não faz qualquer sentido e só causa mais confusão a ler o código.
Não precisam de #asm sei quando podem simplesmente usar sei();
O código tanto do pisca leds e do som podem ser BASTANTE simplificados, dado que um é á primeira vista uma comparação com meia duzia de valores, bastava ler meia duzia de valores de um array e não precisam de ligar e desligar o timer um monte de vezes é só mudar o valor do OCR para 0 ou 255 conforme o que lá têm pendurado para não fazer mais barulho, mas deve ser um buzzer.
Sim é um Buzzer
O pisca pisca dos leds é right shift( >> )
Que biblioteca de lcd estão a usar?
Esse é outro problema que eles sairam na altura da implementação do LCD, este LCD vai ser apenas para leituras tecnicas e não vai existir no produto final, mas é importante para vermos as leituras durante a calibragem do circuito no seu total. O LCD que vamos colocar é um LCD alfanumerico 16x2 com chipset HD44780.
Usar um equ __ para definir algo que o mais certo é ser definido no .h da biblioteca para o lcd é no minimo meio estranho :/
Está a usar um sonar com saida pwm e a usar input capture para contar pulsos e a partir dai ter um valor de distância?
SIM
Incrementam o valor de c três vezes e depois nunca mais fazer nada á variável nem a voltam a meter a 1 para o primeiro if voltar a dar true, que provavelmente deve ser um dos vossos muitos problemas com o código.
Tambem acho
Código ligeiramente formatado e com o minimo de comentários..
#include <Mega32.h>
#include <delay.h>
#include <stdio.h>
#include <avr/interrupt.h>
#define terminator 15
#define LCDwidth 16
char lcd_buffer[17];
int pulse_counter;
int light_timer;
int pong_timer;
int count;
int v1, v2, v3, v4, v5, v6, v7;
int avg;
int total_count;
int dist;
char c;
int timer;
#asm
.equ __lcd_port=0x15
#}asm
#include <lcd.h>
void light_flashing(void);
interrupt [TIM2_COMP] t2_compare(void){
if((count==0) || (count==4) || (count==8) || (count==12) || (count==16)){ // || (count==20))
PORTB = 0xff;
}
if((count==2) || (count==6) || (count==10) || (count==14) || (count==18)){ // || (count==22))
PORTB = 0xfe;
if (count==2){
pong_timer = 0;
}
TCNT1 = 0;
}
count++;
if(count==700){
count = 0;
pulse_counter++;
}
pong_timer++;
}
void light_flashing(void){
light_timer++;
if ((avg>0) && (avg <= 15)){
PORTA = 0x3f;
}
else if ((avg > 15) && (avg <= 20)){
PORTA = 0x1f;
}
else if ((avg > 20) && (avg <= 25)){
PORTA = 0x0f;
}
else if ((avg > 25) && (avg <= 30)){
PORTA = 0x07;
}
else if ((avg > 30) && (avg <= 35)){
PORTA = 0x03;
}
else if (avg > 35){
PORTA = 0x01;
}
}
void sound_gen(void){
if(timer==0){
TCCR0=0;
}
if((avg>0) && (avg <= 15)){
if(timer==3){
TCCR0 = 0x1c; //0001 1100
//_BV(COM00)|_BV(WGM01)|_BV(CS02)
//CTC mode
//Toggle OC0 on compare match
//CLK/256 prescaller
//
}
timer++;
if(timer>=6){
timer = 0; //timer off
}
}
if((avg>15) && (avg <= 20)){
if(timer==5){
TCCR0 = 0x1c;
}
timer++;
if(timer>=10){
timer = 0;
}
}
if((avg>20) && (avg <= 25)){
if(timer==6){
TCCR0 = 0x1c;
}
timer++;
if(timer>=12){
timer = 0;
}
}
if((avg>25) && (avg <= 30)){
if(timer==7){
TCCR0 = 0x1c;
}
timer++;
if(timer>=14){
timer = 0;
}
}
if((avg>30) && (avg <= 35)){
if(timer==8){
TCCR0 = 0x1c;
}
timer++;
if(timer>=16){
timer = 0;
}
}
if(avg>35){
if(timer==9){
TCCR0 = 0x1c;
}
timer++;
if(timer>=18){
timer = 0;
}
}
}
void main(void){
TCCR2=0x09; //0000 1001 _BV(WGM21)|_BV(CS20)
//Timer 2 in CTC MODE with OCR2 as TOP
//No prescalling of CLK
//
OCR2 = 49; //6us period(at 8Mhz) ???
TCCR0 = 0; //Free runing timer
OCR0 = 7;
TIMSK = 0x80; //_BV(OCIE2) Timer/Counter2 Output Compare Match Interrupt Enable
DDRB = 0x01;
PORTB = 0x00;
DDRA = 0xff;
PORTA = 0;
pulse_counter = 0;
light_timer = 0;
pong_timer = 0;
count = 0;
c=1;
v1=0;
v2=0;
v3=0;
v4=0;
v5=0;
v6=0;
v7=0;
total_count = 0;
timer = 0;
lcd_init(LCDwidth);
lcd_clear();
PushState = NoPush;
lcd_clear();
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"%-i",value);
lcd_puts(lcd_buffer);
lcd_gotoxy(0,0);
lcd_putsf("BIKE ALERT ULTRASONIC 2016");
lcd_init(LCDwidth);
lcd_clear();
sei();
while(1){
if ((count>=40) && (PINB.1)){
v1=pong_timer;
v1 = ((int)(((double)v1)*.2125)/2.0);
pulse_counter = 0;
avg = (v1+v2+v3+v4+v5+v6+v7)/7;
v2 = v1;
v3 = v2;
v4 = v3;
v5 = v4;
v6 = v5;
v7 = v6;
total_count++;
sound_gen();
if ((c==1) && (total_count==7)){
lcd_clear();
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%-i",dist);
lcd_puts(lcd_buffer);
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"%-i",v1);
lcd_puts(lcd_buffer);
lcd_gotoxy(0,0);
lcd_putsf("Distancia = ");
lcd_gotoxy(12,0);
sprintf(lcd_buffer,"%-i",avg);
lcd_puts(lcd_buffer);
c++;
total_count = 0;
}
if ((c==2) && (total_count==7)){
lcd_gotoxy(8,0);
sprintf(lcd_buffer,"%-i",avg);
lcd_puts(lcd_buffer);
c++;
total_count = 0;
}
if ((c==3) && (total_count==7)){
lcd_gotoxy(14,0);
sprintf(lcd_buffer,"%-i",avg);
lcd_puts(lcd_buffer);
c++;
total_count = 0;
}
light_flashing();
}
//{ useless brakets
//
PORTA = 0x00;
TCCR0 = 0;
//}
}
}
Comecem a debitar respostas sff.
Isto é trabalho de quê?
É um projecto que nos foi pedido para participar em multitarefas ou seja existem varios grupos por projecto e cada grupo desenvolve uma área da implementação desde o firmware, hardware, marketing, estudo de mercado e comercialização. É uma ideia inovadora para aproximar grupos universitarios de diferentes paises.
Nós escolhemos este projecto de robótica na vertente do hardware.
PAP?
Universidade?(medo :/ )
POIS
Secundário?
Não, não vos vou bater, mas quero ter noção de que nivel de educação têm e de como vos posso responder para que entendam a coisa.
-
A mim parece-me que é um trabalho mais inglório para quem vos queira ajudar, quando vcs pedem ajuda com um codigo feito e que nao funciona* sem descrição e nao sabendo o objectivo, estar a corrigir codigo dos outros é mais complicado do que começar a fazer um codigo de raiz.
Se de facto esta parte do projecto calhou a outro grupo/universidade, e se o outro grupo funciona só com um elemento do grupo e que "saiu", pra mim era responsabilizar esse grupo a ter de tratar/resolver esse imbróglio. Se calhar vcs estao mais motivados/empenhados no sucesso do trabalho final, mas serem vcs a resolver o problema dos outros e depois os outros a ficarem com a fama do projecto é inaceitável. O que dizem os vossos orientadores/docentes? Vcs teriam de pagar do vosso bolso? (são apenas retóricas)
p.s.: reedita os posts com '['code']' '['/code']' para o código que postaste e '['quote']' '['/quote']' para as citações, senao nao se destingue o que é citado com o que sao as tuas/vossas respostas..ja que o forum tem falta de moderadores :P
(retirando as aspas no bbcodes)