Hjälp med felsökning
Hjälp med felsökning
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.
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.
Re: Hjälp med felsökning
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" ?
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
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
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?
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
Kod: Markera allt
DDRD &= (0<<PIND6);
Kod: Markera allt
DDRD &= ~(1<<PIND6);
(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
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!

-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Re: Hjälp med felsökning
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.
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
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!
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!