 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
jure94 Član


Pridružen-a: Sre 05 Maj 2010 17:11 Prispevkov: 433 Aktiv.: 2.35 Kraj: Jesenice / Lj
|
Objavljeno: Pon Sep 13, 2010 8:07 pm Naslov sporočila: Vprašanje |
|
|
Imam vprašanje glede naslednje kode:
Koda: |
/*
* rgb_strobe.c
*
* Distributed under Creative Commons 3.0 -- Attib & Share Alike
*
* Created on: Feb 6, 2010
* Author: PaulBo
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
//Hardware definitions
#define RED_LED PB2
#define GREEN_LED PB1
#define BLUE_LED PB0
#define ALL_LEDS ((1 << RED_LED) | (1 << GREEN_LED) | (1 << BLUE_LED))
//Maximum value for led brightness
#define R_MAX 255
#define G_MAX 255
#define B_MAX 255
#define RED_INDEX 0
#define GREEN_INDEX 1
#define BLUE_INDEX 2
//Cycle States
#define RedToYellow 0
#define YellowToGreen 1
#define GreenToCyan 2
#define CyanToBlue 3
#define BlueToMagenta 4
#define MagentaToRed 5
//set red to max (we start in the RedToYellow state)
volatile unsigned char mRgbBuffer[] = {0,0,0};
unsigned char mRgbValues[] = {255,0,0};
unsigned char mState;
void init_timers()
{
TIMSK0 = (1 << TOIE0); // enable overflow interrupt
TCCR0B = (1 << CS00); // start timer, no prescale
//enable interrupts
sei();
}
void rgbCycle(){
switch (mState) {
case RedToYellow:
mRgbValues[GREEN_INDEX]++;
if (mRgbValues[GREEN_INDEX] == G_MAX)
mState++;
break;
case YellowToGreen:
mRgbValues[RED_INDEX]--;
if (mRgbValues[RED_INDEX] == 0)
mState++;
break;
case GreenToCyan:
mRgbValues[BLUE_INDEX]++;
if (mRgbValues[BLUE_INDEX] == B_MAX)
mState++;
break;
case CyanToBlue:
mRgbValues[GREEN_INDEX]--;
if (mRgbValues[GREEN_INDEX] == 0)
mState++;
break;
case BlueToMagenta:
mRgbValues[RED_INDEX]++;
if (mRgbValues[RED_INDEX] == R_MAX)
mState++;
break;
case MagentaToRed:
mRgbValues[BLUE_INDEX]--;
if (mRgbValues[BLUE_INDEX] == 0)
mState++;
break;
}
//state should never advance beyond 5.
//It wraps back to 0 when we reach 6
mState %= 6;
}
int main(void){
//Set LED pins to output
DDRB |= ALL_LEDS;
init_timers();
while (1) {
rgbCycle();
_delay_ms(250);
//I like the orange state and it only lasts for a second
//so lets extend it a little bit more
if(mState == RedToYellow)
{
_delay_ms(250);
_delay_ms(250);
}
}
return 0;
}
/*
* Timer/Counter overflow interrupt. This is called each time
* the counter overflows (255 counts/cycles).
*/
ISR(TIM0_OVF_vect)
{
//static variables maintain state from one call to the next
static unsigned char sPortBmask = ALL_LEDS;
static unsigned char sCounter = 255;
//set port pins straight away (no waiting for processing)
PORTB = sPortBmask;
//this counter will overflow back to 0 after reaching 255.
//So we end up adjusting the LED states for every 256 interrupts/overflows.
if(++sCounter == 0)
{
mRgbBuffer[RED_INDEX] = mRgbValues[RED_INDEX];
mRgbBuffer[GREEN_INDEX] = mRgbValues[GREEN_INDEX];
mRgbBuffer[BLUE_INDEX] = mRgbValues[BLUE_INDEX];
//set all pins to low (remember this is a common anode LED)
sPortBmask &=~ ALL_LEDS;
}
//this loop is considered for every overflow interrupt.
//this is the software PWM.
if(mRgbBuffer[RED_INDEX] == sCounter) sPortBmask |= (1 << RED_LED);
if(mRgbBuffer[GREEN_INDEX] == sCounter) sPortBmask |= (1 << GREEN_LED);
if(mRgbBuffer[BLUE_INDEX] == sCounter) sPortBmask |= (1 << BLUE_LED);
}
|
Imam AVR Studio 4 in mi pokaže opozorilo :
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:85:3: warning: #warning "F_CPU not defined for <util/delay.h>"
Zanima me kaj je narobe.
Lep pozdrav Jure
PS koda je iz te strani : http://www.fangletronics.com/2010/02/rgb-night-lights.html |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.41
|
Objavljeno: Pon Sep 13, 2010 8:29 pm Naslov sporočila: |
|
|
Si prebral opozorilo?
Piše, da ni definirana frekvenca procesorja. Brez tega bo prevajalnik bolj težko generiral rutine za zakasnitev... _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
jure94 Član


Pridružen-a: Sre 05 Maj 2010 17:11 Prispevkov: 433 Aktiv.: 2.35 Kraj: Jesenice / Lj
|
Objavljeno: Pon Sep 13, 2010 8:37 pm Naslov sporočila: |
|
|
Prebral sem že ampak razumel ne. Kako naj pa to popravim (koda je kopirana iz že omenjene strani, sam pa tudi ne znam).
Lp |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.66 Kraj: Zagorje ob Savi
|
Objavljeno: Pon Sep 13, 2010 8:41 pm Naslov sporočila: |
|
|
Dovolj bo, če premakneš tole:
Koda: |
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
|
nad #include stavke.
LP! |
|
Nazaj na vrh |
|
 |
jure94 Član


Pridružen-a: Sre 05 Maj 2010 17:11 Prispevkov: 433 Aktiv.: 2.35 Kraj: Jesenice / Lj
|
Objavljeno: Pon Sep 13, 2010 9:28 pm Naslov sporočila: |
|
|
Build succeeded with 0 Warnings...
Hvala za odgovore
Z temle programom sem začel učenje C in ga večino že rezumem.
Lp Jure |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.41
|
Objavljeno: Pon Sep 13, 2010 9:43 pm Naslov sporočila: |
|
|
chaos je napisal/a: |
Dovolj bo, če premakneš tole:
Koda: |
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
|
nad #include stavke.
LP! |
Še lepše bi bilo, če bi navedel dejansko hitrost notranjega oscilatorja, ki je na tiny13 4.8 ali 9.6 MHz, ne pa 8.
Prevajalnik se sicer ne bo pritoževal, le zakasnitve bodo popolnoma mimo... _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
lojzek Član



Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3387 Aktiv.: 15.99
|
Objavljeno: Tor Sep 14, 2010 6:24 am Naslov sporočila: |
|
|
@jure94:
Druga možnost pa je, da v AVR studiu pritisneš Project -> Configuration Options.
Potem pa v polju "Frequency" vpišeš dejansko frekvenco, s katero bo mikro delal.
Prevajalnik bo pri prevajanju kode pogledal tudi sem, če je tukaj definirana frekvenca. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|