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   30 / 840
(#) deguss válasza PLaci hozzászólására (») Júl 27, 2007 /
 
Elméleti síkon már nekem is megy.
(#) zeusz7 hozzászólása Júl 27, 2007 /
 
A PINB 0.lábának állapota függvényében szeretnék egy elágazást. A cpi paranccsal csak az egész regisztert tudom vizsgálni, 1-1 bitet nem.

Nincs erre valamilyen egyéb megoldás?
Én maszkolásra gondoltam, de az elég macerás, biztos van egyszerűbb is.
(#) PLaci válasza zeusz7 hozzászólására (») Júl 27, 2007 /
 
Szia!
Probálkozz ezzel:

kapcsra_var sbic GOMB
rjmp kapcsra_var

Ez akkor engedi tovább futni a progit a ha a GOMB bit 0
Természetesen ezzel elágazást is csinálhatsz. A fordítottja az sbis parancs.
Persze a program elején a GOMB változót definiálnod kell. például így:

#define GOMB PINC,PC1

Itt a portc 1-es lába a bemenet
Sok sikert!
(#) gtk válasza deguss hozzászólására (») Júl 27, 2007 /
 
Nem regen meg PICre eskudtel
(#) zeusz7 válasza PLaci hozzászólására (») Júl 28, 2007 /
 
köszi, működik
(#) zeusz7 válasza PLaci hozzászólására (») Júl 28, 2007 /
 
Ha jól emlékszem tőled kaptam egy olyan programot, ami kiküldi soros porton, hogy "hello world", majd villogtat egy ledet.
Áttanulmányoztam és 2 dolog új nekem és nem értem pontosan hogy van ez. Én még csak betűnként tudok kiiratni ez a string kiiratás nem tiszta, megköszönném ha pár sorban elmondanád!

...
.org 0x30 ;?Saját megszakítás vektor vagy mi?
cmd: .db "Hello world!", 0x0d, 0
.
.
.
ldi zl,low(cmd*2)-1 ; X regiszter feltoltese a Hello kezdetevel
ldi zh,high(cmd*2)
....
(#) PLaci válasza zeusz7 hozzászólására (») Júl 28, 2007 /
 
Szia!
Igen tőlem kaptad. A dolog sokkal egyszerűbb mint te gondolod. Semmiféle megszakítás nem szerepel a programban. Az .org direktíva egyszerüen azt jelenti a fordítónak, hogy az utánna szereplő kódot hová fordítsa. Tehát az .org 0x30 azt jelenti, hogy a szövegváltozót a hexa 30-as címre tegye le. A cmd: egy közönséges címke, ugyan az mint az ugrásoknál, vagy szubrutin hívásoknál. a .db azt mondja meg a fordítónak, hogy az utánna követkerő karaktersor egyszerű string. (nem akarja befordítani parancsoknak) A 0x0d a soremelés, a legvégén pedig a sima 0 azért kell, mert ebből tudja a program, hogy vége a kiírni való szövegnek.
A legutolsó 2 sor arra való, hogy a programnak megmondja honnan kezdje el kiírni az adatokat. Az a -1 csupán azért kellett, hogy könnyebb legyen ciklust írni rá.
Remélem érthető voltam. A többiektól bocsi a sok szövegért.
(#) deguss válasza gtk hozzászólására (») Júl 28, 2007 /
 
De, most is PIC hívő vagyok, csak értek mindkettőhöz, a PIC-eket magam tanultam meg, az AVR-ekkel meg suliban foglalkoztunk alap szinten. Aztán beleástam magam a témába rendesen.
Ismeritek a Hexapod-ot? Akit érdekel, úgyis megtalálja... Nos, igen, nem titkolom, én is közreműködtem.
(#) MaSTeRFoXX hozzászólása Júl 29, 2007 /
 
Sziasztok!
Végre elindul a dataflash memória. A szofveres SPI kódommal volt gond, továbbá egy nagyon furcsa gond miatt:
Fordatáskor a fordító bead egy figyelmeztetést:
main.c:212: warning: passing arg 1 of `USART_vSendByte' makes integer from pointer without a cast

Egy szubrutint akarok meghívni ami kiolvasná a gyártóazonosítót a memóriából és visszatérő értékként adná meg, majd elküldi sorosporton. A sorosporttal nincs semmi gond, az tökéletesen működik, csak a visszatérő értékkel.

a kód

  1. uint8_t get_mfid(void)
  2. {
  3. uint8_t mfid;
  4. //Lényegtelen mi van itt, és most ki is van
  5. kommentezve hogy 67-et adjon vissza
  6. mfid=67;
  7. return mfid;
  8. }
  9.  
  10. //......
  11. void USART_vSendByte(uint8_t u8Data)
  12. {
  13. // Wait if a byte is being transmitted
  14. while((UCSRA&(1<<UDRE)) == 0);
  15. // transmit data
  16. UDR = u8Data;
  17. }
  18. //.....
  19. USART_vSendByte(get_mfid);





Nem értem most miért nem megy, egy másik programomban ha minden igaz ugyanígy van írva, ott meg gond nélkül működik minden.
A 67 helyett meg csak 21-et küld vissza.
(#) MaSTeRFoXX válasza MaSTeRFoXX hozzászólására (») Júl 29, 2007 /
 
lemaradt az egyik sorból:
while((UCSRA&(1< < UDRE)) == 0);
De ez most nem számít.

A [ code ] beszúrósdi dolog meg nagyon nem működik...>>
(#) MaSTeRFoXX válasza MaSTeRFoXX hozzászólására (») Júl 29, 2007 /
 
Jajj, de **** vagyok
Rosszul írtam.... Jól: USART_vSendByte(get_mfid());
tehát egy ()
Na mindegy...
(#) deguss válasza MaSTeRFoXX hozzászólására (») Júl 30, 2007 /
 
[ c o d e = c ] kód [ / c o d e ]
(#) kocsgab002 hozzászólása Júl 30, 2007 /
 
Sziasztok!
Lenne egy nagy problémám. Szeretném megépíteni a gtk éle nixie csöves órát. de sajnos már az elején elakadtam. a letölthető fájlok között van egy *.c; *.hex; és egy makefile nevü fájl. sosem programoztam még avr-t, de még Pic-et sem letöltöttem a Bascom programot, de hamar rájöttem hogy nem jó, mert nem basicben van a progi hanem c-ben. kérdésem hogy milyen programmal lehet áttölteni a fájlt az ATMega8-ba? és milyen hardverre lesz szükségem? az STK200 jó hozzá? előre is köszi a segítséget mindenkinek.
Kocsgab
(#) gtk válasza MaSTeRFoXX hozzászólására (») Aug 1, 2007 /
 

Szia !

Csak most olvasom..
  1. USART_vSendByte( get_mfid );

Lehet, hogy ez meg a basic lenyomata?
(#) gtk válasza kocsgab002 hozzászólására (») Aug 1, 2007 /
 
Szia !

Az STK200 az jo.
Javaslom toltsd le a WinAVR-t es azzal egesd be.
(#) kocsgab002 válasza gtk hozzászólására (») Aug 2, 2007 /
 
köszi.
végül a ponyProg mellett döntöttem.
még olyan kérdésem lenne, hogy milyen biztonsági és konfigurációs biteket állítsak be?
köszi

ponyprog.JPG
    
(#) kocsgab002 válasza gtk hozzászólására (») Aug 2, 2007 /
 
ja igen és még egy dolog, hogy milyen jeleket kell invertálni?

ponyprog2.JPG
    
(#) davidov válasza kocsgab002 hozzászólására (») Aug 2, 2007 /
 
A fuse bitek beállítását ebből jól meg lehet érteni. Fontos, hogy a ponyprogban a pipa 0-át jelent!
A jel invertálással, én nem foglalkoztam...
(#) kocsgab002 válasza davidov hozzászólására (») Aug 2, 2007 /
 
Felfogtam, megértettem, teljesen világos most már nagyon köszönöm a segítséget.
(#) zeusz7 hozzászólása Aug 6, 2007 /
 
Hello!

LCD kijelzővel lenne egy kis problémám. ATtiny2313-mal kiiratok egy 2 soros LCD kijelzőre (VT162B) egy rövid szöveget inicializálás után, ami működik is, csak az első sorban a háttérben ott maradnak a sötét kockák, amíg nem nyomok a ponyprogon keresztül egy device reset-et.
Ha simán ki-bekapcsolom, akkor ott vannak a kockák.
Miért?
(#) deguss válasza zeusz7 hozzászólására (») Aug 6, 2007 /
 
Minden karakteres LCD adat nélkül tápfeszültségre kapcsolás után "fekete kockákat" jelez ki.
(#) zeusz7 válasza deguss hozzászólására (») Aug 6, 2007 /
 
Az ok, csak kiírja az adatot és a háttérben ott vannak a fekete kockák, ponyprogos reset után már csak az adat marad.
(#) zeusz7 válasza zeusz7 hozzászólására (») Aug 6, 2007 /
 
Betettem egy kis késleltetést a program elejére és így már jó.
bocsi
(#) deguss válasza zeusz7 hozzászólására (») Aug 7, 2007 /
 
ügyi
(#) zeusz7 hozzászólása Aug 7, 2007 /
 
LCD-vel kapcsolatban lenne kérdésem.
Karakterenként tudok kiiratni, de nem tudom, hogy lehetne stringet kiírni és nem úgy, hogy én iratom ki betűnként. Nyilván vmi ciklus kéne, amivel a string egyes karaktereit áttölti egyesével az LCD-be, de ez a rész homályos egyelőre.

.db "Hello!" ;ha jól tudom, így lehet stringet csinálni
Egyelőre ez van meg, köszi a segítséget!
(#) matrix64 válasza zeusz7 hozzászólására (») Aug 10, 2007 /
 
Nézd át ezt az oldalt,mindent megtalálsz:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD
Én egy pointerrel (Z) rámutatnék a stringre,ehhez kell egy
címkét adnod:
LABEL: .DB expressionlist
majd Z értékét növelve végigléptetni és egyesével kiiratni a karaktereket.A string végére tehetsz egy 0-át,így nem kell a darabszámmal foglalkoznod.
Ha szabad javasolnom-saját tapasztalat-még mielőtt elmenne a kedved az egésztől,térj át C-re,pl. a Codevision jó választás,pofon egyszerű inline asm-t is a kódba illeszteni.
(#) zeusz7 válasza matrix64 hozzászólására (») Aug 10, 2007 /
 
Na ezt alkottam, vagy inkább összelopkodtam, de a lényeg, hogy a Hello felirat helyett mindössze egy fekete kockát ír ki és próbálkoztam már mindennel, amivel tudtam.
Mi nem jó? Egy soros porti programból vettem ki a stringes részt és ott működött, itt meg valamiért nem.

szoveg:.db "Hello",0

ldi zl,low(szoveg*2)-1
ldi zh,high(szoveg*2)

kellmeg:
lpm temp, z+ ; beolvassa temp-be
cpi temp, 0x00 ; 00?
breq DIE ; ha igen, nincs tobb kiirnivalo
rcall KIIR ; Elmegy a kiiro rutinra
rjmp kellmeg

KIIR:
rcall LCD_DATA
rcall LCD_WAIT
ret
(#) matrix64 válasza zeusz7 hozzászólására (») Aug 10, 2007 /
 
A pointer definiciónál miért kell a -1 ?
(#) gtk válasza zeusz7 hozzászólására (») Aug 10, 2007 /
 
Idézet:

Az "összelopkodtam" helyett sokkal jobb ha megtanulod az adott nyelv lehetosegeit es majd azutan elsz vele. Maskepp sosem fogsz kelloen haladni .
Irasom kizarolag joindulatu.
(#) zeusz7 válasza gtk hozzászólására (») Aug 10, 2007 /
 
Nem értek veled teljesen egyet, mert sokat tanultam abból, hogy működő programokat alakítottam át és megértettem, hogy pontosan mi miért van és utána tudtam önállóan írni hasonlót vagy jobbat.

A -1-et én se teljesen értem, aki írta a programot, azt mondta, hogy így könnyebb ciklust írni rá. Próbáltam a -1 nélkül is.
Következő: »»   30 / 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