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   162 / 840
(#) djhusi hozzászólása Nov 5, 2009 /
 
Szevasztok!

Problémám támadt. Most kezdtem el kísérletezgetni AVR-ekkel komolyabban és az outputokig minden szépen és jól ment... villogtak a LEDek és jó volt
De most, hogy összedobtam egy inputos kapcsolást az ATMega8-16PU-hoz, felprogramoztam, nem áll szóba a géppel (AVR device not responding.).
A kapcsolásomat csatolom, ehhez még hozzá jön persze a rendre rákötött stk200-as programozó (bocs a tré képért).
A program pedig ez volt:

#include
#include

int main(void)
{

DDRB = 0b11111101;

for ( ; 1==1 ; ) // loop while 1 equals 1
{
if(PINB == 0b00000010)
{
PORTB = 0b11111101;
}
else
{
PORTB = 0b00000000;
}
}

return 1;
}

Ennek elvben ugyebár világítania kellett volna aztán amíg a gomb le van nyomva elaludnia...
Ehelyett hibátlanul felprogramozódott és nem csinált semmit egy két random villogáson kívül
Vissza lehet még hozni a chipet?

mega8.JPG
    
(#) levy_k válasza djhusi hozzászólására (») Nov 5, 2009 / 1
 
1.A rajz szerint a PB0-n van a gomb, a kódban ezt kimenetnek definiáltad!
2.Az egész port állását hasonlítottad össze egy adott értékkel, beleértve a kimeneteket is...
Egy adott pin kivizsgálása így történik:
  1. if(PINB & (1<<PB0))
(#) vzoole válasza djhusi hozzászólására (») Nov 5, 2009 / 1
 
Gondolom a kapcsoló a testre van kötve?!

Felhúzó ellenállást tegyél rá vagy kapcsold be a belsőt.
  1. // Kapcsoló kezelés
  2.  
  3. #include "avr/io.h"
  4.  
  5. // LED a PB0 lábra kötve
  6. #define LEDon    PORTB |=  (1<<PINB0)
  7. #define LEDoff   PORTB &= ~(1<<PINB0)
  8.  
  9. int main(){
  10.  
  11.         //       76543210
  12.         DDRB = 0b11111101;
  13.         // PB1 bemenet, többi kimenet
  14.  
  15.         //        76543210
  16.         PORTB = 0b00000010;
  17.         // PB1 felhúzó ellenállás bekapcsolva
  18.  
  19.                 for(;;){
  20.                         if(1=( !(PINB & (1<<PINB4)) )) {LEDoff;}
  21.                         else {LEDon;}
  22.         } // for
  23. } // main


A vizsgálat résznél azért érdemes beírni az 1= részt, mert találkoztam olyan esettel, hogy enélkül nem hajtotta végre a vizsgálatot. Habár ez egy ritka jelenség, már többen is írták itt.
(#) ATtiny válasza vzoole hozzászólására (») Nov 5, 2009 /
 
Nem akarom megkérdőjelezni az állításodat. De annak az "1 =" résznek semmi értelme. Egy konstansnak, ami a példádban 1, nem lehet értéket adni. Gondolj bele, ha a kifejezés másik része hamis, akkor ez lesz a kifejezés:

  1. if(1 = 0);


Ami teljesen értelmetlen. Hiszen az 1-et nem tudod egyenlővé tenni a nullával.
(#) edgaar válasza ATtiny hozzászólására (») Nov 5, 2009 /
 
Igazad van. A kod lefordul de értelmetlen.
1 db = jel: értékadás, 2db egyenlőség vizsgálat.
(C-ben kb akármi lefordul, ez kezdöknek nemjó, de aki már jól nyomja annak viszont nagyon jó, sokat lehet vele optimálni)
(#) gtk válasza ATtiny hozzászólására (») Nov 5, 2009 /
 
Feltetelnek akarta irni.
(#) edgaar válasza gtk hozzászólására (») Nov 5, 2009 /
 
Vágom..

De azt nem értem minek bonyolítani ezt az egészet többszörös negálással 1-hez hasonlítással stb..

Tegyük fel a led PB0-n van, a kapcsoló PB1en, akkor így a legegyszerűbb:

  1. if (PINB & (1 << PB1))
  2.         PORTB |= (1 <<  PB0);
  3. else
  4.         PORTB &= ~(1 << PB0);

Ebben a formában ha a gomb meg van nyomva a LED világít, amúgy nem.

Edgár
(#) gtk válasza edgaar hozzászólására (») Nov 5, 2009 /
 
Idézet:
„Ebben a formában ha a gomb meg van nyomva a LED világít, amúgy nem.”
Csak nem ebben az esetben
(#) vrbst hozzászólása Nov 5, 2009 /
 
Sziasztok!

Atmega88-at használok AD mérésre. Az AVcc-t használom referenciának külső kondival az AREF pin-en, és nem értem, hogy az órajel különböző leosztásainál miért mér mást. Melyik osztást használjam a pontosabb méréshez?

Köszönöm a választ előre is!
(#) vzoole válasza ATtiny hozzászólására (») Nov 5, 2009 /
 
Úgy valóban nem jó, így akart kinézni:

  1. if(1==( !(PINB & (1<<PB1)) )) {LEDoff;}


1== részt leírtam miért érdemes beletenni... egyáltalán nem muszáj.

Negálást azért tettem bele, mert a kapcsoló a földre van kötve.


(#) djhusi válasza levy_k hozzászólására (») Nov 5, 2009 /
 
Köszi szépen ez így visszanézve tényleg elég tré...
De okozhatja azt, hogy letiltódjon vagy megsüljön a chip? Mert most már azokat a programokat sem tudom beleégetni amik régen működtek
(#) vzoole válasza djhusi hozzászólására (») Nov 5, 2009 /
 
PB0 kimenetnek volt állítva, amit te rövidrezártál.

Igaz nem programozó láb... de talán ez okozhatja?!
(#) trudnai válasza djhusi hozzászólására (») Nov 5, 2009 / 1
 
Szerintem vagy a konfig biteket szurtad el, vagy pl az 5kOhm-os felhuzas a reset agon nekem tul erosnek tunik -- olyan 10-20k kornyeken jobb lenne. Azonkivul a 100nF hidegito kondi egyreszt ne elektrolit vagy talantal legyen hanem keramia, masreszrol nem az RB0-GND koze kellene hanem a Vcc-GND koze...

Azonkivul szerintem toltsd le az Eagle ingyenes valtozatat es azzal rajzolj, es probaldd meg mar most ideje-koran megszokni, hogy hogyan lehet szepen es erthetoen rajzolni (pl tipikusan a fold vonal mindig lefele megy, vagy egy eros fold vonalat szokas rajzolni a megfelelo jelolessel, hogy az a fold, vagy akar tobb helyre is be lehet tenni a foldeles jelzest ha az egyszerusiti a rajzot tehat pl nem keresztezi a tobbi vonalat... -- Vcc pedig tipikusan felfele nez, hasonlo szabalyokkal, mint a foldnel...). Kapcsolonal is illik ugy elrendezni, hogy lathato legyen mi tortenik, mi a szerepe az ellenallasnak ill a kapcsolonak...

Ha a rajz atlathato, akkor Te magad is konyebben rajossz ha veletlen valamit elrajzoltal, azonkivul mikor kerdezel is a valaszolok hamarabb fogjak tudni latni mi a problema... Ja es az ellenallas nem szokott teli lenni, avagy zig-zag az amerikai jeloles szerint.

Most hirtelen ezt az oldalt talaltam a jelolesi modokrol, de vannak ennel jobbak is, csak keresgelni kell
(#) djhusi válasza vzoole hozzászólására (») Nov 5, 2009 /
 
Hmmm... van benne valami...
Akkor megint Hestore
(#) levy_k válasza djhusi hozzászólására (») Nov 5, 2009 /
 
A rajzodon a PB0-n van a nyomógomb, amit előtte kimenetnek deklaráltál (szép magyar szó tudom), ezen a lábon a "0" nem is okozna gondot, de amikor "1" kerül ki, akkor a nyomógombon keresztül 5V-ot testeltél, amit a mikrovezérlő nagyon nem tolerál hosszabb ideig!
De a kódod szerint csak akkor kerülhetett ki rá "1", ha a PB1 valami módon (pl. külső zavar hatására) átbillen "1"-be.
Elképzelhető, hogy mesült az AVR, de próbáld meg figyelmesen átnézni még egyszer, lehet, hogy csak valami kis elkötés van a dologban.
Egy kis tipp a bekötéshez:
Az AGND, AREF és AVCC lábakat érdemes bekötni függetlenül attól, hogy használva van-e az ADC vagy sem.
(#) djhusi válasza trudnai hozzászólására (») Nov 5, 2009 /
 
Jogos köszönöm amúgy ez alapján a tutorial alapján csináltam a kapcsolás részét:
http://www.avrtutor.com/tutorial/thermo/ioports.php
a kondi természetesen kerámia volt csak rosszul jelöltem.
(#) edgaar válasza gtk hozzászólására (») Nov 5, 2009 /
 
Ok, valóban nem olyan bekötésben.
Amúgy meg az ==1 az szerintem totál nem kell, mert a C úgy fodít, ha feltételvizsgálat van, hogy minden ami nem 0 értékü az igaz. (ok, talán a NaN egy érdekes kérdés..)
(#) gtk válasza edgaar hozzászólására (») Nov 5, 2009 /
 
En tisztaban vagyok vele, hogy ugy fordit, de azzal is, hogy voltak valos sz^vasok az if(!..) miatt.
(#) edgaar válasza gtk hozzászólására (») Nov 5, 2009 /
 
milyen oprendszer/fordító? érdekelne..
(#) gtk válasza edgaar hozzászólására (») Nov 5, 2009 /
 
(#) zsuscsinyo válasza levy_k hozzászólására (») Nov 5, 2009 /
 
Idézet:
„Az AGND, AREF és AVCC lábakat érdemes bekötni függetlenül attól, hogy használva van-e az ADC vagy sem.”


Igazad van énis jártam már igy, hogy nem kötöttem be és elhalt az AVR! :yes:
(#) djhusi válasza zsuscsinyo hozzászólására (») Nov 6, 2009 /
 
Jobbnak látom megkérdezni.... egy ilyen egyszerű esetben mint pl led villogás ezeket hova kellene kötnöm? Pl. mehetne ugyanúgy USB +5-re az AVCC meg az AREF az AGND meg ahova a GND?
(#) levy_k válasza djhusi hozzászólására (») Nov 6, 2009 / 1
 
Pontosan :yes:
De viszont ha az ADC-t szeretnéd majd használni, akkor az AVCC-t és az AREF-t egy aluláteresztő szűrőn (lásd: adatlapban) keresztül kell a VCC-re kötni. Az AGND ebben az esetben is mehet a GND-re.
(#) benny0012 hozzászólása Nov 7, 2009 /
 
Sziasztok! Készítettem egy NYÁK-ot ATMEGA16-os mikrovezérlővel, aminek minden "lábát" kivezettem a programozás gyakorlására. A lefordított HEX fájlt Ponnyprog nevű programmal viszem fel. Nos itt egy résznél elakadtam! Megpróbáltam változtatni az órajel frekvenciáján a "Security and Configuration bits" menüpont alatt és azóta sem írni, sem olvasni nem tudok a kontrollerből! Ez ügyben kérnék segítséget valaki nálam okosabb embertől! Egyébként ISP programozóm van LPT porton.
(#) vrbst válasza benny0012 hozzászólására (») Nov 7, 2009 /
 
Szia!

Több, mint valószínű, hogy az alábbi linken található megoldás segít: órajel generátor
(#) zebra3 hozzászólása Nov 7, 2009 /
 
Sziasztok!
Az avr-gcc-ben hogyan lehet a stack maximális méretét beállítani? Egyáltalán mennyi az alapértéke?
(#) aygo hozzászólása Nov 7, 2009 /
 
Sziasztok

Attiny2313 hoz működőképes programozó rajzot keresnék ami nem túl bonyolult.
(#) gtk válasza aygo hozzászólására (») Nov 7, 2009 /
 
STK-200, pufferelt. Keress ra a topicban.
(#) aygo válasza gtk hozzászólására (») Nov 7, 2009 /
 
Köszönöm.
(#) TavIR-AVR hozzászólása Nov 8, 2009 /
 
V. TavIR-AVR Bascom&Processing verseny (2009)

Még 7 nap a nevezés lezárultáig....
Következő: »»   162 / 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