Sari la conținut
ELFORUM - Forumul electronistilor

Comanda ascensor (ATMega16)


Vizitator srg2590

Postări Recomandate

Vizitator srg2590

Am de implementat urmatoare tema : Bloc comanda ascensor, cu comanda unui motor care sa urce/coboare o greutate. Mentionez ca am deja o parte din proiect realizata si anume o placuta cu microprocesorul si o sursa de tensiune de 5V. Microcontrollerul folosit este Atmel ATMega16.Am la dispozitie o punte H L293D, senzori Hall, un motoras si 3 butoane. Cerinta ar fi ca in urma apasarii unui buton, liftul sa urce sau sa coboare la unul din cele 3 niveluri.Am studiat datasheeturile de la punte si senzori, insa fiind la prima experienta de acest gen, inca nu imi este foarte clar ce legaturi trebuie sa fac intre toate aceste componente. Mai imi trebuie si alte piese pe langa acestea ? O alta problema ar fi si implementarea software, pentru care nu prea am idei. Orice fel de ajutor e bine venit. Va multumesc

Link spre comentariu
  • Răspunsuri 10
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    3

  • mitescu

    1

  • edy_wheazel

    1

Io as face in felu' urmator: - legi un magnet pe lift si senzori Hall pe fiecare etaj, senzori conectati la PB0, PB1 si PB2.- legi cele 3 butoane pe un alt port, sa zicem PC0, PC1 si PC2.- motorul il legi pe portul D, adica PD0 - IN1, PD1 - IN2 si PD3 - En. In primu' rand eu as face motorul sa meaga, adica il legi cum am scris mai sus si il alimentezi corespunzator dupa faci care urmatoarele: - setezi portD ca iesire. - PD3-u' il scrii cu 1 logic, Enable trebuie sa aiba 1 logic pentru a functiona. - pentru ca motorul sa se roteasca intr-un sens scoti pe PD0 si PD1 0 si 1, cu aceasta combinatie se roteste in sens invers acelor de ceasornic. Daca scoti 1 si 0 se invarte in sensu' acelor de ceasornic, pentru 00 si 11 motorul este oprit. Daca functioneaza treci la pasu' urmator: - setezi portC ca intrare (ai legate butoanele pe el). - setezi portB ca intrare (senzorii Hall). - pentru starea celor 3 butoane alegi 3 registrii pe care-i denumesti sugestiv (but1, but2, but3). - pentru etaje alegi alti registrii: et1, et2 si et3. - pentru comanda "sus" setezi combinatia 01 si pentru "jos" 10. - daca apesi pe unul dintre butoane foloseti un algoritm simplu: intai vezi daca etajul este mai sus sau mai jos in functie de registrii, pui En pe 1 si dai comanda corespunzatoare (sus sau jos). In momentu' in care ajungi la etajul dorit aduci En pe 0 pentru a opri motorul. In mare cam asta ar fi treaba, sper ca ai inteles sau ca nu am omis ceva.

Link spre comentariu
  • 2 săptămâni mai târziu...
Vizitator srg2590

Io as face in felu' urmator: - legi un magnet pe lift si senzori Hall pe fiecare etaj, senzori conectati la PB0, PB1 si PB2.- legi cele 3 butoane pe un alt port, sa zicem PC0, PC1 si PC2.- motorul il legi pe portul D, adica PD0 - IN1, PD1 - IN2 si PD3 - En. In primu' rand eu as face motorul sa meaga, adica il legi cum am scris mai sus si il alimentezi corespunzator dupa faci care urmatoarele: - setezi portD ca iesire. - PD3-u' il scrii cu 1 logic, Enable trebuie sa aiba 1 logic pentru a functiona. - pentru ca motorul sa se roteasca intr-un sens scoti pe PD0 si PD1 0 si 1, cu aceasta combinatie se roteste in sens invers acelor de ceasornic. Daca scoti 1 si 0 se invarte in sensu' acelor de ceasornic, pentru 00 si 11 motorul este oprit. Daca functioneaza treci la pasu' urmator: - setezi portC ca intrare (ai legate butoanele pe el). - setezi portB ca intrare (senzorii Hall). - pentru starea celor 3 butoane alegi 3 registrii pe care-i denumesti sugestiv (but1, but2, but3). - pentru etaje alegi alti registrii: et1, et2 si et3. - pentru comanda "sus" setezi combinatia 01 si pentru "jos" 10. - daca apesi pe unul dintre butoane foloseti un algoritm simplu: intai vezi daca etajul este mai sus sau mai jos in functie de registrii, pui En pe 1 si dai comanda corespunzatoare (sus sau jos). In momentu' in care ajungi la etajul dorit aduci En pe 0 pentru a opri motorul. In mare cam asta ar fi treaba, sper ca ai inteles sau ca nu am omis ceva.

Salut. In mare am facut aproape cum mi-ai explicat tu. Acum insa am o problema in a scrie codul. Trebuie sa folosesc codevisionavr. Am instalat programul si am observat ca are un wizard. Am urmarit pasii de acolo si am incercat sa scriu un mini program, dar nu functioneaza cand il pun pe placuta. Vreau sa iti multumesc ca mi-ai raspuns si as vrea sa te rog daca te pricepi sa imi lasi un numar de telefon sa ma indrumi cu scrierea codului. Cred ca gresesc ceva elementar si nu imi dau seama. O zi frumoasa
Link spre comentariu

De obicei, ca sa poti fi ajutat cu un cod care nu merge, cel mai bine e sa atasezi si codul. Daca nu-l vede nimeni, cum te poate ajuta cineva? :nas:

Link spre comentariu
Vizitator srg2590

De obicei, ca sa poti fi ajutat cu un cod care nu merge, cel mai bine e sa atasezi si codul. Daca nu-l vede nimeni, cum te poate ajuta cineva? :nas:

Salut. Folosind wizardul codul in mare parte e generat automat, dupa setarea porturilor, a microprocesorului si a cuartului. Codul scris de mine are doar 2 linii in care voiam sa probez aprinderea unui led legat la pinul 6 al portului D, in urma apasarii unui buton conectat la pinul 0 al portului C./*****************************************************This program was produced by theCodeWizardAVR V2.05.7a EvaluationAutomatic Program Generator© Copyright 1998-2012 Pavel Haiduc, HP InfoTech s.r.l.http://www.hpinfotech.comProject : Version : Date : 5/12/2012Author : Freeware, for evaluation andnon-commercial use onlyCompany : Comments: Chip type : ATmega16Program type : ApplicationAVR Core Clock frequency: 7.372800 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*****************************************************/#include // Declare your global variables herevoid main(void){// Declare your local variables here// Input/Output Ports initialization// Port A initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00;DDRA=0x00;// Port B initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00;DDRB=0x00;// Port C initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=P PORTC=0x01;DDRC=0x00;// Port D initialization// Func7=In Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=0 State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00;DDRD=0x40;// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: Timer 0 Stopped// Mode: Normal top=0xFF// OC0 output: DisconnectedTCCR0=0x00;TCNT0=0x00;OCR0=0x00;// Timer/Counter 1 initialization// Clock source: System Clock// Clock value: Timer1 Stopped// Mode: Normal top=0xFFFF// OC1A output: Discon.// OC1B output: Discon.// Noise Canceler: Off// Input Capture on Falling Edge// Timer1 Overflow Interrupt: Off// Input Capture Interrupt: Off// Compare A Match Interrupt: Off// Compare B Match Interrupt: OffTCCR1A=0x00;TCCR1B=0x00;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;// Timer/Counter 2 initialization// Clock source: System Clock// Clock value: Timer2 Stopped// Mode: Normal top=0xFF// OC2 output: DisconnectedASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;// External Interrupt(s) initialization// INT0: Off// INT1: Off// INT2: OffMCUCR=0x00;MCUCSR=0x00;// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x00;// USART initialization// USART disabledUCSRB=0x00;// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: OffACSR=0x80;SFIOR=0x00;// ADC initialization// ADC disabledADCSRA=0x00;// SPI initialization// SPI disabledSPCR=0x00;// TWI initialization// TWI disabledTWCR=0x00;while (1) { // Place your code here if ( PORTC.0==1) PIND.6=1; }}http://matrix.elcom.pub.ro/~D33/ aici e siteul pe care am scris cateva lucruri despre proiect si contine si schemele care au fost realizate pana acum.
Link spre comentariu
Vizitator srg2590

Si ce te-ai astepta sa faca si nu face?

Doream sa se aprinda ledul conectat la pinul 6 al portului D, atunci cand tin apasat butonul conectat la pinul 0 al portului C, lucru care nu se intampla.
Link spre comentariu

Care din scheme e cea "de test"?

Daca e a doua, cea in protel/isis, cand apesi butonul conectezi pinul la masa (adica 0), in timp ce tu testezi daca ai 1

if ( PORTC.0==1)
Pe de alta parte, cum nu stiu cu ce se mananca atmelurile astea, nu stiu daca PORTC.0 are intern rezistente pull-up si nici daca sunt active. Cum tu n-ai montat extern nici una, nu stiu daca are cine "trage" PORTC.0 la 1.

 

Inainte de "citit" butoane eu as incerca sa leg un LED la un pin si sa-l aprind/sting cu o frecventa in jurul a 1Hz. Daca asta merge, stii sigur ca ai configurat controllerul bine (frecventa de lucru, sursa clock...) si poti incerca sa cresti complexitatea proiectului.

Link spre comentariu

Vezi ca ai incurcat borcanele. Citirea intrarii se face de la PIN , iar scrierea iesirii se face la PORT. In momentul in care vrei sa utilizezi o linia y de la portul x ca intrare faci registrul DDRx.y=0. Daca doresti ca sa aibe pull-up mai pui PORTx.y=1. Citirea o faci de la PINx.y. In cazul in care doresti sa o utilizezi in mod iesire faci DDRx.y=1 si scrierea o faci in PORTx.yIn concluzie in bucla while poti scrie: if(PINC.0==1) { PORTD.6=1;}Vezi ca asa cum ai scris codul , PORTD.6 o sa ramana in 1 logic dupa prima stare 1 a lui PINC.0, ptr ca nimeni nu il mai aduce in 0. Daca doresti ca PORTD.6 sa urmareasca starea lui PINC.0 , problema este mul mai simpla: PORTD.6=PINC.0;Succes!

Link spre comentariu
Vizitator srg2590

Vezi ca ai incurcat borcanele. Citirea intrarii se face de la PIN , iar scrierea iesirii se face la PORT. In momentul in care vrei sa utilizezi o linia y de la portul x ca intrare faci registrul DDRx.y=0. Daca doresti ca sa aibe pull-up mai pui PORTx.y=1. Citirea o faci de la PINx.y. In cazul in care doresti sa o utilizezi in mod iesire faci DDRx.y=1 si scrierea o faci in PORTx.yIn concluzie in bucla while poti scrie: if(PINC.0==1) { PORTD.6=1;}Vezi ca asa cum ai scris codul , PORTD.6 o sa ramana in 1 logic dupa prima stare 1 a lui PINC.0, ptr ca nimeni nu il mai aduce in 0. Daca doresti ca PORTD.6 sa urmareasca starea lui PINC.0 , problema este mul mai simpla: PORTD.6=PINC.0;Succes!

Multumesc pentru sfaturi! Am reusit sa termin partea fizica a proiectului si am scris un cod care merge pentru partea de urcare, doar ca atunci cand pun else la if-ul initial, proiectul nu mai functioneaza. O sa atasez codul poate isi da cineva seama ce se intampla, pentru ca nu reusesc sa inteleg. /*****************************************************This program was produced by theCodeWizardAVR V2.05.7a EvaluationAutomatic Program Generator© Copyright 1998-2012 Pavel Haiduc, HP InfoTech s.r.l.http://www.hpinfotech.comProject : Version : Date : 5/17/2012Author : Freeware, for evaluation andnon-commercial use onlyCompany : Comments: Chip type : ATmega16Program type : ApplicationAVR Core Clock frequency: 7.372800 MHzMemory model : SmallExternal RAM size : 0Data Stack size : 256*****************************************************/#include #include int buton=0, senzor=0, pozitie=1;void citirebuton(){ if(PINC.0==0) buton=1; else if(PINC.1==0) buton=2; else if(PINC.2==0) buton=3; }void citiresenzor(){ if(PINB.0==0) senzor=1; else if(PINB.1==0) senzor=2; else if(PINB.2==0) senzor=3;}void urcare() { PORTA.1=1; PORTA.2=0; PORTA.3=1; } void coborare() { PORTA.1=1; PORTA.2=1; PORTA.3=0; } void stop() { PORTA.1=0; } void main(void){// Declare your local variables here// Input/Output Ports initialization// Port A initialization// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=In // State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=T PORTA=0x00;DDRA=0x0E;// Port B initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=P State1=P State0=P PORTB=0x07;DDRB=0x00;// Port C initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=P State1=P State0=P PORTC=0x07;DDRC=0x00;// Port D initialization// Func7=In Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=0 State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00;DDRD=0x40;// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: Timer 0 Stopped// Mode: Normal top=0xFF// OC0 output: DisconnectedTCCR0=0x00;TCNT0=0x00;OCR0=0x00;// Timer/Counter 1 initialization// Clock source: System Clock// Clock value: Timer1 Stopped// Mode: Normal top=0xFFFF// OC1A output: Discon.// OC1B output: Discon.// Noise Canceler: Off// Input Capture on Falling Edge// Timer1 Overflow Interrupt: Off// Input Capture Interrupt: Off// Compare A Match Interrupt: Off// Compare B Match Interrupt: OffTCCR1A=0x00;TCCR1B=0x00;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;// Timer/Counter 2 initialization// Clock source: System Clock// Clock value: Timer2 Stopped// Mode: Normal top=0xFF// OC2 output: DisconnectedASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;// External Interrupt(s) initialization// INT0: Off// INT1: Off// INT2: OffMCUCR=0x00;MCUCSR=0x00;// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x00;// USART initialization// USART disabledUCSRB=0x00;// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: OffACSR=0x80;SFIOR=0x00;// ADC initialization// ADC disabledADCSRA=0x00;// SPI initialization// SPI disabledSPCR=0x00;// TWI initialization// TWI disabledTWCR=0x00;citiresenzor(); //citim pozitiaif(senzor!=1) //daca nu e la parter do { coborare(); //coboram si citim pozitia citiresenzor(); }while (senzor!=1); //pana ajunge la parterstop();pozitie=1; //memoram pozitia parterbuton=1; while (1) { citirebuton(); if(buton>pozitie) //daca butonul apasat e mai mare ca pozitia {PORTD.6=1; //aprinde ledul de pe placuta urcare(); //urca motorul PORTD.6=0; //stinge led pozitie=buton; //memoram pozitia noua citiresenzor(); //citim senzorii sa vedem care e activ while (senzor!=buton) //atata timp cat senzorul activ difera de buton {citiresenzor(); //recitim senzorii pana senzorul activ va fi egal cu butonul apasat }; stop(); //opreste motor } else if(buton
Link spre comentariu
  • 3 săptămâni mai târziu...
Vizitator srg2590

Am reusit sa termin proiectul. Multumesc pentru sfaturi si celor de pe acest forum.

 

Pun aici un link catre site-ul unde este prezentat proiectul pentru cei care o sa aiba nevoie. Contine scheme si poze cu placuta, dar si un filmulet cu forma finala a proiectului.

 

http://matrix.elcom.pub.ro/~D33/

 

Pentru a downloada codul scrieti : http://matrix.elcom.pub.ro/~D33/soft/asd123.zip

 

Inca o data va multumesc si va doresc spor in toate !

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