Sari la conținut

Despre programarea microcontrolere Atmel AVR - intrebari si raspunsuri


Postări Recomandate

O dam in obraznicii si e nasol ,decat sa ne dam destepti mai bine tacem . Am mai spus asta ,am programator direct pe placa ,am si cablu de programare(venise cineva cu ideea asta) .Trebuie sa ai bani sa vizitezi Germania ? a fost un proiect european la care am participat ,a fost bazat pe studii si a fost finantat de catre UE,da nu asta e important . In fine ,observ ca nu gasesc intelegere si ma retrag . Multumesc oricum pentru ajutor si imi cer scuze tuturor celor pe care i-am deranjat .

 

RR - tu cand corectezi ti se pare a fi in gluma ,altu cand te corecteaza ti se pare ca e rautacios .

- de la o cratima ai ajuns sa imi faci teoria chibritului folosind coduri de programare si gramatica limbii romane ,de aici reiese ca esti tare destept ,a vazut forumul stai linistit . :sign_offtopic:

Editat de xDanuts
  • Răspunsuri 163
  • Created
  • Ultimul Răspuns

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Am mai spus asta ,am programator direct pe placa ,am si cablu de programare(venise cineva cu ideea asta) .Trebuie sa ai bani sa vizitezi Germania ? a fost un proiect european la care am participat ,a fost bazat pe studii si a fost finantat de catre UE,da nu asta e important . In fine ,observ ca nu gasesc intelegere si ma retrag . Multumesc oricum pentru ajutor si imi cer scuze tuturor celor pe care i-am deranjat .

Ma scuzi, dar am citit topicul asta de cand ai intervenit tu de vreo trei ori pana acum dar de abia acum mentionezi ca ai programator direct pe placa. Eu cred ca in toata discutia asta ai si tu partea ta de vina. Asa ca te superi degeaba. Pai ce placa de programare ai? Sunt o gramada de detalii care trebuiau prezentate de la bun inceput. Ca ai trecut voit peste detalii, e treaba ta, dar nu sunt devina utilizatori forumului de incapacitatea ta de ati prezenta problema cu toate detalii aferente.

 

stima

dan

Editat de dan_e

xDanuts,

am vazut ca nici pe elforum n-ai avut succes prea mare,..

ai incercat sa pornesti AVR studio si sa-i dai sa se conecteze cu placa, avr-studio e suficient de destept sa detecteze automat tipul de programator integrat pe placa si protocolul. fa o incercare nu te costa nimic

RR

  • 1 year later...

stimati useri, de vreo cateva luni am inceput sa bibilesc AVR Studio 6 cu C++ si astazi, avand in vizita un fost coleg de scoala, am vrut sa ma laud ca intre prieteni ca pot sa fac si eu ceva in AVR Studio. Toate bune si frumoase pana am ajuns sa fac un program cu Atmega32 unde ledurile de la portul C sa se aprinda pe rand atunci cand apas un buton conectat la INT0 portul D. Deci, initial toate ledurile de la portul C sunt stinse iar cand se apasa o data butonul de la PD2 se aprinde primul led, dupa ce se apasa a doua oara acelasi buton se aprinde al doilea led si tot asa. Dar nu imi iese deloc, ma ajuta cineva, please!

 

Am pus pariu pe o bere ca reusesc sa fac programul asta si chiar daca pierd berea macar sa invat. :drink_pepsi:

 

uitati cum am inceput eu:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
uint8_t i;

ISR(INT0_vect)
{
for (i=0;i<8;i++)
{
PORTC=0xFF & (1<<i);	
_delay_ms(1000);
}
}

int main(void)
{
DDRC=0xFF; //PortC ca iesire Atmega32

{
if (MCUCR|=(1<<ISC01)) // daca se apasa butonul conectat la portul PD2 se actioneaza INT0 pe tranzitia H-L
{
PORTC=0xFF & (1<<i);	
GIMSK|=(1<<INT0);
}

 sei();

}
while(1);
}

Ma ajuta cineva ca sa nu pierd pariu?! :down:

 

cu stima

dan

Editat de dan_e

O prima greseala in codul prezentat mai sus este utilizarea instructiuni for in codul vectorului de intrerupere ISR(INT0_vect). Asa cum ai scris codul acesta va aprinde consecutiv ledurile portului C la apasarea butonului de la pinul PD2 al Atmega32. Deci, nu e bine.

 

Acum e destul tarziu si pariul cred ca l-ai pierdut (si nici nu prea am chef la ora asta sa scriu coduri in C++) dar ca tema de casa, pentru maine sau poimaine - sau pana vine o alta solutie din partea altui utilizator - e sa incerci o secventa do while de genul:

............................... // header
int main(void)
{
................................
do
{
if(DataPort >= 0x80)
{ DataPort = 1;
	 GIMSK|=(1<<INT0); }
else
{ DataPort = DataPort << 1;
	 GIMSK|=(1<<INT0); }
}
while(1);
}

ISR(INT0_vect)

{

 

static unsigned char b=1;

 

cli; /*opresti intreruperile */

PORTB = b;

b = b << 1; /* muta un bit la stanga */

if (b==0) b=1; /* daca bitul a depasit pozitia MSB, il readuce pe pozita LSB */

_delay_ms(1000);

sei; /* dai drumul la intreruperi */

}

 

 

int main (void){

 

DDRB = 0xFF; /* iesiri pentru leduri */

PORTB = 0; /* stingi ledurile, daca dunt conectate la VCC ledurile atunci = 0xFF */

GIMSK=(1<<INT0); /* dai drumul la intreruperea INT0 */

sei; /* dai drumul la sistemul de intrruperi */

while(1);

}

 

 

 

 

Habar n-am daca e functional

RR

Editat de roadrunner

@roadrunner, ideea ta e buna dar are doua mici greseli. Le-am reparat si am configurat programul sa lucreze pe port C Atmega 32. Rezultatul e mai jos si este... functional:

#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 8000000UL // Atmega 32 la 8 MHZ (clock extern)
#include <util/delay.h>

ISR(INT0_vect)
{
static unsigned char b=1;

cli(); /*opresti intreruperile */
PORTC = b;
b = b << 1; /* muta un bit la stanga */
if (b==0) b=1; /* daca bitul a depasit pozitia MSB, il readuce pe pozita LSB */
_delay_ms(300);
sei(); /* dai drumul la intreruperi */
}


int main (void){

DDRC = 0xFF; /* iesiri pentru leduri */
PORTC = 0; /* stingi ledurile, daca dunt conectate la VCC ledurile atunci = 0xFF */
GIMSK=(1<<INT0); /* dai drumul la intreruperea INT0 */
sei(); /* dai drumul la sistemul de intrruperi */
while(1);
}

 

Numai bine

mersi, acu merge brici.

 

berea am pierdut-o asa ca.. sunteti prea departe ca sa va fac cinste cu o bere. Hm!

 

Nu am inteles diferenta dintre:

b = b << 1;

si

b= 1 << b;

 

Am vazut programe unde in loc de b se foloseste x sub forma:

PORTC=0xFF & (1<<i);

 

i fiind b sau x dar cand se foloseste:

(1<<i);

sau cum a facut roadrunner:

(i<<1);

 

?

As onora cinste dar credeti-ma nu am cum. Asa ca, va rog frumos, daca ma puteti lamuri si in chestiunea de mai sus, ar fi super.

Editat de dan_e

pai pune mana pe o carte de C dragule...

 

x << y face x shift left cu y pozitii.

 

in contextul programului tau b este initializat cu val 0x01, de fiecare data cand intra in rutina de intrerupere e shiftat left cu o pozitie. (practic bitul 1 de pe LSB se plimba catre stanga)

la prima trecere 0x01 << 1 = 0x02,

la a doua trecere 0x02 << 1 = 0x04

si tot asa ....

 

 

 

RR

Editat de roadrunner

trebuie sa mai schimbi si un if

if (b==0) b= 0x80; /* readuce bitul pe MSB */

 

 

da' nu ne-ai zis daca mergea inainte sa schimbi.

 

RR

Editat de roadrunner

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.

×
×
  • Creează nouă...

Informații Importante

Folosim cookie-uri și tehnologii asemănătoare pentru a-ți îmbunătăți experiența pe acest website, pentru a-ți oferi conținut și reclame personalizate și pentru a analiza traficul și audiența website-ului. Înainte de a continua navigarea pe www.tehnium-azi.ro te rugăm să fii de acord cu: Termeni de Utilizare.

ATENTIE !!! Functionarea Tehnium Azi depinde de afisarea de reclame.

Pentru a putea accesa in continuoare site-ul web www.tehnium-azi.ro, va rugam sa dezactivati extensia ad block din browser-ul web al vostru. Dupa ce ati dezactivat extensia ad block din browser dati clic pe butonul de mai jos.

Multumim.

Apasa acest buton dupa dezactivarea extensiei Adblock