Sari la conținut
ELFORUM - Forumul electronistilor

Programarea uC-urilor Atmel


ole

Postări Recomandate

Vizitator poke_veve

 

Aici este un filmulet cu problema in discutie, cu mentiunea ca dupa ce il alimentez din nou, isi revine daca il programez din nou. Asa face orice cod as pune pe el, de aceea nu mi se pare relevant codul, oricum il pun si pe acesta aici:

 

#include

#include

#include

#include

#include

 

volatile static uint8_t nr_pol, speed=5, sdc=5, speed_temp, cal, dir, max_dr, max_st, time, u;

volatile static uint8_t mov[6];

volatile static uint16_t t=0, cursa, nr_pasi=0;

uint16_t EEMEM nvcursa=3, nvnr_pasi=0;

uint8_t EEMEM nvmov[6]={0, 1, 0, 0, 0, 0};

 

 

void afis(int);

void afis_1dig(uint8_t);

void dig_select(uint8_t);

 

ISR(TIMER0_OVF_vect)

{

if(dir==1)

{

if(max_dr==0)

{

if(nr_pasi

{

nr_pasi++;

nr_pol++;

if(nr_pol==5)nr_pol=1;

switch(nr_pol)

{

case 1 : PORTB=/*(1<

break;

case 2 : PORTB=/*(1<

break;

case 3 : PORTB=/*(1<

break;

case 4 : PORTB=/*(1<

break;

}//end switch

if(nr_pasi==cursa){max_dr=1;}

}//end if(nr_pasi

}//end if(max_dr==0)

else

{

if(nr_pasi>0)

{

nr_pasi--;

nr_pol--;

if(nr_pol==0)nr_pol=4;

switch(nr_pol)

{

case 1 : PORTB=/*(1<

break;

case 2 : PORTB=/*(1<

break;

case 3 : PORTB=/*(1<

break;

case 4 : PORTB=/*(1<

break;

}//end switch

if(nr_pasi==0){max_dr=0; dir=0;}

}//end if(nr_pasi>0)

}//end else

}//end if(dir==1)

else

{

if(max_st==0)

{

if(nr_pasi

{

nr_pasi++;

nr_pol--;

if(nr_pol==0)nr_pol=4;

switch(nr_pol)

{

case 1 : PORTB=/*(1<

break;

case 2 : PORTB=/*(1<

break;

case 3 : PORTB=/*(1<

break;

case 4 : PORTB=/*(1<

break;

}//end switch

if(nr_pasi==cursa){max_st=1;}

}//end if(nr_pasi

}//end if(max_st==0)

else

{

if(nr_pasi>0)

{

nr_pasi--;

nr_pol++;

if(nr_pol==5)nr_pol=1;

switch(nr_pol)

{

case 1 : PORTB=/*(1<

break;

case 2 : PORTB=/*(1<

break;

case 3 : PORTB=/*(1<

break;

case 4 : PORTB=/*(1<

break;

}//end switch

if(nr_pasi==0){max_st=0; dir=1;}

}//end if(nr_pasi>0)

}//end else

}//end else

}

 

ISR(TIMER2_OVF_vect)

{

if(++t==3905)

{

t=0;

if(++u==58){u=0; time++;}

}

}

 

ISR(INT0_vect)//iesire calibrare

{

if(bit_is_clear(PIND, 2))

{

TCCR1B|=(1<

}

else

{

TCCR1B&=~(1<

if(TCNT1>600)//apasare lunga

{

cal=0;

speed=speed_temp;

}//end if(TCNT1>600)

else//apasare scurta

{

if(cal==0){if(speed<5){speed++;}}

else{cursa--; eeprom_write_word(&nvcursa, cursa);}

TCCR2|=(1<

}

TCNT1=0;

}

}

 

ISR(INT1_vect)//intrare calibrare

{

if(bit_is_clear(PIND, 3))

{

TCCR1B|=(1<

}

else

{

TCCR1B&=~(1<

if(TCNT1>600)//apasare lunga

{

cal=1;

speed_temp=speed;

speed=sdc;

}//end if(TCNT1>600)

else//apasare scurta

{

if(cal==0){if(speed>0){speed--;}}

else{cursa++; eeprom_write_word(&nvcursa, cursa);}

}

TCNT1=0;

}

}

 

 

void main()

{

DDRB=255;

DDRC=255;

DDRD|=(1<

 

TIMSK|=(1<

TCCR2|=(1<

 

GICR|=(1<

MCUCR|=(1<

 

mov[0]=nr_pol;

mov[1]=dir;

mov[2]=max_dr;

mov[3]=max_st;

mov[4]=time;

mov[5]=u;

eeprom_read_block((void*)&mov, (const void*)&nvmov, 6);

nr_pasi=eeprom_read_word(&nvnr_pasi);

cursa=eeprom_read_word(&nvcursa);

 

sei();

 

while(1)

{

TCCR0=speed;

if(speed==0)

{

eeprom_write_word(&nvnr_pasi, nr_pasi);

eeprom_write_block((const void*)&mov, (void*)&nvmov, 6);

}

if(cal==0){afis(cursa);}

else{afis(1000);}

}

}

 

void afis_1dig(uint8_t j)

{

switch(j)

{

case 0:

PORTC|=(1<

break;

case 1:

PORTC|=(1<

break;

case 2:

PORTC|=(1<

PORTD|=(1<

break;

case 3:

PORTC|=(1<

PORTD|=(1<

break;

case 4:

PORTC|=(1<

PORTD|=(1<

break;

case 5:

PORTC|=(1<

PORTD|=(1<

break;

case 6:

PORTC|=(1<

PORTD|=(1<

break;

case 7:

PORTC|=(1<

break;

case 8:

PORTC|=(1<

PORTD|=(1<

break;

case 9:

PORTC|=(1<

PORTD|=(1<

break;

default:

PORTC=0;

PORTC|=(1<

PORTD|=(1<

break;

}

}

 

void dig_select(uint8_t k)

{

switch(k)

{

case 1:

PORTD|=(1<

break;

case 2:

PORTD|=(1<

break;

}

}

 

void afis(int m)

{

if(m!=1000)

{

uint8_t j,k;

j=m/10;

k=m%10;

 

PORTD=0;

PORTC=0;

dig_select(1);

afis_1dig(j);

_delay_us(3000);

 

PORTD=0;

PORTC=0;

dig_select(2);

afis_1dig(k);

_delay_us(3000);

}

else

{

 

PORTD=0;

PORTC=0;

dig_select(1);

PORTC|=(1<

_delay_us(3000);

 

PORTD=0;

PORTC=0;

dig_select(2);

PORTC|=(1<

PORTD|=(1<

_delay_us(3000);

 

}//end if(m==1000)

}

 

Schema inca nu o am desenata, revin si cu aceasta cat de repede posibil. In principiu, repet, este schema a doua din tutorialul lui Ole dar la care am adaugat un afisaj pe leduri cu 3 digiti (catod comun), polarizat folosind rezistente SMD de 151 de ohmi puse in serie cu fiecare anod.

Link spre comentariu
  • 2 luni mai târziu...

Intampin si eu o problema legata de programarea Atmel...Folosesc Windows 7 x64 si as vrea sa stiu ce program sa folosesc pentru a programa Atmel cu un programator pe serial (de preferat) sau pe LPT.Am incercat Pony prog impreuna cu un programator pe serial ,cu care am si avut succes dar numai in XP pe un alt calculator. In Windows 7 am incercat si cu masini virtuale dar se pare ca nu se poate folosi portul serial in acest scop.Multumesc!

Link spre comentariu

Din pacate nu functioneaza cum trebuie cu programatorul serial, dupa ce il programez ori nu functioneaza cum trebuie ori arata numai patratele . Urmeaza sa il incerc cu cel de paralel, Sper sa am noroc. Scuze pentru dublul post.

Link spre comentariu
  • 1 lună mai târziu...

Salut la toti, am si eu o intrebare de novice, mi-am facut un usbasp, l-am instalat, mi l-a recunoscut pc-ul insa nu reusesc sa gasesc un program cu care sa bag programul in atmega. Am descarcat PonyProg dar nu imi vede usbasp-ul .. :jytuiyu ce program sa folosesc ? Multumesc

Link spre comentariu

eu folosesc si recomand programul avrdudeel in sine este un program ce se foloseste din linia de comanda fiind de datoria ta sa-i dai argumentele necesare. totusi exista un ajutor in sensul ca exista un alt program numit avrdude-gui care iti afiseaza o fereastra de dialog din care alegi parametrii si avrdude-gui va da argumentele necesare lui avrdude cand executi. incearca-l ca e usor de folosit.

Link spre comentariu

Salut la toti, am si eu o intrebare de novice, mi-am facut un usbasp, l-am instalat, mi l-a recunoscut pc-ul insa nu reusesc sa gasesc un program cu care sa bag programul in atmega. Am descarcat PonyProg dar nu imi vede usbasp-ul .. :jytuiyu ce program sa folosesc ? Multumesc

Incearca si SinaProg.Eu il folosesc impreuna cu un USBasp cumparat de la @oleSi este destul de "prietenos".
Link spre comentariu
  • 2 luni mai târziu...

Ca incepator intr-ale microcontrollerelor(pe care totusi le folosesc de câţiva ani) schema aceea imi pare prea complicată :rade: ...eu avand la dispozitie PC ce poseda si port serial si paralel, folosesc urmatorul programator(rog nu râdeţi de marea scula de programator, dar pt. incepatori eu zic ca e perfect, cu ATmega8 + Khazama merge absolut perfect, fara sa dea nici cea mai mica eroare):

Posted Image

Posted Image

Link spre comentariu

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
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări