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   242 / 840
(#) kajozs válasza novarobot hozzászólására (») Jún 25, 2010 /
 
Hello!

Nem ismerem a win-avr-t, de az előttem szóló tanácsához még annyit tennék hozzá:
- milyen avr-t akarsz programozni, mert a winavr atmega88-at ir, és 8MHz-es frekit, a programban viszont csak 1MHz van irva (vagy a kódban lévőt veszi figyelembe?)
- ezzel a sorral minden stimmel?
Idézet:
  1. DDRB |= (1<<PCB);        //  PC0 kimenet
(#) fillx hozzászólása Jún 25, 2010 /
 
Sziasztok!

ATmega16 -ban A Timer1 modult hogyan tudom menet közben be és kikapcsolni???

ilyesmivel próbálkoztam:

  1. #define T1_ON() TCCR1B |=(1<<CS10); sei()
  2. #define T1_OFF() TCCR1B &=(1<<CS10)
  3.  
  4. TCCR1A|=(1<<COM1A0)|(1<<WGM10)|(1<<WGM11);
  5. TCCR1B|=(1<<WGM12)|(1<<WGM13);
  6. ICR1=295;
  7. OCR1A=147;
  8.  
  9. DDRD|=(1<<PD5);


be bekapcsol ki is kikapcsol de másodjára nem müködik

36khz jelet szeretnék előállítani OCR1A lábon és kapcsolgatni szeretném.
(#) novarobot hozzászólása Jún 25, 2010 /
 
Elég fáradt voltam az este .

Igen az általam használt AVR "ATMEGA88-20PU"

A kiemelt sor, a valóságban így néz ki:
  1. DDRB |= (1<<PC0);        //  PC0 kimenet


A programban jó volt, csak ide került valahogy rosszul
Hogy pontosan milyen frekvenciát használok azt nem is tudom, az biztos hogy a belső RC tagot.

Valahol olvastam hogy az 1MHz-s a belső RC de nem biztos.
A kódban azért szerepel ez a sor:
  1. //A belső RC-t használom, de ettől a sortól fügétlenül fenn ál a hiba.
  2. #define F_CPU 1000000UL  // 1 MHz CPU clock

mert "FZIKUS" kódja alapján próbálkozom, ott láttam ezt a sort, és próbaképpen bemásoltam, de semmi hatása, próbáltam e sor nélkül is, de sehogy nem fordul a kód, sehogy nem látja a GIFR és GICR regisztereket.

Nem értem mi lehet a baja
(#) novarobot válasza fillx hozzászólására (») Jún 25, 2010 /
 
Kikapcsolni úgy tudod, hogy minden bitet ahová egyest tettél 0-át teszel.

Sőt szerintem elég ha csak a COM1A0 -ba írsz 0-át.

Olvasd el FIZIKUS "WIL-I" cikksorozatának első részét, inkább a PWM ről beszél, de elmagyarázza a regiszterek TIMER lényegét is.
(#) zolee1209 válasza novarobot hozzászólására (») Jún 25, 2010 /
 
Bővebben: Link
Ennek utána néztél már?
(#) zolee1209 válasza fillx hozzászólására (») Jún 25, 2010 /
 
Adatlap 113-ik oldal...
Idézet:

CS12 CS11 CS10 Description
0 0 0 No clock source (Timer/Counter stopped).

Vagyis elég ezt a három bitet nullázni.
szerk.:
Azt elfelejtettem írni, hogy ez a TCCR1B regiszterben található. Így teljes.
(#) novarobot válasza zolee1209 hozzászólására (») Jún 25, 2010 /
 
Váó biztos ez lesz a baj, sajnos most nem vagyok az AVR égetőm közelébe ahogy hazaérek ki is próbálom.

EZER KÖSZÖNET

novarobot
(#) zolee1209 válasza novarobot hozzászólására (») Jún 25, 2010 /
 
Nincs mit! De azért figyelj arra, mit írnak neked segítségül!
(#) zolee1209 válasza fillx hozzászólására (») Jún 25, 2010 /
 
Na most leírtam, amit valószínűleg te is tudsz...
Sajnos a C-hez nem értek, de ha adott bitet 1-gyel VAGY-olok, egy lesz, de ha ugyanazt a bitet 1-gyel ÉS-elem, akkor az nem marad egy?! A kódod első két sorára gondolok. :hide: Én nem használom ezt a formát asm-ben, így nem tudom, bocsánat, ha nagy hülyeséget hoztam fel.
(#) Proci_85 válasza novarobot hozzászólására (») Jún 25, 2010 /
 
Idézet:
„Valahol olvastam hogy az 1MHz-s a belső RC de nem biztos.”

8Mhz a belső osszcillátora. Ezért:
  1. #define F_CPU 8000000


Itt egy példaprogram atmega88 IT-re.
(#) herzsolt hozzászólása Jún 25, 2010 /
 
Hogyan lehet c-ben megoldani, hogy ha az atmega8-on van 3db nyomógomb, ami 3 különböző dolgot kapcsol, azt 1db gombbal helyettesíteni lehessen, pl hőfok kijelzés esetén 3 hőfok kiírattatását ne három gomb végezze, hanem egy gombbal lehessen léptetni.
(#) Norberto válasza Proci_85 hozzászólására (») Jún 25, 2010 /
 
Hali!

Mivel anno ez nyílt anyagként volt fent a neten, így gondolom nem gond, ha felrakom most, miután nem elérhető már az eredeti helyen.

nanoboard.doc
    
(#) Proci_85 válasza Norberto hozzászólására (») Jún 25, 2010 /
 
Szerintem nem. Olyannyira nem, hogy a kapcsrajzot épp a napokban kerestem, úgyhogy köszönet érte
Amúgy ez a doksi fent van a kando.tk-n is. Kár, hogy hamarabb nem jutott eszembe.
(#) novarobot válasza Proci_85 hozzászólására (») Jún 25, 2010 /
 
Köszi a segítséget, Kandó-s vagy? vagy csak ismerted a wiki oldalukat?

Én a Kandó-ra járok, de programozásom csak a jövő félévben lesz, és nem ismertem még azt az oldalt.

Most Szeretném pont az AVR-t a soros portra kötni, ezért nagyon jól jött a mintakód amit belinkeltél.
(#) herzsolt válasza herzsolt hozzászólására (») Jún 25, 2010 /
 
Ezt a részt kellene egy gombá gyúrni
  1. if (ReadKey == 1)
  2.         {
  3.                 ee_tmprSet = T_set[0];
  4.                 program = 1;
  5.                 ReadKey = 0;
  6.         }
  7.         if (ReadKey == 2)
  8.         {
  9.                 ee_tmprSet = T_set[1];
  10.                 program = 2;
  11.                 ReadKey = 0;
  12.         }        
  13.         if (ReadKey == 3)
  14.         {
  15.                 ee_tmprSet = T_set[2];
  16.                 program = 3;
  17.                 ReadKey = 0;
  18.         }
(#) Reggie válasza novarobot hozzászólására (») Jún 25, 2010 /
 
Ha az adatlapon nem talaltal GICR ill GIFR regisztert akkor azert nem talalja a fordito sem mert nincs. Meg kene keresned az adatlapon a megfelelo regisztereket es azt kell hasznalni. Egyebbkent melyik ic-t hasznalod? Mert atmega20 nincsen.
(#) novarobot válasza Reggie hozzászólására (») Jún 25, 2010 /
 
A probléma megoldódott, ATMEGA88-20PU AVR-t használtam, és más volt a regiszterek neve.
(#) berghammer hozzászólása Jún 25, 2010 /
 
Egy ATmega8-16PU processzort szeretnék prógramozni a Topi féle AVR programozóval, de sehogyan sem jön össze.

ISP-vel való programozásnál nem tud belépni a programozói módba és az ISP frekvencia értékétől függetlenül mindig olyan hibaüzenetet küld, hogy ellenőrizzem az ISP frekvenxiát.

Parallel/High voltage programozásnál pedig nem ír ki hibát a programozás közben, hanem az ellenörzésnél mondja azt, hogy nem egyezik meg a beírt program. (Nem az a baj, hogy a beírt program rövidebb mint a kiolvasott, hanem a kettőnek semmi köze egymáshoz.)

Mit csinálok rosszul?
(#) Fizikus válasza herzsolt hozzászólására (») Jún 25, 2010 /
 
En gombnyomaskor egy valtozo erteket novelnem es ezt vizsgalva irnam ki a kulonbozo ertekeket. Valami ilyesmit tennek egy vegtelen ciklusba, vagy kulso megszakitast hasznalva az ISR-be (a gombot pergesmentesiteni kell!):

  1. unsigned char gombnyomas = 0;
  2.  
  3. if (a gomb le van nyomva)
  4. {
  5.         gombnyomas++;
  6.  
  7.         if(gombnyomas == 3)
  8.        {
  9.             gombnyomas = 0;
  10.         }
  11. }
  12.  
  13. switch(gombnyomas)
  14.         {
  15.                 case 0:
  16.                         utasitasok az alapertelmezett kijelzohoz;
  17.                         break;
  18.                 case 1:
  19.                         utasitasok az elso gombnyomas utani kijelzeshez ;
  20.                         break;
  21.                 case 2:
  22.                         utasitasok a masodik gombnyomas utani kijelzeshez;
  23.                         break;
  24.                 default:
  25.                         break;
  26.         }
(#) trudnai válasza Fizikus hozzászólására (») Jún 25, 2010 /
 
En annyit valtoztatnek, hogy visszafele lepkednek, igy a fordito optimalisabb kodot tud generalni a mikrovezerlod szamara. Valahogy igy:

  1. #define MAXGOMB 3
  2. unsigned char gombnyomas = MAXGOMB;
  3.  
  4. if (a gomb le van nyomva)
  5. {
  6.     if ( 0 == (--gombnyomas) ) {
  7.         gombnyomas = MAXGOMB;
  8.     }
  9. }
  10.  
  11. // gondolom ezt a reszt az esemeny kezelon (pl ISR) kivulre gondoltad?
  12. switch(gombnyomas)
  13. {
  14.     case 3:
  15.         utasitasok az alapertelmezett kijelzohoz;
  16.         break;
  17.     case 2:
  18.         utasitasok az elso gombnyomas utani kijelzeshez ;
  19.         break;
  20.     case 1:
  21.         utasitasok a masodik gombnyomas utani kijelzeshez;
  22.         break;
  23.     default:
  24.         HIBAKEZELES!
  25.         break;
  26. }
(#) echo11 hozzászólása Jún 26, 2010 /
 
Hello! Mivel még nem jött meg a programozóm, ezért csak az AVRStudio-t próbálom belőni. Az első bajom az, hogy ha kimásolom és beillesztem a kódot erről a weblapról, akkor nem hajlandó lefordítani, de ha a megjegyzéseket és a sorszámokat törlöm, akkor minden OK, de citromsárga körrökkel (2db) ezt kapom: " c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:85:3: warning: #warning "F_CPU not defined for " " a másik: " c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:90:3: warning: #warning "Compiler optimizations disabled; functions from won't work as designed"
". Megcsinálja a .hex-et de sajnos még nem tudom kipróbálni.Ez a két üzenet mit jelent és ezektől függetlenül megy? A másik kérdésem jóval egyszerűbb, csak ennyi: mekkora lehet a legkisebb "_delay_ms " érték? Szóval, hogy felvehet-e 1-nél kisebb számot? És hogy a legkisebb értéket befolyásolja-e a kvarc nagysága?Előre is köszönöm.
(#) sgt válasza poznamokus hozzászólására (») Jún 26, 2010 /
 
Ez volt a hiba. Nagyon köszönöm a segítséget :yes: :yes: :yes: . (Elnézést hogy csak most tudtam reagálni)
(#) sgt válasza Reggie hozzászólására (») Jún 26, 2010 /
 
Ha nincs beállítva a belső, akkor igen külsőt kötöttem rá. Maga a programnak az a lényege, mert először ellenőrizni akartam a helyes működést. Értelemszerűen van még header fájl, meg main meg ilyenek, hogy szintaktikailag helyes legyen.
(#) sgt válasza novarobot hozzászólására (») Jún 26, 2010 /
 
Jó magam kandós műszeres, és F1-en vagyok.
(#) öregharcsa hozzászólása Jún 26, 2010 /
 
Előre is elnézest kérek ha már valaki válaszolt a kérdésemre, de eddig nem találtam...
BASCOM-AVR-t használok, de nem ismeri a GICR regisztert. Emiatt nem tudom compilálni a programomat.
A BASCOM verzió 1.11.9.0 .
Segítséget kérek !

Előre is köszönöm !
(#) sgt válasza echo11 hozzászólására (») Jún 26, 2010 /
 
Idézet:
„c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:85:3: warning: #warning "F_CPU not defined for "”


Ez csak annyi, hogy define-ban nem írtad oda a header fájlok alá a frekit. Pl:

  1. #define F_CPU 8000000 // 8MHz processor


1ms-nél kisebb pl.:

  1. _delay_us(1); // 1 mikroszenkudum


Errornál van baj, warningnál működhet.
(#) Topi válasza sgt hozzászólására (») Jún 26, 2010 /
 
Idézet:
„nem írtad oda a header fájlok alá a frekit.”


Fölét akartál írni ugye?
(#) Kafka válasza öregharcsa hozzászólására (») Jún 26, 2010 /
 
Melyik kérdésről is van szó pontosan? (nem találom)
(#) herzsolt hozzászólása Jún 26, 2010 /
 
Hogyan lehet ezt összehozni?

  1. if (Mode == 0)
  2.         {        
  3.                 sprintf(lcd_buffer1, "Hofok    Tc=%03i", T_disp);
  4.                 sprintf(lcd_buffer2, "Menu%i  Set=%03i", program , T_set[Mode - 1]);
  5.  
  6.         }      
  7.         else {(Mode == 1 || Mode == 2 || Mode == 3)
  8.                
  9.                 sprintf(lcd_buffer1, "Tc=%03i Celsius-fok", T_disp);
  10.                 sprintf(lcd_buffer2, "Setpoint=%03i Menu%i", ee_tmprSet, program);
  11.  
  12.         };
  13.         lcd_gotoxy(0, 0);
  14.         lcd_puts(lcd_buffer1);
  15.         lcd_gotoxy(0, 1);
  16.         lcd_puts(lcd_buffer2);
  17.  
  18.         OCR1AH = (unsigned char)(pwm_val>>8);        
  19.         OCR1AL = (unsigned char)pwm_val;
  20.         };


Mindig hibát ír ki a codevison:"Error: C:\cvavr2\Project\main.c(197): missing ';'"
(#) Hp41C válasza herzsolt hozzászólására (») Jún 26, 2010 /
 
Szia!

Így:
  1. if (Mode == 0)
  2.               {      
  3.                       sprintf(lcd_buffer1, "Hofok    Tc=%03i", T_disp);
  4.                       sprintf(lcd_buffer2, "Menu%i  Set=%03i", program , T_set[Mode - 1]);
  5.        
  6.               }      
  7.               else { if ((Mode == 1) || (Mode == 2) || (Mode == 3))
  8.                      
  9.                       sprintf(lcd_buffer1, "Tc=%03i Celsius-fok", T_disp);
  10.                       sprintf(lcd_buffer2, "Setpoint=%03i Menu%i", ee_tmprSet, program);
  11.        
  12.               };
  13.               lcd_gotoxy(0, 0);
  14.               lcd_puts(lcd_buffer1);
  15.               lcd_gotoxy(0, 1);
  16.               lcd_puts(lcd_buffer2);
  17.        
  18.               OCR1AH = (unsigned char)(pwm_val>>8);        
  19.               OCR1AL = (unsigned char)pwm_val;
  20.               };

vagy így:
  1. if (Mode == 0)
  2.               {      
  3.                       sprintf(lcd_buffer1, "Hofok    Tc=%03i", T_disp);
  4.                       sprintf(lcd_buffer2, "Menu%i  Set=%03i", program , T_set[Mode - 1]);
  5.        
  6.               }      
  7.               else { (Mode == 1 || Mode == 2 || Mode == 3);
  8.                      
  9.                       sprintf(lcd_buffer1, "Tc=%03i Celsius-fok", T_disp);
  10.                       sprintf(lcd_buffer2, "Setpoint=%03i Menu%i", ee_tmprSet, program);
  11.        
  12.               };
  13.               lcd_gotoxy(0, 0);
  14.               lcd_puts(lcd_buffer1);
  15.               lcd_gotoxy(0, 1);
  16.               lcd_puts(lcd_buffer2);
  17.        
  18.               OCR1AH = (unsigned char)(pwm_val>>8);        
  19.               OCR1AL = (unsigned char)pwm_val;
  20.               };
Következő: »»   242 / 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