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   692 / 840
(#) Droot válasza vyky hozzászólására (») Szept 16, 2015 /
 
Itt találsz egy példát ATmega8-ra. Ha a timert átírod ATtiny2313-ra, akkor működik azon is. Az adatlapban hasonlítsd össze a regisztereket, lehet hogy nem is kell semmit módosítani.
(#) vyky válasza Droot hozzászólására (») Szept 16, 2015 /
 
Szia. Köszönöm szépen,de Érdekes,mert ha proteusban fordítom le akkor hibával kiáll,ha meg avrstudioval,akkor jó.
(#) Sick-Bastard válasza vyky hozzászólására (») Szept 16, 2015 /
 
Proteusban nekem sem mentek az osszetettebb kodok, amik a valosagban hiba nelkul lefutottak.
(#) Droot válasza vyky hozzászólására (») Szept 16, 2015 /
 
Ezért kelll élőben tesztelni mindent. Sokkal hamarabb rájössz, hogy mi a gond, nem kell azon gondolkozni hogy a szimulátorban vanhiba vagy a programodban.
(#) Kerberosz1 válasza csatti2 hozzászólására (») Szept 16, 2015 /
 
Üdv, ha jól értem, a pin change interuptot az int0:2 pinek aktiválják, de sajnos nekem 2 csatornát kéne olvasnom és csak a portb0:5 és a porta pinek szabadok, átírhatnám a kódom ahogy te javasoltad hogy overflowoknál növeljem egy változó értékét, de nem vagyok biztos benne hogyan kéne, úgy értem én azt is ugyanúgy csinálnám mint az eredeti kódom, de hát az meg nem működik, vetnél egy pillantást rá hogy mért nem? Az eredeti kérdésem a kóddal kapcsolatos és mindenki átsiklik rajta.
  1. int channel1 = 100;
  2.     int flip = 1;
  3.      
  4.     int main(void)
  5.     {
  6.             DDRA = 0XFF;
  7.             DDRB |= 1<<PINB1;
  8.      
  9.             TCCR0 |= 1<<CS02;
  10.         while(1)
  11.         {
  12.                     if((PINB & 1<<PINB0) && flip==1)
  13.                     {
  14.                             TCNT0=0;
  15.                             flip=0;
  16.                     }
  17.                     if(~(PINB & 1<<PINB0) && flip==0)
  18.                     {
  19.                             channel1=TCNT0;
  20.                             flip=1;
  21.                     }
  22.                     PORTA=channel1;
  23.                     if( channel1<=93 )
  24.                     {
  25.                             PORTB |= 1<<PINB1 ;
  26.                     }
  27.                     else
  28.                     {
  29.                             PORTB &= ~(1<<PINB1) ;
  30.                     }
  31.         }
  32.     }


ui.: az overflow részét értem
ISR(TIMER0_OVF_vect)
{
count++;
}
Azt nem értem hogyan észleljem a raising edge-t és a falling edge-t amikor a pinb0 high-ra vált és amikor low-ra
(#) rolandgw válasza vyky hozzászólására (») Szept 16, 2015 /
 
Ha ennyi a feladat,akkor szerintem felesleges túlbonyolítani prell mentesítéssel:
tiny2313-ra,nem teszteltem.
  1. #define F_CPU 1000000
  2. #include <avr/io.h>
  3. #include <avr/interrupt.h>
  4.  
  5. int main(void)
  6. {
  7.    DDRB=(1<<DDB1);
  8.    PORTB=(1<<PORTB1);
  9.    PORTD=(1<<PORTD2)|(1<<PORTD3);
  10.    GIMSK=(1<<INT1)|(1<<INT0);
  11.    sei();
  12.         while(1)
  13.     {
  14.     }
  15. }
  16.  
  17. ISR(INT0_vect){
  18.         PORTB |=(1<<PORTB1);
  19. }
  20. ISR(INT1_vect){
  21.         PORTB &=~(1<<PORTB1);
  22. }
(#) csatti2 válasza Kerberosz1 hozzászólására (») Szept 16, 2015 /
 
Hmm, egész elfelejtkeztem róla, hogy itt nem egy ATMega328P-ről van szó. Ott szinte minden láb használható megszakításra is.
Itt kénytelen vagy az INT0-1 jelölésű 2 láb közül választani egyet (ha jól látom az INT2 nem jó, mert csak egyik irányú változásra lehet konfigurálni). Más láb nem tud megszakítást generálni.

Őszintén szólva az ATXMEGA-k, amiket mostanában programozok, olyan szinten elkényeztettek, hogy nem sok kedvem van már sima ATMEGA-t programozni.
A hozzászólás módosítva: Szept 16, 2015
(#) attika hozzászólása Szept 16, 2015 /
 
sziasztok!!
Sikerült felprogramoznom a töltő Atmega32-es prociját.
Szépen elindul a program,a nyomógombokra reagál "csipog a piezo ahogy nyomkodom" ,de a kijelző valamiért nem akar elindulni csak a felső sorban vannak a kis négyzetek.
A kérdésem az lenne,hogy olyan létezhet,hogy az Atmega32-es kimenetei rosszak és ezért nem inicializálja a kijelzőt?
Sick-Bastard fórumtársunk nagyon sokat segített már nekem ebben a projektben,neki köszönhető,hogy legalább eddig eljutottunk,de sajnos most C vágány van és fogalmam sincs merre tovább.
(#) Sick-Bastard válasza rolandgw hozzászólására (») Szept 16, 2015 /
 
Ez nem lenne egyszerubb?
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. int main(void)
  5. {
  6.         DDRB = 0x02;
  7.        
  8.         while(1)
  9.         {
  10.                 if(PORTD & 1<<PIND2) // ON
  11.                 {
  12.                         PORTB |=(1<<PINB1);
  13.                 }
  14.                 if(PORTD & 1<<PIND3) // OFF
  15.                 {
  16.                         PORTB &=~(1<<PINB1);
  17.                 }
  18.                 _delay_ms(100); // ez elhagyhato
  19.         }
  20. }


A feladata szerint nem kell megszakitast hasznalni. (vagy megis?)
A prell meg azert felesleges, mert mindegy jelen esetben hogy az ON vagy az OFF most 1x vagy 100x kattan 10-100ms alatt.
Mondjuk ha egy gombos ON/OFF megoldas lenne XOR-al, akkor mar szamitana.
Fontosabb hogy meglegyenek a fel/lehuzo elenallasok.
(#) rolandgw válasza Sick-Bastard hozzászólására (») Szept 16, 2015 /
 
Túltárgyaltuk !
(#) vyky hozzászólása Szept 16, 2015 /
 
Köszönöm fiúk.Sokat segítettetek
Hálám kerget titeket
Szólok majd mire jutottam.
(#) vyky válasza vyky hozzászólására (») Szept 16, 2015 /
 
Ezzel a kapcsolással. sajna nem működik mit rontottam el?
Természetesen átírtam a kapcsoló pineket.
Egy led sem kapcsol fel.
(#) Sick-Bastard válasza vyky hozzászólására (») Szept 16, 2015 /
 
A kapcsolason a PD4 egy PD5 a levegoben log, a logikai 0 es logikai 1 kozott ingadozik.
R1 egy R10 ne a foldre legyen kotve hanem a tapra (3,3V 5V amit epp hasznalsz).

Keszitettem egy gyors kapcsolasi rajzot.
R1-R2 a lehuzo ellenallasok.
R3 szerepe csupan amper limitalas, ha jol tudom ez itt elhagyhato (javitast kerek ha tevedek).

switch.jpg
    
(#) zsozsoX válasza Droot hozzászólására (») Szept 16, 2015 /
 
Két avr között lenne az rs485, az egyik már müködik 5v-ról egy sn75176 ic-vel megy az rs485. A másik ami most készül az menne 3,3v-ról. A mellékelt képen egy fetes szint illesztő csak az nem tudom, hogy ez melyik szintről melyik szintre illeszt?
(#) Gj hozzászólása Szept 16, 2015 /
 
Üdv!

Van két I2C eszközöm, slave-ek, a címük ugyan az és NEM lehet változtatni. ATMega8A MCU-val használnám őket, de azon csak egy db TWI port port van, és ugye kettő kéne a két eszközhöz, mivel ugyan az a címük.
Próbáltam, hogy az 5V-os tápfeszüket rákötöm az AVR két különböző lábára és mindig csak az egyiknek adok áramot, de amikor nem kapott áramot az egyik és rajt "lógott" a TWI buszon a másik áramot kapó mellett, akkor nem működött a busz. Ha kihúztam az áramot nem kapó példány SCL és SDA vezetékeit, akkor működött a busz a másik, áramot kapó darabbal.
Tehát valahogy gondolom le kéne választani az I2C buszról a használni nem kívánt példány SDA és SCL lábait. Hogyan lehetne ezt megtenni? Optocsatolóval esetleg? Milyennel?
(Egyébként két NXT Ultrahang szenzorról van szó.)

Előre is köszönöm a válaszokat!
A hozzászólás módosítva: Szept 16, 2015
(#) Droot válasza zsozsoX hozzászólására (») Szept 16, 2015 /
 
Az IC adatlapjában kell megkeresni azt amit csatoltam neked. A D, DE, RE lábon 2V-tól H szintet érzékel. Az ICt nem ismerem de első ránézésre a D lábon küldesz neki adatot a mikrokontrollerből. Tehát nem kell szintillesztés csak arra a lábra ahol az IC küld a mikrokontrollernek adatot. Oda jó egy feszosztó. Viszont ne 3,3Vra osszon le, hanem 3,1 max 3,2Vra mert az AVR-ek sem/nem szeretik ha bármelyik lábukra a tápfesznél nagyobb feszültség kerül.

image.png
    
(#) attika hozzászólása Szept 16, 2015 /
 
Üdv.
Kérdésem a következő lenne felétek van egy atmega32l8au ez helyettesíthető atmega32 16au-val?
Illetve ezek közül melyiket rakhatnám be helyette?
(#) wbt válasza Gj hozzászólására (») Szept 16, 2015 /
 
Szia! Talán jó megoldás lehet a demultiplexer. Van digit meg analóg is, árban / tokban CD4016/66 (ha van 2db engedélyező lábad), ha nincs, csak 1db, akkor Cd4051-52-53 valamelyike. persze a "lekapcsolt"busz-t húzd fel külön-külön. Másik, olcsóbb megoldás, hogy csak az SCL-t kapcsolod át (SDA nem számít, max sok-sok Start/stop-ot érzékel a cucc).
Hirtelen ez jött be, biztos van szebb megoldás.
Talán 2db FET-el is megoldható a leválasztás.
Ha már próbáltad a tápelvételt, lehet, működne, de nem a (+) táp elvételével, hanem a GND megszakításával. (ismerni kellene a parazita diódák hatását).
Vagy a legegyszerűbb, megírod SW-ből a kezelést két külön portbitre...azért az I2C alap nem egy nagy dolog (gondolom nincs ütközéses multi-master vacakolás)
(#) Sick-Bastard válasza Gj hozzászólására (») Szept 16, 2015 / 1
 
Voltage level shifter

A kep amit mellekeltem az egy gyors gondolat eredmenye.
Eleg ha csak az SCL-t osztod el 2 fele, es a FET gate-et meg kulon vezerled. Ekkor vagy az egyik fog uzemelni vagy a masik.
Eleg lehet 1-1 FET is csak akkor az S-D iranyra figyelni kell.
(#) tursaba válasza zsozsoX hozzászólására (») Szept 17, 2015 /
 
Rá van írva, hogy LV és HV.
(#) vyky hozzászólása Szept 17, 2015 /
 
Valamit nagyon elronthatok
Elkezdtem az alapoktól,az avr-t.
Led villogtatás.
Na már ez sem meg felíródik a program ami hiba nélkül lefordul.
De reakció nincs a HW-n .
Ezt építettem meg csak 2313-ra.
(#) Sick-Bastard válasza vyky hozzászólására (») Szept 17, 2015 / 1
 
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. int main(void)
  5. {
  6.         DDRB = 0xFF;
  7.         DDRD = 0;
  8.        
  9.         while(1)
  10.         {
  11.                 if(PORTD & (1<<PIND6)) // ha a PIND6-on levo gombot lenyomod akkor
  12.                 {
  13.                         PORTB |= 0xFF;          // osszes led vilagit
  14.                 }
  15.                 if(PORTD & (1<<PIND5)) // ha a PIND5-on levo gombot lenyomod akkor
  16.                 {
  17.                         PORTB &= ~0xFF;         // osszes led lekapcsol
  18.                 }
  19.                 if(PORTD & (1<<PIND4)) // ha a PIND4-en levo gombot lenyomod akkor
  20.                 {
  21.                         PORTB ^= 0xFF;          // ki/bekapcsol PORTB allapotatol fuggoen
  22.                 }
  23.                
  24.                 _delay_ms(100);         // a PIND4-es gombhoz tartozo XOR (exclusive or) muveletkez mar kell
  25.         }
  26. }

on_off.jpg
    
(#) vyky válasza Sick-Bastard hozzászólására (») Szept 17, 2015 /
 
Huhh. Egy kis időt kérnék hogy megépíthessem,mert közben a marógépemen cseréltem főorsót.
Amúgy köszönöm szépen
Lefordítottam ez a hiba:c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:85:3: warning: #warning "F_CPU not defined for <util/delay.h>"
A hozzászólás módosítva: Szept 17, 2015
(#) vyky válasza vyky hozzászólására (») Szept 17, 2015 /
 
Na ez a hiba javítva Most jöhet a forrasztás
(#) Sick-Bastard válasza vyky hozzászólására (») Szept 17, 2015 /
 
Ha csak most ismerkedsz, az AVR-ekkel, akkor inkabb egy probapanelen gyakorolj.
Sokkal egyszerubb lesz a hibakat kijavitani vagy ha kell akkor modositani a kapcsolason.
(#) vyky válasza Sick-Bastard hozzászólására (») Szept 17, 2015 /
 
Igen most ismerkedek,és igen tervben van a próbapanel vétele is.
Csak az idő és a pénz
(#) zsozsoX válasza tursaba hozzászólására (») Szept 18, 2015 /
 
Nem az LV HV a baj. Hanem honnan hova 3,3 v -> 5v vagy 5v ->3,3v vagy 3,3v <-> 5v ?
(#) Sick-Bastard válasza zsozsoX hozzászólására (») Szept 18, 2015 /
 
3,3V <-> 5V mivel ezt I2C-nel is hasznaljak, oda pedig kell a ket iranyu kommunikacio.
(#) Sick-Bastard hozzászólása Szept 18, 2015 /
 
Udv!

attika-nak van egy akku tolotje, amit egy AVR vezerel. Kapcsolassal nem szolgalhatok.
A tipusa atmega32L-8AU, ez van benne gyarilag.
Ami szamomra zavart okkoz, hogy a panelen egy 16MHz-es kristaly van, de az adott AVR hivataolsan csak 8Mhz-ig van hitelesitve.
Kepes ez 16Mhzen menni, ha 5Von van megtaplalva? BOD 4Vra van bekapcsolva.
Ami meg felmerult bennem, hogy az is lehetseges-e, hogy a program atirja az orajel osztasat DIV2-re, kettovel elosztja, es ezert csak 8MHzen megy?

Ami meg fontos info, hogy a kerdeses AVR joparszor ki/be lett forrasztva, ezert egy egyszeru led villagtatos programmal leteszteltuk a kimeneteket, amik megfeleloen villogtak. Ez a teszt eleg-e ahhoz, hogy eletkepesnek minositsuk az AVRt?

Es meg egy kerdes, amit attika is feltett, csak nem vagyok100%-igbiztos a valaszban:
Az atmega32L lecserelheto e egy sima amtega32-re, vagy egy masik AVR-re, ha igen melyikre?
Csak hex file van hozza, a kodot nem lehet ujrairni.
(#) kapu48 válasza Sick-Bastard hozzászólására (») Szept 18, 2015 1 /
 
Az ’L’ jelzéssel ellátott működik Alacsony feszültségen is (3.3V, Max 8MHz), vagy (5V, Max 16MHz)
Míg a sima változat csak (5V, Max 16MHz)

Ha csak Hex kódotok van nem érdemes AVR típust cserélni!

A forrasztgatott AVRt tartsátok meg játszani a gyereknek!
A hozzászólás módosítva: Szept 18, 2015
Következő: »»   692 / 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