Lite frågor ang. AVR

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

nu har jag letat och letat men kan inte hitta något fel.. så nu kan inte jag hitta något fel jag har letat och nu vänder jag mig till er som kan detta:P

Jag har gjort så att 5 st leds "rinner" ienligt koden över fast med lite modifikationer..

den funkar utmärkt förutom att den sista lysdioden lyser lite svagare..
jag har koplat dom med gemensam katod..

och nu till en annan fråga:

vad är det för skillnad på de olika motorerna (ex: stegmotor, likströmsmotor osv.)?

nu vet jag vad pwm är.. men jag förstår inte så mycket av koden jag kollat på..(den finns längre bak i tråden i en form av länk:P)
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg av rickeboy »

Hmm... du kör på en ATmega32... hmm... har du lika stora motstånd till diodrarna? Porten du har kopplat till är inte aktiv på ngt annat sätt, har ngn special inställning?

På äldre AVR:er är det bättre att sänka porten än att höja den... dvs du drar den till gjord för att tända lys dioden för att porten kan sänka mer ström än den kan höja... borde dock inte vara fallet här... inte helt omöjligt dock...

likströmsmotor/dc motor => två kontakter för + och -... vid pol vändning snurrar den åt andra hållet...

stegmotor => fyra eller fler kontakter som har fler "spolar" dvs som ger olika värden (nord,syd) vilket gör att den istället för att snurra så länge det är ström ställer sig i riktning med polerna, och sen "stegar" man sig framåt genom att ändra polerna...

just hårdvaru PWM:en på AVR:erna är som allt annat... du ställer in register etc... i en av registrerna sätter du ett värde mellan 0x00 och 0xFF dvs 0 - 255 som anger duty-cyclen dvs 0% - 100% dvs hur långa "på pulserna" är...

//Rille
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

samma motstånd över allt.. aja det är säkert ingenting..

ska kolla någon annan dag om det blir samma fel om jag byter till någon av dom andra portarna.. har inte kollat riktigt på pwm men fler frågr lär komma så förbered er :wink: hehe..

Viken av motorerna lämpar sig bäst för att testa lite med avr:en? är j*vligt sugen på de.. ääven en display skulle vara kula attt kunna styra.:D då jag ska sätta in en i mitt chassi.. men det blir senare..

hehe,,

tack för snabba och trevliga svar..:)
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Anledningen till att en lysdiod lyser lite svagare kan vara att den tänds och släcks så fort att det ser ut som att den lyser svagare. Såg nämligen att det kunde bli så i en kod du skrev här förut.
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Inlägg av MicaelKarlsson »

Virr3>> Testa att "sänka dioden" och se om alla lyser lika starkt då. Sänka kanske är fel ord, det jag menar är att du kopplar
LED mellan matningsspänning och porten så en nolla på pinnen skall ge en lysande diod.

Skulle tro att det är enklast att styra en DC-motor.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

detta är från exempel koden:

Kod: Markera allt

#include <io.h>

typedef unsigned char  u08; /*???*/

int main( void )
{
   u08 led, i, j, k;  /* vad?*/

   outp(0xff,DDRC);            /* alla portc är utgångar*/

   led = 1;                    /*variabel för att göra en led hög */

   for (;;) {
       outp(~led, PORTC);      /* port c shiftar från låg till hög*/
       led <<= 1;              /* flytta till nästa led */
       if (!led)               /* overflow: start with Port B0 again  ?? */
           led = 1;
       for (i=0; i<255; i++)   /* outer delay loop ?? */
           for(j=0; j<255;j++) /* inner delay loop  ??*/
               k++;            /* just do something - could also be a NOP..  NOP??  vad gör denna då? *
		   }
}

/*Får inget sammanhang i de hela:S  */
koden funkar inte..

det är precis samma kod fasst med anndra kommentarer..

jag har bara bytt ut komentarerna mot mina frågor eller vad man ska kalla de..

så här sa kompliatorn > "make" all
make: *** No rule to make target `all'. Stop.

> Process Exit Code: 2
> "make" all

-------- begin --------
avr-gcc (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Size before:
test.elf :
section size addr
.text 186 0
.data 0 8388704
.bss 0 8388704
.noinit 0 8388704
.eeprom 0 8454144
.stab 732 0
.stabstr 1574 0
Total 2492




Compiling: test.c
avr-gcc -c -mmcu=atmega32 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test.lst -std=gnu99 -Wp,-M,-MP,-MT,test.o,-MF,.dep/test.o.d test.c -o test.o
test.c: In function `main':
test.c:20: error: parse error at end of input
make: *** [test.o] Error 1

> Process Exit Code: 2

provat men iom att jag inte vet vad sakerna betyder så vet jag inte vad jag ska ändra..


det är rena rappakaljan för mig så snälla kan någon förklara lite snällt vad sakerna betyder och hur man använder dom.. ett stort tack om ni orkar :wink:
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg av rickeboy »

EDIT: Du bör försöka använda syntaxerna som gäller... dvs undvik dem som är utgång t ex outp() etc... en bra övning är att skriva om ett sådant program till de syntaxerna som gäller...

Det är helt klart enklast att styra en DC-motor... fördelen med steg motorer att man som namnet tyder kan stega sig fram... precision alltså...

Eftersom jag också är i stadiet att lära mig AVR (matar igenom alla funktioner min AT90S8515 har, har gått igenom interrupts, UART, PORTAR) och idag stog det PWM på schemat tänkte jag delge min kod så att du kanske lättare förstår att... vad den gör är helt enkelt att köra från 0% -> 100% och tillbaka hela tiden... observera att jag inte tror registrena heter samma sak i din ATMega32... läs i databladet vad dem heter och hur PWM funkar... här är iaf min kod: (kommentarer/tips mottages gärna)

Kod: Markera allt

/*


#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>

#include <avr/interrupt.h>
#include <avr/signal.h>

void init_pwm(void) {

/* 8-bits PWM */

TCCR1A |= _BV(PWM10) | _BV(COM1A1); /* 8-bit, non inverted PWM */ 

OCR1AL = 0x00; /* Controlling register in 8-bit */
OCR1AH = 0x00; /* just in case... */

TCCR1B = _BV(CS10); /* Turn the clock on! */

}


void change_pwm(uint8_t pwm) {

OCR1A = pwm;

}


int main(void)
{

DDRD |= _BV(PD5);  /*Use PD5 as OUTPUT (OC1A, PWM output) */

uint8_t pwm_cnt = 0x00;

init_pwm();

	while (1) {
	
		for (pwm_cnt = 0;pwm_cnt<255;pwm_cnt++) {
		_delay_loop_2(5000);
		change_pwm(pwm_cnt);
		
		}
	
		for (pwm_cnt = 255;pwm_cnt>1;pwm_cnt--) {
		_delay_loop_2(5000);
		change_pwm(pwm_cnt);
		
		}
		
		
	}

return 0;

}
Enjoy...
//Rille
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

koden gjorde mig inte så jätte mycket klokare men lite iaf.. får ägna några timmar framför c programering för nybörjare och databladet :wink:

aja.. kanske hittar något iallafall.. får väll köpa någon liten motor och exprimentera med.. vart finns det billiga dc motorer? hehe..
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg av rickeboy »

Denna C förklaringen tycker jag verkar mkt bra... kom inte ihåg vart jag hittade den så jag la ut den själv: EssentialC.pdf

//Rille
Användarvisningsbild
Xyzzy
Inlägg: 1222
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Inlägg av Xyzzy »

Virr3:

typedef unsigned char u08; = där det står 'u08' i följande kod blir det 'unsigned char' (dvs 8 bitars positiva (pga 'unsigned') värden (0 - 255))

u08 led, i, j, k; = 'led', 'i', 'j' och 'k' blir vad 'u08' är (i detta fall unsigned char) alltså 4 st variablöer man kan "leka med" i programmet.

if (!led) = if(led == 0) eftersom ! = 'inte'

NOP = gör ingenting (processorn "gör ingenting" under en klockcykel... i vissa fall behövs en "paus"

Hoppas detta kan hjälpa dig nestla ut några av problemen
Användarvisningsbild
Hedis
Inlägg: 2488
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Ett vanligt fel (som iaf. jag gör ibland) är att man sätte tex pin1 hög, väntar 500mS, sätter pin1 låg. väntar 500ms sätter pin2 hög återvänder till start.

Så väntar den ju inte 500ms på sista Pin2:an.
Senast redigerad av Hedis 17 september 2004, 10:55:44, redigerad totalt 1 gång.
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Inlägg av MicaelKarlsson »

Hedis>> Det är du inte ensam om....
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

efter en stunds vila så ska jag försöka få lite ordning på de hela..

men jag har fortfarande inte förstått så mycket av koden..

hur ställer jag in vad det ska vara för mällanrum mällan pulserna osv?

sedan skulle jag vilja ha en mycket mycket grundlig förklarning om koden

Kod: Markera allt

#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>

#include <avr/interrupt.h>
#include <avr/signal.h>

void init_pwm(void) {

/* 8-bits PWM */

TCCR1A |= _BV(PWM10) | _BV(COM1A1); /* 8-bit, non inverted PWM */

OCR1AL = 0x00; /* Controlling register in 8-bit */
OCR1AH = 0x00; /* just in case... */

TCCR1B = _BV(CS10); /* Turn the clock on! */

}


void change_pwm(uint8_t pwm) {

OCR1A = pwm;

}


int main(void)
{

DDRD |= _BV(PD5);  /*Use PD5 as OUTPUT (OC1A, PWM output) */

uint8_t pwm_cnt = 0x00;

init_pwm();

   while (1) {
   
      for (pwm_cnt = 0;pwm_cnt<255;pwm_cnt++) {
      _delay_loop_2(5000);
      change_pwm(pwm_cnt);
      
      }
   
      for (pwm_cnt = 255;pwm_cnt>1;pwm_cnt--) {
      _delay_loop_2(5000);
      change_pwm(pwm_cnt);
      
      }
      
      
   }

return 0;

}
den koden har jag fått funka:d den blinkar min röda led jag skulle vilja ha snabbare pulser så att det serut som att den lyser mindre.. nu blinkar den bara..


Edit:
nehep.. nu skulle jag kopilera alltiing men icke sa nicke.. samma kod men funkar inte..

Kod: Markera allt

------- begin --------
avr-gcc (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling: led.c
avr-gcc -c -mmcu=atmega32 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=led.lst  -std=gnu99 -Wp,-M,-MP,-MT,led.o,-MF,.dep/led.o.d led.c -o led.o 
led.c: In function `init_pwm':
led.c:13: error: `PWM10' undeclared (first use in this function)
led.c:13: error: (Each undeclared identifier is reported only once
led.c:13: error: for each function it appears in.)
make: *** [led.o] Error 1

> Process Exit Code: 2
> "make" all
så taskigt säjer den:cry:


tack på förhand


Viktor
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg av rickeboy »

Koden är skriven för en AT90S8515... har du MSN/ICQ eller möjlighet att joina #elektronik på Quakenet kanske jag kan förklara lite mer ingående för dig... jag tycker dock att du ska försöka få grepp om grunderna i C...

//Rille
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Skriv svar