Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Lapozás: OK   460 / 840
(#) Robi98 válasza zombee hozzászólására (») Júl 23, 2012 /
 
Megírtam a kódot, működik is ahogy kell, viszont fejlesztés céljából annyit változtattam rajta, hogy ha a led állapotot vált, egy y nevű változót 1-el növelek, a végtelen ciklusban pedig megvizsgálom, hogy elérte-e a változó a 10-et. Ha elérte, akkor egy másik led-et bekapcsolok 1 másodpercre, aztán ki(azért a végtelen ciklusban mert az ISR rutinba nem szabad várakozást bevinni). De a másik led nem akar felvillanni.
Itt a kód:
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <util/delay.h>
  4.  
  5. uint8_t x=0,y=0;
  6.  
  7. ISR(TIMER0_COMPA_vect)
  8. {
  9. x++;
  10. if(x==125)
  11. {
  12. x=0;
  13. PORTB^=(1<<PB0);
  14. y++;
  15. }
  16. }
  17.  
  18. int main(void)
  19. {
  20. DDRB=(1<<PB0)|(1<<PB1);
  21. OCR0A=124;
  22. TCCR0A=(1<<WGM01);
  23. TCCR0B=(1<<CS00)|(1<<CS01);
  24. TIMSK=(1<<OCIE0A);
  25. sei();
  26.  
  27. while(1)
  28. {
  29. if(y==10)
  30. {
  31. PORTB|=(1<<PB1);
  32. _delay_ms(500);
  33. _delay_ms(500);
  34. PORTB&=~(1<<PB1);
  35. y=0;
  36. }
  37. }
  38. }
(#) mario1111 válasza sgt hozzászólására (») Júl 23, 2012 /
 
  1. korrigalo= ((double) gyorsulas_x)*X_arany;
  2. gyorsulas_x = (signed int)korrigalo;


eddig ment rendesen, de most...
viszont mégsem működik, ha bent hozok létre változót, mert ha használom is valamire akkor megint fagy...
(#) sgt válasza Robi98 hozzászólására (») Júl 23, 2012 /
 
Alapszabályokat ovlasd el a fórum fölött . (Nekem anno a volatile-s, UART-os és PORTC-s segített) Volatile kimaradt, amikor a globális x, y-onokat létrehoztad. Most már mennie kell.

  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <util/delay.h>
  4.      
  5. volatile uint8_t x=0,y=0;
  6.  
  7. ISR(TIMER0_COMPA_vect)
  8. {
  9.     x++;
  10.     if(x==125)
  11.     {
  12. x=0;
  13. PORTB^=(1<<PB0);
  14. y++;
  15.     }
  16. }
  17.      
  18. int main(void)
  19. {
  20.     DDRB=(1<<PB0)|(1<<PB1);
  21.     OCR0A=124;
  22.     TCCR0A=(1<<WGM01);
  23.     TCCR0B=(1<<CS00)|(1<<CS01);
  24.     TIMSK=(1<<OCIE0A);
  25.  
  26.     sei();
  27.      
  28.     while(1)
  29.     {
  30. if(y==10)
  31. {
  32. PORTB|=(1<<PB1);
  33. _delay_ms(500);
  34. _delay_ms(500);
  35. PORTB&=~(1<<PB1);
  36. y=0;
  37. }
  38.     }
  39. }
(#) sgt válasza mario1111 hozzászólására (») Júl 23, 2012 /
 
X_arany is double? Próbáld ki ezt:
  1. signed int gyorsulas_x;
  2. gyorsulas_x = ((double) gyorsulas_x)*X_arany;

Próba szerencse.

Amit te csináltál azt úgy hívják, hogy explicit castolás, mert a compileren kívül te határoztad meg a típusokat, te kezdeményezted a castot. Amit fentebb írtam azaz un. implicit castolás avagy kikényszerített típuskonverzió, amikor a változók típusa nem egyezik meg. Ekkor a compiler maga fogja végrehajtani. Elméletileg nem kéne különbségnek lennie. Az általad írt kód olvashatóbb.
(#) mario1111 válasza sgt hozzászólására (») Júl 23, 2012 /
 
  1. double korrigalo=12345.2;
  2.  
  3.  
  4. korrigalo= ((double) gyorsulas_x);
  5. gyorsulas_x = (signed int)korrigalo;
  6. kiiro_u_int(gyorsulas_x, 3, 7, 7, 1);


ez nem megy

  1. double korrigalo=12345.2;
  2.  
  3.  
  4. //korrigalo= ((double) gyorsulas_x);
  5. gyorsulas_x = (signed int)korrigalo;
  6. kiiro_u_int(gyorsulas_x, 3, 7, 7, 1);


ez igen
nem is a vissza kasztolással van gond, hanem azzal, hogy int-ből double
(#) zombee válasza Robi98 hozzászólására (») Júl 23, 2012 /
 
Ahogy tanult kolléga, de már én is említettem korábban:
Ha egy változót nem csak egyazon interruptból használod, a "volatile" jelzőt elé kell tenni!
Esetedben az "x" még maradhat sima, az "y" viszont mindenképp volatile kell hogy legyen!

A volatile-t többféleképp fel lehet fogni, én úgy fogalmazok hogy a fordító nem optimalizálja,
nem tartja regiszterben a függvény végéig, minden változáskor kimenti a memóriába,
és minden felhasználás(olvasás) beolvassa a memóriából.
(#) Robi98 válasza zombee hozzászólására (») Júl 23, 2012 /
 
Köszönöm, hirtelen elfelejtettem, hogy az y változó már nem csak az interruptban szereel, hanem a mainben is. Eddig az életemben elég kevésszer programoztam, de gondolom hogy idővel észre fogom venni az ilyen hibákat is.
(#) sikolymester válasza sgt hozzászólására (») Júl 23, 2012 /
 
Tisztában vagyok a fogalmakkal.

Hadd idézzelek:
Idézet:
„Gondolkozom egy IDE fejlesztésen, de elég macerásnak tűnik, vagyis inkább hosszú ideig tartana, ahhoz hogy normális környezet legyen , mert tényleg nagyon bugos. Csak akkor van a baj, hogy ha nem csak az AVR Studio hanem az exe-k is bugosak.”


Tehát te egy IDE -t akarsz fejleszteni egymagad?
Ugyanakkor azt mondod, hogy az eclipse-t felfúrni AVR támogatásra rettentő bonyolult lenne.

Eleve kapásból itt van az AVR Eclipse Plugin. A programozást máris támogatja az avrdude-dal.


Idézet:
„Azokkal a környezetekkel az a probléma, hogy nem AVR specifikusak. Tudsz benne írni C-ben, és eltudod fordítani...”

Ez eddig jól hangzik
Idézet:
„...Viszont nem tudod felprogramozni, fuse biteket állítani...”

Erre mint lásd fentebb van megoldás
Idézet:
„...asm-ben írni...”

Azt hiszem erre aztán tényleg pofon egyszerű plugint csinálni
Idézet:
„, online debuggolni, nem tudod szimulálni stb...”

A szimuláció az tényleg felejtős, de azt teszem azt az IAR sem tudja, pedig az tényleg nem olcsó program.
Amúgy van egy Simulavr nevű projekt, ami támogatja néhány AVR szimulálását
.
Az online debuggolásra szintén van létező projekt, persze az sem terjed ki minden AVR-re. Most azt nem találom hirtelen, de az ugye eleve a gdb-vel kommunikál, tehát ott sem lenne lehetetlen megoldani a működést.

Minden egyes projekt open source és várják a lelkes fejlesztőket. Ha annyi erőd van, hogy nulláról írnál egy IDE-t, akkor szerintem inkább ezekbe öld bele az energiád.
(#) sgt válasza mario1111 hozzászólására (») Júl 23, 2012 /
 
Próbáld meg csak simán értéket adni.
  1. korrigalo = gyorsulas_x

Ilyenkor a tizedes vessző utáni számokat lehagyja. Próbáltad már a disassaemblying ablakban megnézni, hogy tényleg lefordítja azt a sort?
(#) sgt válasza zombee hozzászólására (») Júl 23, 2012 /
 
Azért egyelőre veled sem állnék le vitatkozni a programozás rejtelmeiről, mert alulmaradnék.
(#) sgt válasza zombee hozzászólására (») Júl 23, 2012 /
 
Óóó ha tudnád, hogy én mennyit káromkodtam a lemaradt pontos vesszők, == helyett = írtam if-ben és társaitól, hogy azt el nem tudom mondani . De még most is amikor sok ideig csak egy nyelvet használok aztán visszatérek egy másikra..
(#) sgt válasza sikolymester hozzászólására (») Júl 23, 2012 /
 
Eclipse-t már sokat láttam, meg azt is tudtam hogy van egy pár plugin, de az avr támogatottságával újat mondtál nekem! Igaz nem igazán néztem utána ennek. Egyelőre csak gondolati szinten van a dolog, de addig fog idegesíteni az AVR Studio amíg tényleg neki nem esek, és össze nem dobok rá valamit. Ezekről amúgy honnan van tudomásod?
(#) sikolymester válasza sgt hozzászólására (») Júl 23, 2012 /
 
Idézet:
„Ezekről amúgy honnan van tudomásod?”

avrfreaks.net -et is figyelemmel követem.

Javaslom bárkinek, aki érti az angolt és szeretne elmélyülni az AVR témában.

Az új atmel studiot nézted már? Leszámítva, hogy eléggé vízfejű lett a visual studio alapja miatt, egyre használhatóbb kezd lenni. Fél év és a legidegesítőbb bugok mind eltűnnek belőle szerintem. Igaz most is csak ritkán fut bele az ember.
(#) norbigal hozzászólása Júl 23, 2012 /
 
AZ alábbi programrészletben kérném a segítségeteket.
Lm35 DZ-t kötöttem Atmega128-ra. A portf.0-n venném az analóg jelet, single-ended üzemmódban. A problémám csak annyi, hogy ez a nyomorult chip nem hajlandó a Vref feszültséget átállítani 2.56V-ra. Abból gondolom ezt, hogy a REFS1:0 biteket akárhogy is állítom, az ADC átalakítás eredménye Vref=VCC és 2.56V Internal Vref esetén is hajszál pontosan ugyanaz. Márpedig ha nem tévedek, akkor 2.56V-os referencia feszültségnél pontosan kétszer olyan pontos (felbontású) értéket kellene kapnom.

Számolgattam és akkor sem jön ki az, hogy miért nem megy az egész.
ADC_RESULT=Vin*1024/Vref képtlet alapján, amit multiméterrel lemértem és pl.300mv-nál az eredmény ~62, amit szépen meg is kaptam a kontrollertől.
Viszont - amint a programban is írva van - 2.56V-os referencia mellett dupla olyan pontos felbontás kellene kapnom tehát 120-at.
De valamiért nem hajlandó 0 és 2.56V között végezni a konvertálást. Ha valaki tudja mit rontok el pls segítsen
Talán külön kellene bekapcsolnom a Vref=2.56-os internal feszkót?!?! De pedig az adatlapban nem írtak ilyet.....
Köszi előre is ha valaki tudja mi a gond.
  1. //ADMUX register: bit 7  -  bit 0
  2. //REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
  3.  
  4. //ADCSRA register: bit 7 - bit 0
  5. //ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0 ADCSRA
  6.  
  7. void init_adc() //LM35 DZ    0 és 100 fokos tartományban mér
  8. {
  9.  
  10. ADCSRA|=0b10000000; //ADEN, ADIE
  11. ADCSRA&=~0b00100000;//ADFR=0
  12. ADMUX&=~0b00100000;//right justified
  13. ADMUX&=~0b00011111;//ADC0 single ended
  14. ADMUX|=0b11000000; //RESF1:REFS0 = 1:1 Internal 2.56V Voltage Reference
  15.  
  16. }
(#) mzozo95 hozzászólása Júl 24, 2012 /
 
Sziasztok!
Írtam egy egyszerű soros port, hardware pwm programot, csak van egy gondom, ha az s_pwm függvénybőlé kiveszem az outdec() függvényt, akkor nem működőképes a program, tehát nem változik meg a pwm kitöltési tényezője, míg ha benne van, minden tökéletesen fut, csak közben rengeteg adatot küld ki a tx lábon... ( egy parancs felépítése pl "a 0100=") Emellett nem sikerült az interruptban, az elemző függvényben entert('/n') alkalmazni '=' helyett, ez valyon miért lehet? (mármint, hogy ha ez a karakter van, akkor csináljon valamit az if ben, egyszerűen nem ismeri fel az entert, pedig a terminal programban leütöm...)
A pwm egyszerűbb lenne hardweresen, de nekem sajnos most szoftweresre van szükségem, a hardwereseket másra fogom használni, ott simán működött, ha megadtam az interruptban, hogy pl OCR1A=servo)
  1. //atmega48 software pwm + uart
  2. #define F_CPU 8000000
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6. #include <inttypes.h>
  7.  
  8. ////////////////////////////////
  9. #define BAUD 38400///38400bps
  10. #define UBRR ((F_CPU / (BAUD * 16L)) - 1)
  11. ////////////////////////////////
  12. //váltoizók
  13. unsigned char rec[15];//string buffeer
  14. unsigned char buffer; //byte buffet
  15.  
  16. unsigned char stat=0;//string karakter
  17.  
  18. int se[18];
  19.  
  20. int servo=0;
  21.  
  22. char echo=0; //visszhang(0-1)
  23. ////////////////////////
  24. void uart_init(void)
  25. {
  26. UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
  27. // baud rate
  28. UBRR0H = (unsigned char) (UBRR>>8);
  29. UBRR0L = (unsigned char) UBRR;
  30. //  formátum: 8data, 2stop bit
  31. UCSR0C = (1<<UMSEL01)| (1<<USBS0) | (3<<UCSZ00);
  32. }
  33.  
  34.  
  35. ///////UartKüld
  36.   void UARTKuld(unsigned char c){
  37.                 while((UCSR0A & (1<<UDRE0)) == 0) {}
  38.        
  39.             UDR0 = c;
  40. }
  41.  
  42. ///////szövegküld
  43.    void UARTSzovegKuld( char *p)
  44. {
  45.         while(*p)
  46.         {
  47.           UARTKuld( *p++);
  48.         }
  49. }//szövegküld vége
  50.  
  51. void delrec(void){
  52.  for(int i=0; i<50;i++){
  53.   rec[i]=' ';
  54. stat=0;};
  55.  }
  56.  
  57. void kuldrec(void){
  58. for(int i=0; i<stat ;i++){
  59.  UARTKuld(rec[i]);}
  60.  }
  61.  
  62. //decimális szám küldése:
  63. void outdec(long data, unsigned int ndigits) { //integer to dec=>string, és érték kiírása
  64.     static char sign, s[12];
  65.     _delay_us(10);
  66.     unsigned int i;
  67.             i=0; sign=' ';  //ha pozitív, előtte space
  68.             if(data<0) { sign='-'; data = -data;} //ha minusz, akk elé: -
  69.             do {
  70.                     s[i]=data%10 + '0'; //integer átírása ASCII ba
  71.                     data=data/10;
  72.                     i++;
  73.                     if(i==ndigits) {s[i]='.'; i++;}
  74.             } while(data>0);
  75.             UARTKuld(sign);
  76.             do{
  77.                       UARTKuld(s[--i]); //összes karakteren végigmenni
  78.             } while(i);
  79. }
  80.  
  81. uint8_t comm( char *p){
  82. char azonos=1;
  83. int szam=0;
  84. while(*p)
  85.         {
  86. if (rec[szam]==( *p++)) {azonos=1;} else {azonos=0;};
  87. szam+=1;
  88. }
  89. return (azonos);}
  90.  
  91. uint16_t strtoint(int szam){
  92. int ertek=0;
  93.  
  94. if (rec[szam]>='0' && rec[szam]<='9') {ertek += (rec[szam] - '0')*1000;};
  95. szam+=1;
  96. if (rec[szam]>='0' && rec[szam]<='9') {ertek += (rec[szam] - '0')*100;};
  97. szam+=1;
  98. if (rec[szam]>='0' && rec[szam]<='9') {ertek += (rec[szam] - '0')*10;};
  99. szam+=1;
  100. if (rec[szam]>='0' && rec[szam]<='9') {ertek += (rec[szam] - '0');};
  101. return (ertek);}
  102.  
  103.  
  104. void init_servo(void){//servo init
  105. //16bit pwm
  106. DDRB|= _BV(DDB1)|_BV(DDB2)|_BV(DDB1);   //pwm portd1 2 3
  107.  
  108. TCCR1A = (1<<COM1A1)| (1<<COM1B1);
  109. TCCR1B = (1<<WGM13) | (1<<CS11) ;//Posztás 8al
  110. ICR1 = 10000;//periódus: 20ms
  111. OCR1A = 750;//servo1 1500us
  112. OCR1B = 750;//servo2 1500us
  113. }
  114.  
  115. void delay_5us(uint16_t delay_data) {//5us es késleltetés(így kevés memóriát foglal)
  116.          while(delay_data--) _delay_us(5); }
  117.  
  118. void s_pwm(void){
  119. ///////////////software pwm
  120. PORTB=2;
  121. _delay_ms(1);
  122. delay_5us(servo);
  123. PORTB=0;
  124. _delay_ms(20);
  125. outdec(servo,0);/* HA EZT KIVESZEM NEM MŰKÖDIK HELYESEN A PWM, AZAZ NEM VÁLTOZIK A KITÖLTÉSI TÉNYEZŐ, HA VÁLTOZIK AZ INTERRUPTBAN A 'SERVO' ÉRTÉKE!*/
  126. }
  127.  
  128. int main(void){
  129.  
  130. //init_servo();
  131.  
  132. DDRB=255;
  133. PORTB=0;
  134.  
  135. uart_init();
  136. UARTSzovegKuld("Uart Online! Ready To Serial communication!");
  137.  
  138. sei();
  139.  
  140. PORTB=1;
  141. ///////
  142. while(1){
  143. s_pwm();
  144. _delay_ms(18);
  145. };
  146. }
  147.  
  148. SIGNAL(SIG_USART_RECV)
  149. {  
  150.    if(UCSR0A & (1 << RXC0)) {
  151.         buffer = UDR0;}
  152.  
  153. rec[stat]=buffer;
  154. stat+=1;
  155.  
  156. if (echo){UARTKuld(buffer);};
  157.  
  158.  if (buffer==8){//backspace
  159.  delrec();
  160.    }
  161.  
  162.  
  163.    if (buffer=='?'){
  164.     kuldrec();
  165.    }
  166.  
  167. if (buffer=='!'){
  168.   if (comm("alma")) {UARTSzovegKuld("alma fogadva!");}else
  169.   if (comm("echo")) {UARTSzovegKuld("Echo ON!"); echo=1;}else
  170.   if (comm("eoff")) {UARTSzovegKuld("Echo Off!"); echo=0;} else
  171.   if (comm("info")) {UARTSzovegKuld("Uart Online! "); UARTSzovegKuld("| 38400bps | atmega48 | string.c");}
  172.   }
  173.  
  174. if (buffer=='%'){
  175. int number=strtoint(0);
  176. outdec(number,0);}
  177.  
  178. if (buffer=='='){
  179. UARTSzovegKuld("Servo modified!");
  180. if (rec[0]=='a'){servo=strtoint(2);}
  181. }
  182.  
  183.    PORTB=1;
  184.    _delay_ms(5);
  185.    PORTB=0;
  186.    
  187.  
  188.                }


Valaki tudna segíteni? Előre is köszönet,
Zoltán
(#) mzozo95 válasza mzozo95 hozzászólására (») Júl 24, 2012 /
 
*software(!) pwm + uart, már nem engedett javítani...
(#) mario1111 válasza sgt hozzászólására (») Júl 24, 2012 /
 
Ha benne van egy double-é kasztolás, de nem használom utána, akkor nem fagy, ha használom, akkor fagy. Szerintem nem fordul bele, ha nem használom.
(#) mario1111 válasza mario1111 hozzászólására (») Júl 24, 2012 /
 
Üdv!

Kezd szűkülni a hiba. Nem is kasztolással van a gondja. Magával a lebegőpontos számokkal. Ha volatile, akkor elég csak egy művelet a lebegőpontos számmal és már resetel is..
(#) Csépe Zoltán hozzászólása Júl 24, 2012 /
 
Sziasztok!

Az miért van ha áramot adok az attiny45-nek akkor a PB0-n lévő led felvillan de PB4-en lévő nem?
(#) sgt válasza sikolymester hozzászólására (») Júl 24, 2012 /
 
Azt már olvasgattam én is, de még nem lettem függő . Ott van Dean, aki a LUFA-t csinálja. Az 5-ösben nagyot csalódtam, így azóta a 4.19-et használom, de akkor megnézem, hogy milyen lett az új, mert tán van 6-as is?! Sajnos mostanában nem sok időm jut erre.
(#) sgt válasza norbigal hozzászólására (») Júl 24, 2012 /
 
Jááááj, ez a 0b1010111010101 regiszter beállítást felejtsd el (én is így csináltam először), mert az őrületbe fog kergetni, és segíteni sem fog senki, mert nem fogják kibogarászni az adatlapból. Ehelyett így írd fel:
  1. ADCSRA |= (1<<ADEN) | (1<<ADIF)

vagy írhatod ezeket egymás alá is.
(#) norbigal válasza sgt hozzászólására (») Júl 24, 2012 /
 
Nem így szoktam írni, csak a szerencsétlen beállítás miatt írtam át regiszter szerint olvasható formába, mert - naivan - már azt reméltem hátha így működik a dolog.... de a jelek szerint ez sem ért sokat....

  1. ADCSRA|=(1<<ADEN); //ADEN=1, ADIE=0
  2. _delay_ms(20);
  3. ADCSRA&=~(1<<ADFR);//ADFR=0
  4. ADMUX|=(1<<REFS1)|(1<<REFS0); //RESF1:REFS0 = 1:1 Internal 2.56V Voltage Reference


Az adatlap szerint az ADC átalakító bekapcsolásával együtt indul be a belső ref. fesz. De nekem tojik beindulni..... :| annyira hihetetlen.... Önállóan beállítja magát 5V-os referenciára és ennyi.... Így pedig egy 10mv/°C -os hőszenzort elég szar felbontásban tudok csak kiolvasni.....
(#) sgt válasza mzozo95 hozzászólására (») Júl 24, 2012 /
 
1. globális változókat csak akkor használj, ha megszakítási rutinból szeretnél valamit kiemelni, mert nem lehet követni, hogy melyik függvény mikor mit használ, és hogy előtte milyen érték volt az adott változóban.
2. /n helyett használj \n
3. az aposztrófok a közötük lévő ASCII karaktert számmá alapítod, így ha nem nyomtatható karaktert szeretnél összehasonlítani, akkor bátran keress rá az ASCII kód táblára és keresd ki a neked megfelelő karaktert és annak a számát írd be.
4. ez már csak kötekedés, hogy a while ciklus után nem kell ;. Lásd 145. sor.
5. ne SIGNAL-t használj, hanem ISR-t, mert újabb
6. ne legyen ilyen hosszú megszakítás és főleg ne legyen benne delay függvény. Ha ilyet szeretnél csinálni, akkor használd az un. szemafort. Ez egy sima bit, amikor akkor áll 1-be amikor megszakítás történt, és a main-ben egy if-fel figyeled. Ha volt megszakítás, akkor belép az if-be ahol lefut aminek le kell futnia, végül a a bitet 0-ba állítja.
(#) sgt válasza norbigal hozzászólására (») Júl 24, 2012 /
 
Érdemes ilyen formában írni, mert a hex méret szemponjából lényegtelen, hogy melyikkel írod.

Ha belső 2,56V-t szeretnéd használni akkor egy kondit kell rá az AREF-re tenni, de hogy mekkorát azt nem tudom.

211. oldal ADC Voltage Reference bekezdést olvasd el az utolsó két mondatát, de lehet hogy nem ez a probléma.
(#) sgt válasza mario1111 hozzászólására (») Júl 24, 2012 /
 
Akkor sajnos kerülő úton kell megoldani a problémát. Megszakítás után rögtön add át az értéket egy lokális double-nek. De lehet, hogy valaki más tud ennél okosabbat.
(#) norbigal válasza sgt hozzászólására (») Júl 24, 2012 /
 
Sajnos nem az a gond, de azért köszi. Asszem jó ideig jegelem az AVR-t és inkább PIC-ezek addig.... nagyon le bír zsibbasztani ha valamire ennyire nem tudok rájönni.
(#) Stefan válasza mzozo95 hozzászólására (») Júl 24, 2012 /
 
Én még egy dolgot hozzátennék:
A comm függvény "comm("echo")" hívásra szerintem akkor is igazat ad ha "info" van a bufferben, mert nem annyira szerencsésen van megírva az az összehasonlítás.

  1. uint8_t comm( char *p){
  2. char azonos=1;
  3. int szam=0;
  4. for(szam=0; szam < 15; szam++)
  5. {
  6.     if (rec[szam]!=( *p++))
  7.     {
  8.        azonos = 0;
  9.        break;
  10.     }
  11.     if(!*p) break;
  12.  
  13. }
  14. return (azonos);}

Mondjuk ez se 100 mert ha a bufferben "abcd" van es te "ab" val hasonlítod akkor ez is rossz értéket ad de ezt már rádbízom
(#) mario1111 válasza sgt hozzászólására (») Júl 24, 2012 /
 
Már eleve a lebegőpontossal gond van. Amint használná rögtön resetel.
(#) mario1111 válasza mario1111 hozzászólására (») Júl 24, 2012 /
 
Tovább kutakodtam. Ha kiszedek programrészleteket, akkor nem resetelődik :S 150 kb-os kódnál resetel, ha lebegőpontossal számol, 125 kb-osnál nem :S
(#) sgt válasza mario1111 hozzászólására (») Júl 24, 2012 /
 
Jah, értem. De közben eszembe jutott, hogy miért is kell neked double? Miért nem elég a float? Hiszen a végén úgy is castolsz.
Következő: »»   460 / 840
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem