Sida 1 av 3
Min C kod fungerar inte (AVR)
Postat: 28 oktober 2010, 22:49:20
av atmelfan
Hej
jag har köpt ett av
thepirateboys AT90usb162 usb kort för att lära mig C istället för bascom AVR.
Jag har gjort denna lilla bit kod som borde få den röda lysdioden att blinka med 0,5HZ
men jag får inga felmeddelanden i avrstudio men ändå fungerar det inte, kan någon se vad jag gör fel?
Klockan på kortet är 8Mhz.
Lysdioden är aktiv låg.
Programmering och verifikation går bra.
Är ganska trött just nu så säg till om jag har glömt någon information.
Kod: Markera allt
#define F_CPU 800000UL //Definera klockfrekvens på 8Mhz
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRC = 0xff; //Sätter portb till utgång
//DDRA = 0xfe; //Sätter porta till ingång
while(1)//Starta loop
{
PORTc=0xff; //Portc låg
_delay_ms(2000); //Vänta 2sek
PORTD=0xfe; //Portc hög
_delay_ms(2000); //Vänta 2sek
}
return 1; //Gå tillbaka till while
}
Tack på förhand.
Re: Min C kod fungerar inte (AVR)
Postat: 28 oktober 2010, 22:58:30
av Johanb
TIll att börja med så har du definierat F_CPU till 800khz, kanske inte vad du vill ha

Re: Min C kod fungerar inte (AVR)
Postat: 28 oktober 2010, 23:22:47
av atmelfan
Har ändrat dock så blinkar lysdioden lika lite som förut

. Prövade också att ändra till 1Mhz ifall divide by 8 säkringen är programmerad, ingen skillnad

.
Nä, nu ska jag gå o lägga mig.
Förhoppningsvis fungerar hjärnan lite bättre imorgon.
Re: Min C kod fungerar inte (AVR)
Postat: 28 oktober 2010, 23:28:34
av johano
Jag tycker det på schemat ser ut som om lysdioden är kopplad till PD6, alltså inte på PORTC?
/johan
Re: Min C kod fungerar inte (AVR)
Postat: 28 oktober 2010, 23:31:51
av sodjan
> men ändå fungerar det inte,
Vad betyder "funegrar inte" mer exakt ?
Vad händer ? Lyser lysdioden alls ?
> DDRC = 0xff; //Sätter portb till utgång
Om du för övrigt jobbar lika slarvigt som du skriver
kommenterar, så har du en del att göra...
> PORTC=0xff; //Portc låg
> PORTC=0xfe; //Portc hög
Båda dom kommenterarna kan inte vara rätt.
Det är bara en bit som skiljer mellan kommandona.
> _delay_ms(2000); //Vänta 2sek
Har du läst på om _delay_ms() ordentligt så att du förstår
inom vilka marginaler parametern kan vara ? Dessutom är den ju
helt beroende på att F_CPU är korrekt. JohanB antyder att de inte
är det, jag kan inte avgöra det (det ser rätt ut, är det ändrat efter
JohanB's inlägg ? Ja, det har du tydligen...)
Om jag tolkar dokumentationen för _delay_ms() korrekt så ger
_delay_ms(2000) en delay på 0.2 s. Ger ett snabbt blink...
Re: Min C kod fungerar inte (AVR)
Postat: 28 oktober 2010, 23:36:46
av atmelfan
Nu fungerar det

.
Skyller på att jag är trött

.
Tack för hjälpen.
Re: Min C kod fungerar inte (AVR)
Postat: 28 oktober 2010, 23:40:59
av sodjan
> Skyller på att jag är trött.
Det kan väl inte *bara* ha varit det ?
Vr det inget fel varken i uppkopplingen eller koden ??
Re: Min C kod fungerar inte (AVR)
Postat: 28 oktober 2010, 23:56:01
av atmelfan
Vad betyder "fungerar inte" mer exakt ?
Vad händer ? Lyser lysdioden alls ?
Den lyste inte alls.
Om du för övrigt jobbar lika slarvigt som du skriver
kommenterar, så har du en del att göra...
Den gör väl portd till utgång?
Har du läst på om _delay_ms() ordentligt så att du förstår
inom vilka marginaler parametern kan vara ? Dessutom är den ju
helt beroende på att F_CPU är korrekt.
Är bortskämd med bascom där man knappt behöver tänka på sånt.
F_CPU vet jag inte om divide by 8 är aktiverad(ska kolla i databladet imorgon om den är på av default) annars
är den 8Mhz
Det kan väl inte *bara* ha varit det ?
Var det inget fel varken i uppkopplingen eller koden ??
Jag skyllde på det men det var jag som inte kollade igenom min kod och hårdvara nog. Och märkte varken mitt fel med Portd och att jag definerat F_CPU som 800khz istället för 8Mhz.
Tycker själv att jag var för snabb med att ställa frågan här istället för att vänta tills imorgon när man är utvilad och fokuserad.
Re: Min C kod fungerar inte (AVR)
Postat: 29 oktober 2010, 00:07:15
av jesse
VAD HAR DU ÄNDRAT PÅ DÅ?
i din kod ändrar du ju bit 0 i port D.
Men lysdioden sitter på bit 6 på port C.
Så det vore konstigt om den plötsligt började blinka.
_delay_ms(2000) brukar ge en fördröjning på 2 sekunder, inte 0.2 sekunder.
Re: Min C kod fungerar inte (AVR)
Postat: 29 oktober 2010, 00:08:22
av johano
Jag tycker det blir lite tokigt att redigera(rätta ursprungsfrågan + koden i första inlägget, det gör att tråden blir helt obegriplig för andra som råkar ramla på den i framtiden..
Bara mina 2 ören,
/johan
Re: Min C kod fungerar inte (AVR)
Postat: 29 oktober 2010, 00:14:13
av sodjan
>>> DDRC = 0xff; //Sätter portb till utgång
>> Om du för övrigt jobbar lika slarvigt som du skriver
>> kommenterar, så har du en del att göra...
> Den gör väl portd till utgång?
Vad 17 har Port *D* med ovanstående att göra ??
> _delay_ms(2000) brukar ge en fördröjning på 2 sekunder, inte 0.2 sekunder.
Det jag har hittat om _delay_ms() är att om man överskrider maxvärdet
för parametern så kommer den att börja räkna parametern som 1/10 ms.
Alltså 0.2 sek med 2000 som parameter.
The maximal possible delay is 262.14 ms / F_CPU in MHz.
When the user request delay which exceed the maximum possible one, _delay_ms() provides
a decreased resolution functionality. In this mode _delay_ms() will work with a resolution of
1/10 ms, providing delays up to 6.5535 seconds (independent from CPU frequency).
The user will not be informed about decreased resolution.
Men det kanske är en annan _delay_ms() som jag har hittat...
Å andra sidan så lär det inte hjälpa om lysdioden sitter på fel pinne i alla fall...
Re: Min C kod fungerar inte (AVR)
Postat: 29 oktober 2010, 00:41:49
av jesse
Märkligt... jag har kört _delay_ms(2000); och fått paus på precis 2 sekunder. Men jag fattar inte uttrycket:
The maximal possible delay is 262.14 ms / F_CPU in MHz.
så vid 8 MHz slulle maxtiden vara 262.14/8 = 32.77 ms? Låter väldigt lite.

Re: Min C kod fungerar inte (AVR)
Postat: 29 oktober 2010, 01:31:25
av Johanb
Om ni läser nogrannare i sodjans citat så ser ni att det är "resolution" som minskas till 1/10ms om man överskrider den "magiska" gränsen, alltså nogrannheten i fördröjningen.
Re: Min C kod fungerar inte (AVR)
Postat: 29 oktober 2010, 07:43:46
av atmelfan
Kod: Markera allt
#define F_CPU 8000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRD = 0xff; //sätter portd till utgång
//DDRA = 0xfe; //sätter porta till ingång
while(1)//starta loop
{
PORTD=0xff; //portd låg
_delay_ms(20000); //vänta 2sek
PORTD=0xfe; //portd hög
_delay_ms(20000); //vänta 2sek
}
return 1; //gå tillbaka till while
}
Vad 17 har Port *D* med ovanstående att göra ??
För att jag har ändrat till portd.
Men lysdioden sitter på bit 6 på port C.
Så det vore konstigt om den plötsligt började blinka.
Koden är den ovanför och så blinkar lysdioden fast med ungefär 5hz.
Re: Min C kod fungerar inte (AVR)
Postat: 29 oktober 2010, 09:30:29
av thepirateboy
Det verkar som schemat är suddigt och PortC kan misstolkas som PortD. Dessutom är PortD felmärkt på bilden i manualen. Jag ska ta och uppdatera dokumentet ikväll så det stämmer.
"Manualen" nu uppdaterad i säljtråden.