Hjälp med felsökning

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
mmarks
Inlägg: 46
Blev medlem: 4 februari 2012, 16:00:14

Hjälp med felsökning

Inlägg 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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjälp med felsökning

Inlägg 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" ?
mmarks
Inlägg: 46
Blev medlem: 4 februari 2012, 16:00:14

Re: Hjälp med felsökning

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjälp med felsökning

Inlägg 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?
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Hjälp med felsökning

Inlägg 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
mmarks
Inlägg: 46
Blev medlem: 4 februari 2012, 16:00:14

Re: Hjälp med felsökning

Inlägg 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!
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Re: Hjälp med felsökning

Inlägg 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.
mmarks
Inlägg: 46
Blev medlem: 4 februari 2012, 16:00:14

Re: Hjälp med felsökning

Inlägg 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!
Skriv svar