Sida 1 av 1

Hjälp med felsökning

Postat: 5 mars 2012, 17:06:43
av mmarks
Jag håller på att ta fram kod till en atmega16 som ska ta sköta två ultraljudshögtalare för att kunna bedöma avstånd. Detta innebär bl a att generera en 8 perioder lång pwm på 40 kHz till sändaren. Problemet uppkommer när jag vill sätta pinnen där jag får min insignal från mottagaren till input. då finns det inte längre någon pwm signal på utpinnen.
Så vitt jag vet är det egentligen inte nödvändigt att deklarera den som input då alla pinnar per default är definierade som just input men det gör mig egentligen bara mer förvirrad eftersom raden då inte borde ändra något.

// pin config
DDRD |= (1<<PIND5); // Trigger on PD5
//DDRD &= (0<<PIND6); // Echo on PD6
//PORTA |= (1<<PIND6); // pullup on PD6
PORTD &= (0<<PIND5); // no trigger

Om koden körs i detta läge så får jag en pwm på utpinnen men tar jag bort kommenteringarna så försvinner den alltså.

Jag hoppas att det finns någon vänlig själ här som har tid att hjälpa mig med detta eftersom det har gäckat mig större delen av dagen. Koden är ca 100 rader allt som allt. Jag är ganska ny på det här med C-programmering och vet att det inte är världens snyggaste kod men jag hoppas att ni har överseende.

Re: Hjälp med felsökning

Postat: 5 mars 2012, 17:25:33
av sodjan
Ska inte PWM signalen vara avstängd när du ska "lyssna" ?
Jag är inte helt med på vad som är problemet...
Eller vill du "lyssna" samtidigt som du "sänder" ?

Re: Hjälp med felsökning

Postat: 5 mars 2012, 17:32:18
av mmarks
Sändaren och mottagaren är kopplade på olika pinnar (pd5 resp pd6). Man sänder en "burst" på runt 8 perioder mha pwm:en och räknar hur lång tid det tar innan får ett eko. Så jag vill alltså inte sända samtidigt som jag lyssnar.

Re: Hjälp med felsökning

Postat: 5 mars 2012, 18:00:36
av sodjan
Ah, OK. Så när du sätter en *annan* pinne som ingång så försvinner
PWM signalen ? Kör du hårdvaru PWM modulen ? Är den "andra pinnen"
en allternativ (t.ex komplementär) PWM utgång ? Kan det vara något
med konfigureringen av PWM modulen?

Re: Hjälp med felsökning

Postat: 5 mars 2012, 18:14:36
av snigelen

Kod: Markera allt

DDRD &= (0<<PIND6);
Gör inte vad du tror. Den sätter hela DDRD till 0, dvs alla blir pinnar blir ingångar, så en PWM signal på någon av dem kommer att stängas av. Du menar nog

Kod: Markera allt

DDRD &= ~(1<<PIND6);
i stället.

(0<<PIND6) = (0<<6) = 0. någonting & 0 blir 0.

Sedan skall det nog inte vara PORTA här

Kod: Markera allt

//PORTA |= (1<<PIND6); // pullup on PD6

Re: Hjälp med felsökning

Postat: 5 mars 2012, 18:21:33
av mmarks
Okej toppen! Då var det alltså mina bristande C-kunskaper som ställde till det vilket jag misstänkte. Jag har tyvärr ingen multimeter hemma men jag ska testa det det första jag gör imorn :) Tack för hjälpen snigelen och sodjan!

Re: Hjälp med felsökning

Postat: 5 mars 2012, 18:29:22
av thepirateboy
Du har några andra grundläggande fel i din kod, till exempel så börjar du räkna med float i din interrupt vilket får ses som ett allvarligt fel.
Försök att undvika float på små 8-bitars MCU:er så gott det går, normalt kan man lösa samma problem på andra sätt.

Försök också att göra så lite som möjligt i dina interrupt, annars kommer du få problem när du bygger ut ditt program. Sätt i stället en
flagga i interrupet och gör beräkningen i main-loppen.

Re: Hjälp med felsökning

Postat: 5 mars 2012, 18:45:40
av mmarks
Jo float-variablerna var en nödlösning från början som levt kvar sedan starten när jag bara ville få programmet att fungera över huvudtaget så de ryker förhoppningsvis imorn.
Att sätta en flagga var något jag inte stött på tidigare men jag har förstått att det kan skapa problem med flera interrupt om de är långa så det ska jag definitivt kolla upp hur man gör!