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   792 / 837
(#) kapu48 válasza killbill hozzászólására (») Márc 30, 2018 /
 
Amíg fogalmunk nincs, milyen szinten ismeri a témát!
Ötletezni sem tudunk, hogy mit képes megvalósítani?

Ezért kellet volna látni a próbálkozását, mivel a felvetett téma megoldása eléggé egyszerű feladat lenne!
Ja és a kérésem nem hozzád szólt!
(#) fifadani hozzászólása Márc 30, 2018 /
 
Nos, a konkrét probléma a következő:
Van egy útkereszteződéses nyákom.
A forgalom irányítását már megcsináltam.
A panelon van két gomb, ami a vonat érkezését és távozását szimbolizálja.
Megnyomom a bal gombot, jön a vonat. Ha jobb oldalit nyomom meg, elmegy.
Viszont amikor nyomom a jobb oldali gombot, röngtön bemegy a vonat jön jobbról részbe.
Sem delay-t sem while-t nem használhatok, mert a timer1 megszakításban vizsgálom, hogy jön-e vonat.
Viszont akkor is működnie kell, ha először a jobb oldali gombot nyomom le.

Így csináltam a balról jobbra irányt:
  1. void vonat(void)
  2. {
  3.        
  4.         if((!(PINE & (1<<BTNV1))) )
  5.         {       vonatbeb=1;     vanvonat=1;}
  6.         if(vonatbeb==1)
  7.         {
  8.                 PORTF &=~(1<<LV_F);
  9.                 if(villogseg){  PORTF |= (1<<LV_P1); PORTF &=~(1<<LV_P2);       }
  10.                 else            {       PORTF |= (1<<LV_P2); PORTF &=~(1<<LV_P1);       }
  11.                 if((!(PINE & (1<<BTNV2))))
  12.                 {       vonatbeb=0;     PORTF &=~(1<<LV_P1); PORTF &=~(1<<LV_P2);       vanvonat=0;}
  13.         }
  14.  
  15.         if(vonatbeb==0 )
  16.         {       PORTF |= (1<<LV_F);     }
  17. }
(#) kapu48 válasza fifadani hozzászólására (») Márc 30, 2018 /
 
Szerintem kellene még vizsgálni, hogy milyen irányba megy a vonat.
Ezt esetleg meg tudnád állapítani ha, vizsgálod, hogy a sin pálya melyik oldala van GND-n?

Vagy az ellenkező oldali első gombnyomást úgy értelmezni, hogy elment a vonat.
És csak a következő nyomás jelzi az érkezést.

Minden féle képen tudni kellene, hogy éppen merre halad a vonatod?
A hozzászólás módosítva: Márc 30, 2018
(#) fifadani hozzászólása Márc 30, 2018 /
 
Nincs definiálva, hogy tudni kell az irányt.
Csak annyi, hogy egyik gombal érkezik, másikkal elmegy. Bármelyik irányból érkezhet, bármikor.
(#) kapu48 válasza fifadani hozzászólására (») Márc 30, 2018 /
 
Így próbáld:
  1. void vonat(void)
  2. {
  3.        // jön balrol
  4.         if((!(PINE &(1<<BTNV1)))&& vonatbeb==0{      
  5.                                         vonatbeb=1;    
  6.                                         vanvonat=1;
  7.                                                 PORTF &=~(1<<LV_F);
  8.                                                 if(villogseg){  
  9.                                                         PORTF |= (1<<LV_P1);
  10.                                                         PORTF &=~(1<<LV_P2);
  11.                                                 }else{  
  12.                                                         PORTF |= (1<<LV_P2);
  13.                                                         PORTF &=~(1<<LV_P1);
  14.                                                 }
  15.                                 }
  16.                         // elmegy balrol
  17.                                 if((!(PINE & (1<<BTNV2)))&& vonatbeb==1){      
  18.                                                         vonatbeb=0;    
  19.                                                         PORTF &=~(1<<LV_P1);
  20.                                                         PORTF &=~(1<<LV_P2);  
  21.                                                         vanvonat=0;
  22.                                 }
  23.                         // jön jobbrol                
  24.                                 if((!(PINE & (1<<BTNV2)))&& vonatbeb==0){  
  25.                                         vonatbeb=1;    
  26.                                         vanvonat=1;
  27.                                                 PORTF &=~(1<<LV_F);
  28.                                                 if(villogseg){  
  29.                                                         PORTF |= (1<<LV_P1);
  30.                                                         PORTF &=~(1<<LV_P2);
  31.                                                 }else{  
  32.                                                         PORTF |= (1<<LV_P2);
  33.                                                         PORTF &=~(1<<LV_P1);
  34.                                                 }      
  35.         }
  36.                         //      elmegy jobbrol
  37.                                 if((!(PINE & (1<<BTNV1)))&& vonatbeb==1){      
  38.                                                         vonatbeb=0;    
  39.                                                         PORTF &=~(1<<LV_P1);
  40.                                                         PORTF &=~(1<<LV_P2);  
  41.                                                         vanvonat=0;
  42.                                 }                      
  43.  
  44. }
(#) kapu48 válasza kapu48 hozzászólására (») Márc 30, 2018 /
 
Vagy a villogást is külön vizsgáld:
  1. void vonat(void)
  2. {
  3.     // jön balrol
  4.     if((!(PINE &(1<<BTNV1)))&& vanvonat==0{      
  5.                         vonatbeb=1;    
  6.                         vanvonat=1;
  7.                         PORTF &=~(1<<LV_F);
  8.                 }
  9.                 // elmegy balrol
  10.                 if((!(PINE & (1<<BTNV2)))&& vanvonat==1){      
  11.                         vonatbeb=0;    
  12.                         PORTF &=~(1<<LV_P1);
  13.                         PORTF &=~(1<<LV_P2);  
  14.                         vanvonat=0;
  15.                 }
  16.                 // jön jobbrol                
  17.                 if((!(PINE & (1<<BTNV2)))&& vanvonat==0){  
  18.                         vonatbeb=1;    
  19.                         vanvonat=1;
  20.                         PORTF &=~(1<<LV_F);
  21.     }
  22.                 //      elmegy jobbrol
  23.                 if((!(PINE & (1<<BTNV1)))&& vanvonat==1){      
  24.                         vonatbeb=0;    
  25.                         PORTF &=~(1<<LV_P1);
  26.                         PORTF &=~(1<<LV_P2);  
  27.                         vanvonat=0;
  28.                 }      
  29.         // villog ha bent a vonat
  30.                 if(villogseg && vanvonat==1){  
  31.                         PORTF |= (1<<LV_P1);
  32.                         PORTF &=~(1<<LV_P2);
  33.                         villogseg = !villogseg;
  34.                 }else{  
  35.                         PORTF |= (1<<LV_P2);
  36.                         PORTF &=~(1<<LV_P1);
  37.                         villogseg = !villogseg;
  38.                 }      
  39. }
A hozzászólás módosítva: Márc 30, 2018
(#) fifadani hozzászólása Ápr 1, 2018 1 /
 
Közben sikerült megcsinálnom.
Köszönöm szépen!
(#) kapu48 válasza fifadani hozzászólására (») Ápr 1, 2018 / 2
 
Az ilyen viselkedés lassan elveszi a kedvem az egész fórumtól!
Mi önzetlenül segítőkészek vagyunk!

Utána a delikvens önzően eltitkolja a megoldást!
És gyorsan eltűnik a balfenéken!
(#) fifadani hozzászólása Ápr 1, 2018 /
 
Milyen viselkedés?
Megköszöntem a segítséget.
Az, hogy esetleg más úton oldottam meg, miért gond?
Egyébként a megoldásom, hogy a gomb lenyomott idejét vizsgálom. Ha tovább nyomom 100ms-nál, belép... Rövidebbre pedig kilép.
(#) kapu48 válasza fifadani hozzászólására (») Ápr 1, 2018 /
 
Az volt a feltételed, hogy nem lehet sehól várakozni!

Így pedig várakozol a gomb megnyomásától az elengedéséig, közben még időt mérsz?
Szerintem a legrosszabb megoldás.
(#) fifadani hozzászólása Ápr 1, 2018 /
 
Elírtam. Nincs 100 ms. Csak kb 20ms. Egyébként a kikötés az volt, hogy delay-t mint függvényt nem használhatok. For-al oldottam meg a várakozást. Lényeg, hogy a tanár fogadja el így.
A hozzászólás módosítva: Ápr 1, 2018
(#) vargham válasza fifadani hozzászólására (») Ápr 1, 2018 /
 
És elfogadta? Csak mert egy for cikluson belül várakozni, az ugyanúgy busy wait, mint a delay()...
(#) kapu48 válasza fifadani hozzászólására (») Ápr 1, 2018 /
 
Az édes mindegy, hogy minek nevezed a várakozást!

A lényeg, hogy megállítod vele a program futását.
És ezért nem tudod időben észlelni, lekezelni ha máshól történik valami.
(#) fifadani hozzászólása Ápr 1, 2018 /
 
Igen, nem volt úgy jó. Most timer1 isrben számolok. Így megy időben más is. Szerintem így már jónak kell lennie.
Házi kész. Köszönöm a segítséget.
A hozzászólás módosítva: Ápr 1, 2018
(#) RoliNyh hozzászólása Ápr 12, 2018 /
 
Üdvözletem!

Tudnátok mutatni/ajánlani olyan projektet, ami egy SPI/I2C grafikus kijelzőt használ attiny44 procival?
Tehát az lenne a lényeg, hogy beleférjen egy egyszerű program, a 4KB -os programtárba.
Maximum pár láb állapotát kellene HIGH/LOW szintre állítani
(két analogRead, egy analogWrite és pár digitalRead / digitalWrite lenne benne),
és mellé egy kis grafikus színes kijelzőn kiírni pár konstans szöveget, és változót.
Nincs szükség az összes színárnyalatra, az is elég volna, ha a fő színek mennének (RGB).
Én (igaz arduino IDE -vel) hiába próbáltam, a legkissebb programméret is körülbelül 10KB.
A hozzászólás módosítva: Ápr 12, 2018
(#) RoliNyh válasza RoliNyh hozzászólására (») Ápr 12, 2018 /
 
Vagy ha már itt tartunk, akár olyam megoldás is érdekelne, hogyan lehet felhasználni külső soros EEPROM -ot adattárként. Tehát ha egy lefordított *HEX nem fér be a belső adattárba, akkor megoldható -e úgy "szétvágni" a programot, hogy az első fele a proci belső adattárjába kerüljön, a maradék része pedig a külsőbe. De akár az is jó lenne, ha a belső tárolóba csak valami kis program futna, ami megoldja, hogy a külső EEPROM -ból tudjon egy nagyobb programot futtatni, ami a belső tárba nem fér bele...
(#) vargham válasza RoliNyh hozzászólására (») Ápr 12, 2018 /
 
1 Adatot tudsz tárolni a külső EEPROMban, programot nem.
2 Miért nem választasz a feladathoz jobban illő (nagyobb) mikrokontrollert?
(#) RoliNyh válasza vargham hozzászólására (») Ápr 12, 2018 /
 
Mert ebből hirtelen van itt kettő, és gondoltam felhasználom az egyiket...
(#) kapu48 válasza RoliNyh hozzászólására (») Ápr 12, 2018 / 1
 
Ha nagyon kevés helyed van?
Próbáldki Ezt: WinAVR
Természetesen mindent tanulni kel!
(#) csatti2 válasza RoliNyh hozzászólására (») Ápr 13, 2018 /
 
Grafikus kijelzőt ne akarj 4kB-os mikrokontrollerrel kezelni, még egy tisztességes betűtípus sem fér bele. 16kB (de inkább 32kB) a minimum, amivel érdemes nekifutni.
(#) RoliNyh válasza kapu48 hozzászólására (») Ápr 13, 2018 /
 
Jól van, megnézem...
(#) RoliNyh válasza csatti2 hozzászólására (») Ápr 13, 2018 /
 
Pedig Kovidivi szerint bizony bele fér az, ahogy ő számolta, bőven volna még hely másra is.
Azt nem tudom mennyire helytálló a számítása. Mindenesetre ha valóban úgy van ahogy állítja,
akkor bizony más eszi a háttértárat, nem a karakterkészlet...
(#) Kovidivi válasza RoliNyh hozzászólására (») Ápr 13, 2018 /
 
Itt a bizonyíték. Minden betű 5byte-ot foglal. Minden karaktert kézzel készítettem. Ha 16000 byte lenne egy egész karakter készlet, még ma sem lennék kész. A fontkészlet feldolgozását egyéni függvény végzi a LED-mátrix kijelzőkre, és scrollozódik oldalra a szöveg, ha hosszabb, mint a kijelző.
(#) RoliNyh válasza Kovidivi hozzászólására (») Ápr 13, 2018 /
 
Jól van, elhiszem én amit írtál a méretről, de már a második ember jön nekem azzal,
hogy "elvileg" még a karakterkészlet sem fér be 4KB -ba. Egyébként én megértetem a matematikai levezetést is, azért tételeztem fel, hogy bizony más eszi meg a helyet, de kezdem azt érezni, hogy ezzel mások sincsenek tisztában...

Amúgy megpróbáltam ez alapján elindulni, és megpróbáltam lefordítani az említett LED villogtatót, de hibaüzenettel megáll.
Idézet:

> "make.exe" all

-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling C: main.c
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o
main.c:8: warning: function declaration isn't a prototype
main.c:25: fatal error: opening dependency file .dep/main.o.d: No such file or directory
compilation terminated.
make.exe: *** [main.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:00


Most meg valami main.o kell neki, pedig erről szó sem volt a leírásban...
A win kereső szerint az egész háttértáramon sehol nincs main.o...
A hozzászólás módosítva: Ápr 13, 2018
(#) kapu48 válasza RoliNyh hozzászólására (») Ápr 13, 2018 /
 
Sajnos mi elvesztettük a fonalat! Miről is van szó pontosan, melyik program, link van?
Legutóbb, még ha jól emlékszem attyny48-asra írt programról beszéltél.

Ami memória spórolás miatt televolt assembler kóddal.
Most pedig mmcu=atmega16-ra fordítanád? Ami eleve hiba, mert nem egyeznek a regiszter nevek a kettő között.

main.c:25. sorban: fatal error: keresd a hibát.

main.objektet a fordító állítja elő, ha sikerül neki!
A hozzászólás módosítva: Ápr 13, 2018
(#) RoliNyh válasza kapu48 hozzászólására (») Ápr 13, 2018 /
 
Előző hozzászólásomban ott a link.
Most nem a proci a lényeg, csak a példaprogramot (LED villogó) akartam lefordítani, hogy lássam, hogy rendben működik a programers notepad és a WinAVR, mert még nem használtam...
  1. //Próba projekt
  2. //LED villogó
  3.  
  4. #include <avr/io.h>
  5. #include <util/delay.h> // a szóközt ki kell venni a < > jelek mellől, a fórummotor miatt...
  6.  
  7. void kesleltet()
  8.         {
  9.         for(uint8_t i=0; i<10; i++)
  10.                 {
  11.                 _delay_ms(200);  
  12.                 }
  13.         }
  14.  
  15. int main(void)
  16.         {
  17.         DDRD=0xFF;
  18.         while(1)
  19.                 {
  20.                 PORTD=0x00;
  21.                 kesleltet();
  22.                 PORTD=0xFF;
  23.                 kesleltet();
  24.                 }
  25.         }


A 25 -ös sörban pedig már csak a záró kapcsos zárójel van...
A hozzászólás módosítva: Ápr 13, 2018
(#) kapu48 válasza RoliNyh hozzászólására (») Ápr 13, 2018 /
 
Az utolsó } jel után még nyomjál 1 entert.
(#) RoliNyh válasza kapu48 hozzászólására (») Ápr 15, 2018 /
 
Ez nem segített, a hiba ugyan az...
(#) RoliNyh válasza RoliNyh hozzászólására (») Ápr 15, 2018 /
 
Egyébként érdekes, mert ha az elejéről a fügvénydeklarációt kikommenteltem, és csak az int main(void)
részt hagyom benne, persze a két fügvényhívást innen is kikommenteltem, a hiba kb ugyanaz,
nem találja a main.o fájlt...

De egyébként a konkrét hiba.:
"main.c:25: fatal error: opening dependency file .dep/main.o.d: No such file or directory"
tehát elvileg egy dep/ mappában kellene lenni ennek a fájlnak, de ilyen mappa sincs amúgy...
A hozzászólás módosítva: Ápr 15, 2018
(#) AxaGame hozzászólása Ápr 15, 2018 /
 
Sziasztok!
Tanácsotokat kérem, mielőtt kidobom a panelt.
Van egy panelem, amiben Atmega1284 ketyeg.
Elkészítettem hozzá egy progit (egy bldc vezérlőt írtam, de ez most mellékes), és betöltöttem rá.
Atmel studio+Dragon isp betöltő.
Idáig rendben is mentek a dolgok.
Kis módosítást szerettem volna a programban. Ezt szerettem volna betölteni, de szerencsétlen módon az Atmel Studio megállt valamiért, majd újraindította magát.
A probléma az, hogy innentől kezdve nem tudom rátölteni a processzorra az új verziót, sem a fuse biteket érem el.
Talán elérhetem, hogy a processzort párhuzamos módban is be tudjam programozni, vagy legalább egy teljes chip tudjak elvégezni.
Érdemes próbálkozni/kínlódni, hogy bevezetékezzem a párhuzamos égetést, vagy dobjam ki a panelt, mert reménytelen a dolog?

Z.
Következő: »»   792 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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