www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Vprašanje

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
jure94
Član
Član



Pridružen-a: Sre 05 Maj 2010 17:11
Prispevkov: 433
Aktiv.: 2.35
Kraj: Jesenice / Lj

PrispevekObjavljeno: Pon Sep 13, 2010 8:07 pm    Naslov sporočila:  Vprašanje Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.41

PrispevekObjavljeno: Pon Sep 13, 2010 8:29 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
jure94
Član
Član



Pridružen-a: Sre 05 Maj 2010 17:11
Prispevkov: 433
Aktiv.: 2.35
Kraj: Jesenice / Lj

PrispevekObjavljeno: Pon Sep 13, 2010 8:37 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.66
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pon Sep 13, 2010 8:41 pm    Naslov sporočila:   Odgovori s citatom

Dovolj bo, če premakneš tole:
Koda:

#ifndef F_CPU
    #define F_CPU 8000000UL
#endif

nad #include stavke.

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jure94
Član
Član



Pridružen-a: Sre 05 Maj 2010 17:11
Prispevkov: 433
Aktiv.: 2.35
Kraj: Jesenice / Lj

PrispevekObjavljeno: Pon Sep 13, 2010 9:28 pm    Naslov sporočila:   Odgovori s citatom

Build succeeded with 0 Warnings...
Hvala za odgovore Very Happy
Z temle programom sem začel učenje C in ga večino že rezumem.
Lp Jure
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.41

PrispevekObjavljeno: Pon Sep 13, 2010 9:43 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3387
Aktiv.: 15.99

PrispevekObjavljeno: Tor Sep 14, 2010 6:24 am    Naslov sporočila:   Odgovori s citatom

@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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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