Sari la conținut
ELFORUM - Forumul electronistilor

Programarea uC-urilor Atmel


Postări Recomandate

Pai nu ii dai "make all" (ca asta inseamna ca vrei sa compilezi si are nevoie de surse), ci ii dai "make program".

Daca makefile e bine scris (controllerul care trebuie, programatorul care trebuie...), comanda asta "arde" hexul in controller.

Citeste comentariile din makefile, ajuta. Uite ce scrie despre programare:

 

# make program = Download the hex file to the device, using avrdude.#   Please customize the avrdude settings below first! 

Link spre comentariu

Am incercat doar cu "program" si tot nu merge din prima ,imi mai cere "main.eep" este un cod de genu ":00000001FF" ,l-am copiat si pe asta si dupa a mers ,am vazut ca acest fisier este la fel ,indiferent de proiect tot ":00000001FF" .

E normal sa-mi ceara si acest fisier?

Link spre comentariu

Din cate zice gogu, .eep e "hex-ul" pentru eeprom.

Asa ca depinde de proiect. Daca ai si fisier .eep (pentru eeprom) il treci in makefile, daca nu, nu.

# Program the device - cu eeprom (.eep)program: $(TARGET).hex $(TARGET).eep	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)# Program the device - fara eepromprogram: $(TARGET).hex 	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) 
Link spre comentariu
  • 1 lună mai târziu...

Salutare!

Vreau sa fac un program care sa contina un led si doua butoane.Led-ul clipeste la un interval de timp t,iar atunci cand apas un buton vreau ca t sa creasca cu 10 adica t+=10;  ,iar cand apas al doilea buton t-=10;

Asta este codul:

#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>int t=50;ISR(INT0_vect){t+=10;}ISR(INT1_vect){t-=10;}int main(void){ DDRB=0xFF; 					//PortB ca iesire  MCUCR|=(1<<ISC01)|(1<<ISC11); 	//declanseaza INT0 si INT1 pe tranzitie H-L  GIMSK|=(1<<INT0)|(1<<INT1); 	//activeaza intreruperile pe INT0 si INT1  sei(); while(1) {   PORTB=0b00000001;   _delay_ms(t);   PORTB=0;   _delay_ms(t); } }

Problema este ca atunci cand apas orice buton nu se intampla nimic ,led-ul continua sa licare normal.

Ce problema are?

Multumesc!

Link spre comentariu

Declarati variabila t ca volatile. Este mai sigur asa, pentru ca variabila t este actualizata din rutinele de intreruperi.

Declarati variabila t ca unsigned. Sau introduceti o protectie cat sa nu scada sub 0. Nu stiu acum daca functia _delay_ms protesteaza la valori negative dar un delay cu valoare negativa nu are nici-un sens, nu?

Asigurati-va ca faceti debounce pentru switch-uri. Daca le-ati conectat pur si simplu pe pinii de intreruperi externe atunci vor fi probleme. Eu as fi folosit pini normali pentru switch-uri si un timer cu o intrerupere setata pe la 1ms unde sa faceti debouncing-ul pentru ambii pini setati ca intrari digitale.

 

Daca totusi doriti sa folositi intreruperile externe atunci puneti cel putin un filtru pe fiecare pin cu switch, format dintr-un condensator de cca 10nF catre GND si un rezistor de cca 22K ... 47K catre VCC. Pinii cu intreruperi ar trebui sa aiba triggere schmidt pe intrari si impreuna s-ar putea sa creeze functionalitatea dorita.

 

Verificati prin registri daca ati efectuat corect setarile.

 

LE: O crestere/scadere de 10ms nu o sa o sesizati cu ochiul liber. De fapt doar un debounce dureaza cam 10ms.

Modificati la 100 sau 250ms si apoi veti vedea daca sunt probleme de debounce, data de o functionare relativ arbitrara (debounce-ul este destul de random). Dupa ce vedeti ca totul este OK atunci scadeti la rezolutia la 10ms, daca aceasta este necesara in aplicatia dvs.

Editat de mars01
Link spre comentariu
  • 1 lună mai târziu...
Salutare,sper ca postez unde trebuie.Am o oarecare problema cu programarea unui atmega8 ,am schema,procesorul si softul care este cu terminatia BIN.E prima oara cand vreau sa programez un atmel,am un programator usbasp ,ca si softuri Bascom si atmel studio,acestea nu accepta extensia BIN. Ma poate indruma cineva ,eventual daca trebuiesc setati fusebiti
Editat de cipry
Link spre comentariu
  • 2 luni mai târziu...

Salut!

Am o intrebare.De exemplu declar o variabila

unsigned int a;

a  poate sa ia valori de la 0 - 65535,adica 16 biti maxim. Initial a=0b1000000000000001; un numar pe 16biti  in zecimal este 32769.Daca fac aceasta operatie a=a<<1; a o sa fie egal cu a=0b0000000000000010;  sau a=0;?

Multumesc!

Link spre comentariu

Acesta este asa zisul fenomen de "roll over".

Corect este prima varianta: 

a=0b0000000000000010;

Shiftarea la stanga o pozitie este echivalent cu multiplicarea cu 2 a valorii intiale.

Dar cum se trece peste valoarea maxima care poate fi stocata in acel tip de variabila (unsigned int), ramane doar rezultatul ce trece peste valoarea maxima 65535. 

32769 * 2 = 65538.

65538 - 65536 = 2 adica scris in binar pe 16biti:

0b0000000000000010

 

Am scazut 65536 pentru ca sunt 65536 valori stocate pe 16biti (de la 0 la 65535).

Editat de mars01
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