collapse

* Posts Recentes

Serra para metal por fergas
[Hoje às 15:23]


Desenvolver com AVR gcc - como fazer debug ? por vasco
[Hoje às 14:58]


Realinhamento de placas que abatem pelo abatimento do terreno por SerraCabo
[Hoje às 13:11]


Resmas de Trotinetes por KammutierSpule
[19 de Fevereiro de 2019, 17:39]


[Material] Compra de material por papamoscas
[15 de Fevereiro de 2019, 17:05]


Motor com travão por Alfredo Garcia
[13 de Fevereiro de 2019, 22:56]


Porta Arduino Baixando tensao por mauriciosouza100
[08 de Fevereiro de 2019, 13:39]


Fábricas de componentes electrónicos em Portugal? por SerraCabo
[07 de Fevereiro de 2019, 13:54]


Sistema embarcado movido a energia solar por Njay
[06 de Fevereiro de 2019, 15:01]


Tentanto reaver alguns conhecimentos de eletronica por filjoa
[06 de Fevereiro de 2019, 02:58]

Autor Tópico: Ajuda em código C  (Lida 1052 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Ajuda em código C
« em: 12 de Setembro de 2012, 17:02 »
Boas. Há uma semanita comecei a ler algumas coisas sobre programação de microcontroladores avr em C. Aprendi já o básico, então decidi criar uma biblioteca para poder comunicar via Serial com quaisquer pinos do microcontrolador.
Vi uns gráficos que me ajudaram bastante e finalmente consegui enviar informação para o computador.
Tentei hoje então criar o código para receber a informação do computador, mas estou a ter problemas nesta parte...

O código para receber a informação funciona, mas ao incluir uma interrupção deixou de funcionar. Quer dizer, o código funciona na mesma, mas a variável buf aparece vazia no loop, assim como a buflen, apesar de ter sido alteradas na interrupção.
Quando tento fazer PrintSerial de dentro da interrupção obtenho no Serial Monitor a informação correcta, mas de fora da interrupção os valores dessas variáveis estão inalterados...
Estou a fazer alguma coisa mal?

Está aqui o código:
Código: [Seleccione]
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "Serial.h"
#include <avr/interrupt.h>

char buf[20];
int buflen = 0;

int main(void)
{
DDRB |= (1<<PB5);
TCCR1B = (1<<WGM12)|(1<<CS10);
OCR1A =  1;
TIMSK1 = (1<<OCIE1A);
DDRD &= ~(1<<PD0);
InitSerial();
sei();

    while(1)
    {
cli();
PrintSerial(buf); //Aqui a variável está vazia, pelo menos não consigo receber nada no Serial Monitor...
_delay_ms(1000);
sei();
    }
return 0;
}


ISR(TIMER1_COMPA_vect){
if ((PIND & (1<<PD0)) == 0) {
_delay_us(52);
char bits[7];
for (int i=0;i<=7;i++) {
_delay_us(104);
bits[i] = (PIND & (1<<PD0));
}
char byte = 128*bits[7] + 64*bits[6] + 32*bits[5] + 16*bits[4] + 8*bits[3] + 4*bits[2] + 2*bits[1] + 1*bits[0];
buf[buflen] = byte;
buflen++;
}
}


Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.602
  • Helpdesk do sitio
Re: Ajuda em código C
« Responder #1 em: 12 de Setembro de 2012, 17:17 »
Não sei se sabes, mas existem bibliotecas que fazem isso, serial bitBanged não é tão trivial como parece.
Mas se a ideia é aprender, para começar, todas as variaveis usadas numa interrupção que sejam partilhadas por outro código têm de ser declaradas como volatile, assim:
volatile int foo;

Outra coisa, nunca se fazem delays numa interrupção, uma interrupção é para ser uma resposta rápida a um pedido externo, portanto ter delays vai contra a lógica de uma interrupção.
Avr fanboy

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Ajuda em código C
« Responder #2 em: 12 de Setembro de 2012, 17:33 »
Não sabia, vou ver isso então.
A ideia era também aprender um bocado ao fazer isto.

Já alterei as variáveis, vou ver se consigo fazer isto de outra forma, obrigado.