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 

avr in c

 
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
searider
Član
Član



Pridružen-a: Sre 09 Apr 2008 23:12
Prispevkov: 70
Aktiv.: 0.33
Kraj: Maribor

PrispevekObjavljeno: Sob Jul 10, 2010 1:33 pm    Naslov sporočila:  avr in c Odgovori s citatom

Pozdravljeni,

zamia me če kdo ve kaj pomenijo končne oznake L, UL in morda še kakšna druga
#define CPU 1000000L
#define CPU 1000000UL

lp
Nazaj na vrh
Odsoten 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: Sob Jul 10, 2010 2:12 pm    Naslov sporočila:   Odgovori s citatom

L - long
UL - unsigned long

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



Pridružen-a: Čet 01 Maj 2008 13:30
Prispevkov: 78
Aktiv.: 0.37
Kraj: Ljubljana, Mozirje

PrispevekObjavljeno: Tor Avg 10, 2010 8:50 am    Naslov sporočila:   Odgovori s citatom

Pa se kaj je point tega: int (default tip) je na nekaterih platformah 16-biten (kar je tudi minimum po standardu, btw.). Brez L-ja bi 1000000 postal int z vrednostjo 16960.
Spodobni prevajalnik te bi verjetno tudi opozoril. Smile

_________________
Tiskanje sudoku
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
logist
Član
Član



Pridružen-a: Pon 25 Jan 2010 1:12
Prispevkov: 126
Aktiv.: 0.67
Kraj: dom(o)vina

PrispevekObjavljeno: Pon Jan 10, 2011 11:47 pm    Naslov sporočila:   Odgovori s citatom

Pozdravljeni,

zanima me kaj delam narobe, da mi moja koda ne dela tako kot koda na linku :

Koda:
// http://www2.arnes.si/~gljsentvid10/visina_sonca01a.html
// SunCalc(dan v letu, časovni pas, geo. dolžina, geo. širina);
// Oblika vnosa
// SunCalc(10,1,14.15,46.06);
void SunCalc(unsigned int dayofyear, char timezone, double lon, double lat){
   
   timezone = -1 * timezone;
   lon = -1 * lon;

   double gama, decl, eqtime, ha, sunrise, sunset;
   
   // gama predstavlja del leta v kotu - radiani
   gama = (((double)(2 * M_PI)/365) * ((1 * dayofyear)-1));

   // deklinacija Sonca
   decl = (((((0.006918 - (0.399912*cos(gama))) + (0.070257*sin(gama))) - (0.006758*cos(2*gama))) + (0.000907*sin(2*gama))) - (0.002697*cos(3*gama))) + (0.00148*sin(3*gama));

   // enačba časa (gibanje po elipsi, neenakomerna hitrost, zato poldan ni zmeraj ob 12)
   // je razlika med pravim in srednjim Sončevim časom
   eqtime = 229.18*(1*0.000075+ 0.001868*cos(gama) - 0.032077*sin(gama) - 0.014615*cos(2*gama) - 0.040849*sin(2*gama)) ;

   // polozaj Sonca na svoji navidezni poti po nebu ("Solar Hour Angle")
   // ni azimut!
   ha = acos(cos((double)90.833*((double)M_PI/180))/(cos(lat)*cos(decl)) - tan(lat)*tan(decl)) ;

   sunrise = 720 + 4*(lon-ha)*((double)180/M_PI)-eqtime - 60*timezone;
   sunset = 720 + 4*(lon+ha)*((double)180/M_PI)-eqtime - 60*timezone;
   
   LCDGotoXY(0,1);
   LCDWriteFloat(gama,2,5);
}


Ker izračuna game je v redu ostalo naprej pa je tema ali pa izpiše določeno vrednost ki je nekako ne morem spravit do tega da bi bila prava. Delam z ATmega32 in 8MHz.

Kodo sem uporabil iz te strani :
http://www2.arnes.si/~gljsentvid10/visina_sonca01a.html

Koda:
gama_ = ((2*Math.PI)/365)*(1*day_of_year - 1 + (12-12)/24  );
decl_ = 0.006918 - 0.399912*Math.cos(gama_) + 0.070257*Math.sin(gama_) - 0.006758*Math.cos(2*gama_) + 0.000907*Math.sin(2*gama_) - 0.002697*Math.cos(3*gama_) + 0.00148*Math.sin(3*gama_) ;
eqtime_ = 229.18*(1*0.000075+ 0.001868*Math.cos(gama_) - 0.032077*Math.sin(gama_) - 0.014615*Math.cos(2*gama_) - 0.040849*Math.sin(2*gama_) ) ;

ha = Math.acos(Math.cos(90.833*(Math.PI/180))/(Math.cos(lat)*Math.cos(decl_)) - Math.tan(lat)*Math.tan(decl_)) ;

// -- vzhod, zahod Sonca, cas poldneva, kulminacije v minutah
sunrise = 720 + 4*(longitude-ha)*(180/Math.PI)-eqtime_ - 60*timezone; //+0.06*60 ;
sunset = 720 + 4*(longitude+ha)*(180/Math.PI)-eqtime_ - 60*timezone; //+0.06*60 ;
snoon = 720 + 4*longitude*(180/Math.PI) - eqtime_ - 60*timezone;


Ali so sin in cos za uc preveč in prav tako decimalna števila?

_________________
Mihael
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1234
Aktiv.: 5.67
Kraj: KOPER

PrispevekObjavljeno: Tor Jan 11, 2011 9:50 pm    Naslov sporočila:   Odgovori s citatom

Iščem kako dobro napisano funkcijo LCDHex za AVRstudio GCC. Hvala.
_________________
Lep pozdrav iz Kopra Rudi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
logist
Član
Član



Pridružen-a: Pon 25 Jan 2010 1:12
Prispevkov: 126
Aktiv.: 0.67
Kraj: dom(o)vina

PrispevekObjavljeno: Tor Jan 11, 2011 10:51 pm    Naslov sporočila:   Odgovori s citatom

Jaz uporabljam od tukaj kodo za lcd.
http://extremeelectronics.co.in/avr-tutorials/using-lcd-module-with-avrs/

Če boš imel LCD večji od 2x16 potem si zamenjaj funkcijo ki sem si jo dopisal:

Koda:

void LCDGotoXY(uint8_t x,uint8_t y){
   if(x<40){
      switch(y){
         case 0: // Line 1
            x|=0x80;
            break;
         case 1:    //Line 2
            x|=0xC0;
            break;
         case 2:    //Line 3
            x|=0x94;
            break;
         case 3:    //Line 4
            x|=0xD4;
            break;
      }
      LCDCmd(x);
   }
}


Drugače pa za izpis hex kode na Lcd ti lahko pomaga naslednja funkcija :

Koda:

//*******************************************************
//Funkcija pošlje številko v izbranem formatu (2,8,10,16)
//*******************************************************
void tx_number(const int number, const int base){
   char buffer[sizeof(int)*8+1];               //def.zacasnega znakovnega polja tipa char,
   tx_string(itoa(number, buffer, base));      //pretvorba vrednosti stevilo z x osnovo v znakovni niz,
}

_________________
Mihael
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1234
Aktiv.: 5.67
Kraj: KOPER

PrispevekObjavljeno: Sre Jan 12, 2011 7:34 pm    Naslov sporočila:   Odgovori s citatom

rudiP je napisal/a:
Iščem kako dobro napisano funkcijo LCDHex za AVRstudio GCC. Hvala.


Nisem našel nič uporabnega kar bi mi odgovarjalo, zato sem sam napisal sledeče:



Koda:
void lcd_printhex(char x)
{
  char nibble;
  /* extract high nibble */
  nibble = x & 0xf0;
  if (nibble > 0) nibble = (nibble / 16);
 
   if(nibble < 10) {
   LCDsendChar(nibble + 48);
  } else {
   if(nibble==10) {
    LCDsendChar('A');
                }
   if(nibble==11) {
    LCDsendChar('B');
                }
   if(nibble==12) {
    LCDsendChar('C');
                }
   if(nibble==13) {
    LCDsendChar('D');
                }
   if(nibble==14) {
    LCDsendChar('E');
                }
   if(nibble==15) {
    LCDsendChar('F');
                }
  }

  /* do the same on the low nibble */
   nibble = x & 0x0f;
   if(nibble < 10) {
    LCDsendChar(nibble + 48);
  } else {
   if(nibble==10) {
    LCDsendChar('A');
                }
   if(nibble==11) {
    LCDsendChar('B');
                }
   if(nibble==12) {
    LCDsendChar('C');
                }
   if(nibble==13) {
    LCDsendChar('D');
                }
    if(nibble==14) {
    LCDsendChar('E');
                }
   if(nibble==15) {
    LCDsendChar('F');
                }
  }
}



Mogoče bo komu prišla prav.

_________________
Lep pozdrav iz Kopra Rudi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1714
Aktiv.: 7.23
Kraj: Ig

PrispevekObjavljeno: Tor Nov 01, 2011 11:08 pm    Naslov sporočila:   Odgovori s citatom

Živjo!

Potreboval bi malo pomoči. Ker sem se definitivno odločil, da se dokončno odrečem BASCOMu, se sedaj malce igram v Cju in to s takimi stvarmi, ki jih nisem še počel.

Za se igrati, sem v C# napisal programček, ki mi preko UARTa pošilja R0..R255, G0..255,B0..255 (terminirano z CR).

Ta del deluje. V AVRju sem nastavil USART, komunikacija deluje, nastavil sem vse 3 PWM kanale, tudi delujejo. USART je v interrupt načinu, saj mora odreagirati takoj, ko spremenim slider za določeno barvo ledice. Česar pa ne znam napraviti je naslednje: Podatke, ki jih dobim v UDR register byte by byte spraviti v en string, iz tega stringa pa izluščiti tisti R ali G ali B in vrednost ki je lahko od 0 do 255.

Kolikor sem se igral, mi je uspelo zložiti byte v string, vendar se mi nekaj pofiži. Če preko terminala pošljem R255, in imam v zanki narejeno tako, da mi pošlje vse, kar je prejel, potem dobim vrnjeno RR255. Isto je, če pošljem samo R. Dobim vrnjeno RR. Podvajanje se dogaja samo pri prvemu karakterju. Kar sicer niti ni nevem kako hudo narobe. Definitivno pa iz stringa ne znam izluščiti podatka. Tukaj bi pa rabil nekaj pomoči. Še koda ISR rutine:

Koda:

ISR(USART_RXC_vect)
{
   int n;
   
   for (n=0;n<7;++n)
   {
   Sprejeti_podatki[n]=UDR;
      if (UDR == "\r")
      {
      break;
      }
      UDR = *Sprejeti_podatki;   
      
        
   }
}


Stvar bi se potem morala nadaljevati še tako nekako:

If (Sprejeti_podatki[0] == 'R'
{
OCR1AL = tisto kar je bilo pripeto zraven...
}

LP G

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
logist
Član
Član



Pridružen-a: Pon 25 Jan 2010 1:12
Prispevkov: 126
Aktiv.: 0.67
Kraj: dom(o)vina

PrispevekObjavljeno: Sre Nov 02, 2011 12:39 am    Naslov sporočila:   Odgovori s citatom

Jaz bi zadevo nekako tako rešil za ATmega32
Koda:
char buffer[33];

unsigned char rs232Read(void){

   while(!(UCSRA & (1<<RXC)));
   return UDR;

}

ISR(USART_RXC_vect)
{
   char  niz[33];
   unsigned char znak;
    unsigned char i;
   
   strcpy(niz,"");
   
   for(i = 0; i < 33; i++){
      znak = rs232Read();   
      
      if(znak == '\r'){
         niz[i] = '\0';
         sprintf(buffer, "%s", niz);
         strcpy(niz, buffer);
         OCR1AL = atoi(niz);
         break;
      }
      if(znak != 'R'){
         sprintf(buffer,"%c", znak);
         strcat(niz, buffer);   
      }
   }   
}

_________________
Mihael
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1714
Aktiv.: 7.23
Kraj: Ig

PrispevekObjavljeno: Sre Nov 02, 2011 8:00 pm    Naslov sporočila:   Odgovori s citatom

Najlepša hvala.

To deluje super, za rdečo barvo Smile Ni mi pa jasno, kako (kateri del kode) naj pomnižim in prilagodim še za zeleno in modro d'oh!

LP G

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
logist
Član
Član



Pridružen-a: Pon 25 Jan 2010 1:12
Prispevkov: 126
Aktiv.: 0.67
Kraj: dom(o)vina

PrispevekObjavljeno: Sre Nov 02, 2011 8:55 pm    Naslov sporočila:   Odgovori s citatom

kot si sam že ugotovil treba niz, ki ga pošlješ po rs232 razbiti na dva dela,
Koda:
[barva][vrednost]

in jaz sem včeraj pozabil na tole Smile
zato ti sedaj prilagam to kodo :
Koda:
ISR(USART_RXC_vect)
{
   char  niz[33];
   unsigned char znak;
    unsigned char i;
   unsigned char rgb;
   unsigned char vrednost;
   
   strcpy(niz,"");
   
   for(i = 0; i < 33; i++){
      znak = rs232Read();   
       
      if(znak == '\r'){
         niz[i] = '\0';
         sprintf(buffer, "%s", niz);
         strcpy(niz, buffer);
         vrednost = atoi(niz);
         switch (rgb){
            case 1 :  // za rdečo
               OCR1AL = vrednost;
               break;
            case 2 : // za rumeno
               OCR1AL = vrednost;
               break;   
            case 3 : // za modro
               OCR1AL = vrednost;
               break;            
         }
         break;
      }
    
      switch (znak){
         case 'r':
         case 'R':
            rgb = 1;
            break;
         case 'g':
         case 'G':
            rgb = 2;
            break;
         case 'b':
         case 'B':
            rgb = 3;
            break;
         default :
            sprintf(buffer,"%c", znak);
            strcat(niz, buffer);
      }
   }   
}


naslednji del kode ustrezno popravi :

Koda:
 switch (rgb){
            case 1 :  // za rdečo
               OCR1AL = vrednost;
               break;
            case 2 : // za rumeno
               OCR1AL = vrednost;
               break;   
            case 3 : // za modro
               OCR1AL = vrednost;
               break;             
         }


Kot vidiš, je zadeva kar dolgo, ampak to se lahko olepša in zmanjša in bolj preprosto je če pošlješ samo cifre brez znakov. Samo moj predlog :
pošiljaš nize v tej obliki
0000 - 0255 = Rdeča
1000 - 1255 = Zelena
2000 - 2255 = Modra

Vzemima primer 2050 da pošlješ :
50 = 2050 - (2*1000)

in še koda Very Happy

Koda:
ISR(USART_RXC_vect) {
   char  niz[33];
   unsigned char znak;
    unsigned char i;
   unsigned char vrednost;
   
   strcpy(niz,"");
   
   for(i = 0; i < 33; i++){
   
      znak = rs232Read();   
       
      if(znak == '\r'){
         niz[i] = '\0';
         sprintf(buffer, "%s", niz);
         strcpy(niz, buffer);
         vrednost = atoi(niz) - (atoi(niz[0]) * 1000);
         
         switch (niz[0]){
            case '0' :  // za rdečo
               OCR1AL = vrednost;
               break;
            case '1' : // za rumeno
               OCR1AL = vrednost;
               break;   
            case '2' : // za modro
               OCR1AL = vrednost;
               break;            
         }
         break;
      }
   
      sprintf(buffer,"%c", znak);
      strcat(niz, buffer);
   }   
}

_________________
Mihael
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1714
Aktiv.: 7.23
Kraj: Ig

PrispevekObjavljeno: Sre Nov 02, 2011 9:37 pm    Naslov sporočila:   Odgovori s citatom

Najlepša hvala!

Bil sem na pravi poti (ko sem poguglal neznane ukaze mi je postalo delovanje bolj jasno), vendar sem napravil fatalno napako, ko sem imel v AVRstudiu prevajanje nastavljeno na DEBUG, jaz pa sem na AVR nameščal RELEASE in seveda, 1. ni delalo, 2, ni delalo, pol sem začel spreminjati vse po vrsti, pa še vedno isto. Potem sem videl, da si mi vmes že ti odgovoril, pa sem copy / paste 1. varianto, pa nič..potem sem naredil še tako kot si rekel 0000, 1000, 2000, pa spet isto. Pol sem začel sumiti na Khazma AVR, in sem videl, da je čas kreiranja hex datoteke precej nazaj, potem mi je pa vklopilo.

Vseeno najlepša hvala za ves tvoj trud. Ta košček kode mi bo prišel še veliko krat prav, še posebej pa zato, ker sem si vzel čas in kodo dejansko skapiral.

LP G

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.71
Kraj: Kranj - struževo

PrispevekObjavljeno: Sre Nov 02, 2011 10:01 pm    Naslov sporočila:   Odgovori s citatom

Še moja verzija. Sicer mi USB polni podatke v buffer, ampak od kod pridejo tu ni važno. Je krožni buffer z dvema pointerjema, ki kažeta kje se vpisuje in kje se bere iz bufferja.

Ascii to integer pretvorba je malo razvlečena, ker jo delam "na roke".

Koda:

void Process_RX_Buffer (void) // izvaja prejete ukaze; enega po enega
  {
  u8 ukaz;
  u8 vrni [45]; // string za vracilo podatkov
  bool CmdProcessed = FALSE;
  u8 param1;
  u8 param2;

  if (RX_buff_in == RX_buff_out) return;  // ni podatkov sploh

// normalno:  _____out.....in______
// tukaj:     ...in ________out....
  if (RX_buff_out > RX_buff_in) // buffer se je obrnil okoli
      DataLength = (RX_Buffer_SIZE - RX_buff_out) + RX_buff_in;
    else
      DataLength = RX_buff_in - RX_buff_out;


  ukaz = RX_Buffer [RX_buff_out];  // vzame prvi prejeti znak
  CmdProcessed = FALSE;

  switch (ukaz)  // procesira ukaz
  {
    case 'v':  // verzija
      sprintf (vrni, "V1.15\r");
      USB_Send_String (vrni);
      CmdProcessed = TRUE;
      break;

    case 'M':     // nastavitev frekvence
      if (DataLength < 2) break; // parametra še nismo prejeli

      RX_buff_out++; // naslednji znak
      if (RX_buff_out == RX_Buffer_SIZE) RX_buff_out = 0;  // buffer loop around

      param1 = RX_Buffer [RX_buff_out];  // vzame naslednji prejeti znak
      if ((param1 < 0x31) || (param1 > 0x39))  // pravilne so samo številke 1..9
        {
        sprintf (vrni, "M param error\r");
        }
      else
        {
        param1 = param1 - 0x30;  // iz ASCII številke dobi binarno vrednost
        Frequency_change (param1);
        sprintf (vrni, "frequency %u\r", param1);
        }
      USB_Send_String (vrni);
      CmdProcessed = TRUE;
      break;


    default:
      sprintf (vrni, "ERROR\r");
      USB_Send_String (vrni);
      CmdProcessed = TRUE;
      break;
    } // switch
  if (CmdProcessed) // prestavi pointer po bufferju za 1 naprej
    {
    RX_buff_out++;
    if (RX_buff_out == RX_Buffer_SIZE) RX_buff_out = 0;  // buffer loop around
    }
  }


Če bi želel sprejemati številko sestavljeno iz večih ascii cifer, se pač pretvori več cifer eno za drugo.

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1714
Aktiv.: 7.23
Kraj: Ig

PrispevekObjavljeno: Sre Nov 02, 2011 11:17 pm    Naslov sporočila:   Odgovori s citatom

Aljaž, hvala tudi tebi!

Sem si shranil, za čase, ko bom raziskoval dejansko USB komunikacijo. Sedaj je vmes še FTDI, tako da se s tem trenutno ne bom ubadal. Vem, pri meni je največ krat tako, da se najprej precenim (v stilu lako ćemo), potem je faza streznitve, nato nastopi panika, nakar si v glavi pobrkljam še tisto, za kar sem bil že 100% da sem to znal. Sedaj si pa hočem napraviti zbirko uporabnih "snipetov", da bo v bodoče čim manj ugank.

LP G

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
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