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

Pridružen-a: Sre 09 Apr 2008 23:12 Prispevkov: 70 Aktiv.: 0.33 Kraj: Maribor
|
Objavljeno: Sob Jul 10, 2010 1:33 pm Naslov sporočila: avr in c |
|
|
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 |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.66 Kraj: Zagorje ob Savi
|
Objavljeno: Sob Jul 10, 2010 2:12 pm Naslov sporočila: |
|
|
L - long
UL - unsigned long
LP! |
|
Nazaj na vrh |
|
 |
domen_puncer Član

Pridružen-a: Čet 01 Maj 2008 13:30 Prispevkov: 78 Aktiv.: 0.37 Kraj: Ljubljana, Mozirje
|
Objavljeno: Tor Avg 10, 2010 8:50 am Naslov sporočila: |
|
|
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.  _________________ Tiskanje sudoku |
|
Nazaj na vrh |
|
 |
logist Član

Pridružen-a: Pon 25 Jan 2010 1:12 Prispevkov: 126 Aktiv.: 0.67 Kraj: dom(o)vina
|
Objavljeno: Pon Jan 10, 2011 11:47 pm Naslov sporočila: |
|
|
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 |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.67 Kraj: KOPER
|
Objavljeno: Tor Jan 11, 2011 9:50 pm Naslov sporočila: |
|
|
Iščem kako dobro napisano funkcijo LCDHex za AVRstudio GCC. Hvala. _________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
logist Član

Pridružen-a: Pon 25 Jan 2010 1:12 Prispevkov: 126 Aktiv.: 0.67 Kraj: dom(o)vina
|
Objavljeno: Tor Jan 11, 2011 10:51 pm Naslov sporočila: |
|
|
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 |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 5.67 Kraj: KOPER
|
Objavljeno: Sre Jan 12, 2011 7:34 pm Naslov sporočila: |
|
|
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 |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.23 Kraj: Ig
|
Objavljeno: Tor Nov 01, 2011 11:08 pm Naslov sporočila: |
|
|
Ž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 |
|
 |
logist Član

Pridružen-a: Pon 25 Jan 2010 1:12 Prispevkov: 126 Aktiv.: 0.67 Kraj: dom(o)vina
|
Objavljeno: Sre Nov 02, 2011 12:39 am Naslov sporočila: |
|
|
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 |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.23 Kraj: Ig
|
Objavljeno: Sre Nov 02, 2011 8:00 pm Naslov sporočila: |
|
|
Najlepša hvala.
To deluje super, za rdečo barvo Ni mi pa jasno, kako (kateri del kode) naj pomnižim in prilagodim še za zeleno in modro
LP G _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
logist Član

Pridružen-a: Pon 25 Jan 2010 1:12 Prispevkov: 126 Aktiv.: 0.67 Kraj: dom(o)vina
|
Objavljeno: Sre Nov 02, 2011 8:55 pm Naslov sporočila: |
|
|
kot si sam že ugotovil treba niz, ki ga pošlješ po rs232 razbiti na dva dela,
in jaz sem včeraj pozabil na tole
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
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 |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.23 Kraj: Ig
|
Objavljeno: Sre Nov 02, 2011 9:37 pm Naslov sporočila: |
|
|
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 |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.71 Kraj: Kranj - struževo
|
Objavljeno: Sre Nov 02, 2011 10:01 pm Naslov sporočila: |
|
|
Š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  |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.23 Kraj: Ig
|
Objavljeno: Sre Nov 02, 2011 11:17 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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: 494 dni
Powered by phpBB © 2001, 2005 phpBB Group
|