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   431 / 840
(#) benjami válasza oregharcos hozzászólására (») Márc 30, 2012 /
 
Szerintem is az a probléma amit sikolymester is írt.
Ha AVR studio 4-et telepítettél abban csak assembly fordító van. A C fordító a WinAVR, azt is fel kell telepítened. Ez szépen beépül az AVR studioba.
(#) oregharcos válasza benjami hozzászólására (») Márc 30, 2012 /
 
Kedves Topi!
Köszi a megjegyzést, megpróbálom rendesen beilleszteni.

Kedves sikolymester!
Van fent WinAVR

Kedves benjami!
Ezek szerint ezért nem sikerül lefordítani.

Mindenkinek köszönöm a segítséget!
(#) blackdog válasza blackdog hozzászólására (») Márc 31, 2012 /
 
Nos végül sikerül működésre bírnom az előző hozzászólásomban mellékelt LDC lib-et.
Tetszik is, de elég alap.
Próbáltam ezt: Bővebben: Link
Ez már egész jó lenne, de ennek hatására az LCD kijelző semmit sem csinál
Tud valaki egy jól használható lib-et?
(#) sikolymester válasza blackdog hozzászólására (») Márc 31, 2012 /
 
Peter Fleury libjei szerintem pöpecek.
(#) IMi hozzászólása Ápr 1, 2012 /
 
Sziasztok!
A következő dologba futottam bele: Attiny 45 sleep módból, tápfesz. ráadása után nem úgy működik mint gondolnám, viszont reset után tökéletesen megy. Röviden: Attiny45 PB0 váltása esetén sleep módból felébred, pwm-el meghajt egy leded, vár, led kialszik szintén pwm-el, majd újból sleep mód.
HW.: PB0 nyomógomb, PB1 LED pwm, PB2 debug led.
Mi okozza ezt, ill mit rontok el?

test.c
    
(#) sikolymester válasza IMi hozzászólására (») Ápr 1, 2012 /
 
Kicsit pontosítsd a jelenséget légyszi.

1:
Tehát ez az áramkör folyamatosan kap tápfeszültséget, megteszi amit kell, majd POWER DOWN módba megy. Ezután megnyomod az interrupt gombot, ami után nem helyesen kapcsol be?

2:
A kapcsolás működik, elmegy POWER DOWN módba, majd le veszed róla a tápfeszt. Amikor megint kap tápfeszt, akkor nem helyesen kapcsol be?

Emiatt vagyok bizonytalan:
Idézet:
„...tápfesz. ráadása után...”
(#) IMi válasza sikolymester hozzászólására (») Ápr 1, 2012 /
 
Szia!
Tápfesz ráadásakor végig fut, a debug led világít.Most ha megnyomom a gombot a debug led átvált, viszont pwm nincs.Ha nyomok egy resetet onnantól működik a pwm is.
Remélem érthető, köszi !
(#) sikolymester válasza IMi hozzászólására (») Ápr 1, 2012 /
 
Önmagában érdekes a sztochasztikus viselkedés, de azért nézd meg megint a sleep.h leírását.

Ezt a példát nézd meg:

  1. #include <avr/interrupt.h>
  2.     #include <avr/sleep.h>
  3.  
  4.     ...
  5.       set_sleep_mode(<mode>);
  6.       cli();
  7.       if (some_condition)
  8.       {
  9.         sleep_enable();
  10.         sei();
  11.         sleep_cpu();
  12.         sleep_disable();
  13.       }
  14.       sei();
(#) Reggie válasza IMi hozzászólására (») Ápr 1, 2012 /
 
Szerintem az a baj, hogy az ISR-ben flag++ van, mig a foprogram vegtelen hurkan beluli if-ben flag==1 -re ellenorzol. Ha egymasra fut a prellezes miatt ket interrupt, akkor mar a flag erteke 2 lesz, mire eljutna az ellenorzeshez.
Azt kene csinalni, hogy ha a gombot lenyomtak, akkor azt a megszakitast letiltod, es a fohurokban engedelyezed ujra, az if vegen. Termeszetesen az engedelyezes elott kell kozvetlen torolni a megszakitashoz tartozo flagbit-et is.
(#) blackdog válasza sikolymester hozzászólására (») Ápr 1, 2012 /
 
Idézet:
„Peter Fleury libjei szerintem pöpecek.”

Oké-Oké... De ezzel nekem meg sem szólal az LCD-m.
Beállítom a megfelelő portokat, de semmi.
(#) Massawa válasza blackdog hozzászólására (») Ápr 1, 2012 /
 
Ugyanazon az oldalon van egy török srác linkje, az teljesen érthetö és nagyon részletesen elmagyarázza az LCD müködését sok példával. Szerintem annak mennie kell.
(#) sikolymester válasza blackdog hozzászólására (») Ápr 1, 2012 /
 
Milyen AVR-t használsz?
(#) blackdog válasza sikolymester hozzászólására (») Ápr 1, 2012 /
 
ATMEGA168.
A HW konfiguráció ua. csak a libeket cserélgetem. Amit korábban linkeltem azzal jó minden más eddig nem ment.
LCD: Bővebben: Link
(#) Massawa válasza Massawa hozzászólására (») Ápr 1, 2012 /
 
A link lemaradt:

LCD meghajtás
(#) blackdog hozzászólása Ápr 2, 2012 /
 
Sziasztok!

Két elméleti kérdés:
Ha három porton bekapcsolom a felhúzó ellenállásokat akkor a következő kód közül melyik optimálisabb:
  1. PORTB |= _BV(PB0);
  2. PORTB |= _BV(PB1);
  3. PORTB |= _BV(PB2);

Vagy:
  1. PORTB |= (_BV(PB0)| _BV(PB1) | _BV(PB2));

A Másik kérdés:
  1. if (!(PINB & _BV(PB1)))
  2.   {
  3.     // Esemény
  4.   }


Ezt nem tudtam elegánsabbá tenni. Ha & helyett != írok és elhagyon a feltétel előtti negálást akkor nem jó.
Tudom ez inkább alap C ismeret.
(#) kiborg hozzászólása Ápr 2, 2012 /
 
Valaki tud valami okosat mondani ezzel kapcsolatban ?

RFM70 transciever és az utána levő pár hozzászólás.

Üdv Kiborg
(#) boomerang hozzászólása Ápr 2, 2012 /
 
Sziasztok.

Mi lehet az oka, hogy egy Atmega8 vezérlő teljesen random időközönként (néhány perc) újrainul vagy lefagy.
Belső órajellel megy 8 Mhz-en.
Tápfeszültség és minden egyéb külső tényező rendben van. Egyszerűen nem értem.

Segítő válaszokat köszönöm szépen!
(#) sgt válasza boomerang hozzászólására (») Ápr 2, 2012 /
 
Egészen biztos vagy benne, hogy jó a táprész? De lehet hogy a reset láb a gond. Kapcsolási rajzot mellékelnél?
(#) sgt válasza blackdog hozzászólására (») Ápr 2, 2012 /
 
Második fajta értékadást szokták használni. Disassembly ablakban tudod megnézni .

Idézet:
„Ha & helyett != írok és elhagyon a feltétel előtti negálást akkor nem jó.”

Persze hogy nem jó, mert a != értékadásnak felel meg, és így ebben a kontextusban akkor lesz igaz a feltétel, ha megtörtént az értékadás. Vagyis mindig igaz lesz.

Egyszerűbbet nem tudok, de az ilyeneket lehet macroval helyettesíteni, és így kevesebbet kell írni. Példa:
  1. #define bt(sfr, bit)  (bit_is_set(sfr, bit))
(#) blackdog válasza sgt hozzászólására (») Ápr 2, 2012 /
 
Köszi a választ.
Az első fele: Program méretben gondolom nem egy óriási különbség. Nem teszteltem.

Második. Ha nincs egyszerűbb alak akkor így használom mert a makrókban sem akarok elveszni.
Csak valamiért az volt bennem, hogyha működik az & AND ellenőrzés akkor a != is működig ebben az esetben. Akkor marad az & negálása.
(#) boomerang válasza sgt hozzászólására (») Ápr 2, 2012 /
 
Labortápról veszek feszt, után 7805 + puffer. A reset lábon egy mikrokapcsoló van a földre kötve, ha nekem kellene resetelni esetleg. Kapcsolási rajzom már nincs meg : /
(#) kiborg válasza boomerang hozzászólására (») Ápr 2, 2012 /
 
Csak egy kapcsoló ? És hol van a felhúzó ellenállás ? Meg a kondenzátor (esetleg) ?
(#) sgt válasza blackdog hozzászólására (») Ápr 2, 2012 /
 
Megnéztem hogy hogyan is fordítja le, mert régóta foglalkoztatott csak soha nem vitt rá a lélek, hogy megnézzem.

  1. PORTB |= (1<<PB0)|(1<<PB1)|(1<<PB2);
  2.  
  3. IN        R24,0x18       In from I/O location
  4. ORI       R24,0x07       Logical OR with immediate
  5. OUT       0x18,R24       Out to I/O location

Itt akár mennyit is állítasz be, mindig három utasításból fog állni.

  1. PORTB |= (1<<PB0);
  2. PORTB |= (1<<PB1);
  3. PORTB |= (1<<PB2);
  4.  
  5. SBI       0x18,0         Set bit in I/O register
  6. SBI       0x18,1         Set bit in I/O register
  7. SBI       0x18,2         Set bit in I/O register

Itt pedig annyi utasítás lesz amennyi bitet változtatsz.

Összességében ahogy írtad is, nem egy óriási különbség. Adott esetben pár utasítás jelent összesen.

Igazából ami neked kellene a bit tesztelésre, az asm-ben ennyi lenne:
  1. SBRC Rr, b ; Skip if Bit in Register Cleared

Sajnos a C-ben nincs lehetőség ilyen egyszerű megoldásra. De macrokkal lehet egyszerűsíteni olvasás szempontjából.
(#) kiborg válasza sgt hozzászólására (») Ápr 2, 2012 /
 

Te is ASM ?
(#) boomerang válasza kiborg hozzászólására (») Ápr 2, 2012 /
 
Felhúzó ellenállás az tényleg nincs. Elképzelhető akkor, hogy a PC6 lábon úgymond nem elég stabil az 5V, és néha ezért keletkezik reset ?
Hozzáadtam egy 10k ellenállást, most egyenlőre megszűnni látszik a "hiba."

Véleményed ?
(#) blackdog válasza sgt hozzászólására (») Ápr 2, 2012 /
 
Köszi, hogy megnézted.
Ennek szerintem csak akkor lesz érdemi jelentőssége, ha már nem igen fér el a kód az MCU-ban. Akkor lehet molyolni, hogy kissebb legyen.
Én maradok a C-nél. Ezt úgy ahogy már megismertem ASM-hez "öreg" vagyok, hogy megtanuljam
(#) Massawa válasza boomerang hozzászólására (») Ápr 2, 2012 / 1
 
Már nem emlékszem milyen a processzorod, de az ujabbak egyik tipusa (talán az A) átment egy innovácion és a belsö 10 kOhmos felhuzo ellenállók 100kOhmra lettek cserélve, amik adott esetben nem adnak megfelelö stabilitást. Igy mindenképpen külsö ellenállók kellenek.
(#) oregharcos hozzászólása Ápr 2, 2012 /
 
Sziasztok!
Előre bocsájtom, hogy nincs nagy gyakorlatom a kódolásban. Különösen vonatkozik ez a C-re.
Régebben a PIC-el foglalkoztam az MPLab-al.
Az AVR-el most ismerkedek.
Sikerült azt a kódot lefordítani amit fentebb beillesztettem.
Szeretnék továbblépni, a Topi által alkotott csengőt
szeretném úgy megoldani, hogy csak egy dallam szóljon. Ha sikerül, akkor megpróbálok egy olyan dallamot csinálni, amire szükségem van.
Letöltöttem a firmware.zip-et. Az nem tiszta, hogy a main.c-t betöltve a winAVR-be, nem fordítja le, hiába próbálom a Makefile-t átállítani, hibát ír ki.
Megpróbáltam AVRStudioban is de ott sem megy.

A kód és a leírás itt található:

Bővebben: Link

Ez itt szerintem a vezérlő kód.
  1. #include <avr/io.h>
  2.     #include <util/delay.h>
  3.      
  4.     //-------------------------------------
  5.     void m_delay_10ms(unsigned char val) {
  6.     //-------------------------------------
  7.     //a _delay_ms max 65.535 ms-et képes sleepelni,
  8.     // tehát nagyobb időzítést többől lehet "összerakni"
  9.                unsigned char i;
  10.                for(i=0;i<val;i++) {
  11.                    _delay_ms(10);
  12.                }
  13.     }
  14.            
  15.     //-------------------------------------
  16.     int main(void) {
  17.     //-------------------------------------
  18.                DDRB = (1<<PINB3)|(1<<PINB4); //csak a PB3 és a PB4 kimenet
  19.                PORTB = (1<<PINB3);    //egyiket bekapcsol
  20.                while(1) {
  21.                    if(PORTB & (1<<PINB3)) PORTB &= ~(1<<PINB3);
  22.                                      else PORTB |=  (1<<PINB3);
  23.                    if(PORTB & (1<<PINB4)) PORTB &= ~(1<<PINB4);
  24.                                      else PORTB |=  (1<<PINB4);
  25.                    m_delay_10ms(100); //100*10ms = 1s
  26.                }
  27.                return 0;
  28.     }

Ez nem tartalmazza a dallamok kódját, ezért még a
melodies.c-t is hozzáfűztem, de sikertelen a forditás.
Arra szeretnélek megkérni benneteket, hogy írjátok meg, hogy melyik file-t próbáljam berakni a fordítóba?
Segítségeteket előre is köszönöm!
(#) Moderátor hozzászólása oregharcos hozzászólására (») Ápr 2, 2012
 
Máskor a [ Kód ] gombot használd légyszíves a kód beszúráshoz. Köszi!
(#) oregharcos válasza (») Ápr 2, 2012 /
 
Szia Topi!
Most a kód beillesztést használtam. Mit rontottam el?
Következő: »»   431 / 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