Lite frågor ang. AVR
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)
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)
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
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
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 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å jag ska sätta in en i mitt chassi.. men det blir senare..
hehe,,
tack för snabba och trevliga svar..
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 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å jag ska sätta in en i mitt chassi.. men det blir senare..
hehe,,
tack för snabba och trevliga svar..
- MicaelKarlsson
- Inlägg: 4669
- Blev medlem: 18 juni 2004, 09:16:07
- Ort: Aneby
- Kontakt:
detta är från exempel koden:
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
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 */
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
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)
Enjoy...
//Rille
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;
}
//Rille
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
//Rille
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
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
- MicaelKarlsson
- Inlägg: 4669
- Blev medlem: 18 juni 2004, 09:16:07
- Ort: Aneby
- Kontakt:
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
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..
så taskigt säjer den
tack på förhand
Viktor
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;
}
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
tack på förhand
Viktor