Autor: tmf
Redakcja: Dondu
Wstęp do XMEGA: Spis treści
Pierwszy program na XMEGA
Jaki będzie nasz pierwszy program? Słusznie się domyślasz, nieśmiertelne miganie LEDem. W tym celu uruchamiamy nasze ulubione IDE (czyli Atmel Studio – przy okazji warto przejrzeć krótki kurs na jego temat AS) i tworzymy pierwszy projekt, wybierając jako MCU XMEGA256A3BU – tu ważne, abyś z różnych dostępnych MCU wybrał ten, który posiadasz, wbrew pozorom, ostatnie literki nazwy mają znaczenie.
Jak pamiętamy w AVR piny I/O moga być skonfigurowane jako wyjścia, lub jako wejścia. Nie inaczej jest w XMEGA. Pominiemy na razie całe zawiłości konfiguracji I/O i różne możliwości jakie XMEGA oferuje, póki co chcemy prostą konfigurację totem-pole. Jako, że jest ona domyślna jedyne co musimy zrobić to przestawić piny I/O na wyjście:
PORTC.DIR=255;
Po tej operacji PORTC będzie wyjściem, a stan pinów będziemy mogli sobie radośnie zmieniać, co niniejszym uczynimy:
while(1) { PORTC.OUT=0; _delay_ms(1000); PORTC.OUT=0xff; _delay_ms(1000); }
Jak widać naprzemiennie, co 1 sekundę zmieniamy stan wyjść PORTC z 1 na 0 i vice versa. Aby dać pewien przedsmak możliwościom o których wkrótce powiem, to samo możemy uzyskać pisząc po prostu:
while(1) { PORTC.OUTTGL=0xff; _delay_ms(1000); }
Jak się zapewne domyśliłeś, rejestr OUT to rejestr wyjściowy, a rejestr DIR to rejestr określający kierunek pinów. Czyli w starej ATMega byłyby to rejestry PORTC i DDRC. Nasz kompletny migacz wygląda tak:
#include <avr/io.h> #include <util/delay.h> int main(void) { PORTC.DIR=255; while(1) { PORTC.OUT=0; _delay_ms(1000); PORTC.OUT=0xff; _delay_ms(1000); } }
TU możesz ściągnąć kompletny przykład w Atmel Studio 6: LEDBLINK.ZIP
Mamy więc napisaną pierwszą aplikację na XMEGA, proste, prawda?
To jeszcze sprawdźmy czy działa, nasz FLIP jest w gotowości, klikamy więc na ikonkę Load HEX File (przypominającą strzałkę do otwartej książki) i wskazujemy plik wynikowy – znajduje się on w katalogu LEDBLINK/LEDBLINK/Debug/LEDBLINK.hex i klikamy znajdujący się po lewej stronie przycisk Run. I tyle, mikrokontroler jest zaprogramowany.
Tyle, że nic się nie dzieje. Dlaczego? Ano dlatego, że MCU ciągle jest w sekcji bootloadera oczekując na kolejne polecenia. Aby odpalić naszą pierwszą aplikację musimy nacisnąć przycisk Start Application.
Po tej operacji diody podłączone do PORTC będą sobie radośnie migać (o ile oczywiście proste urządzenia półprzewodnikowe mogą wyrażać emocje).
Jeżeli będziesz próbował wgrać kolejny program zostaniesz zaskoczony, ale o tym w następnej części.
Wstęp do XMEGA: Spis treści
Witam
OdpowiedzUsuńA działa "staromodne" definiowanie portów?
Czyli np:
DDRB |= (1<<PB0) //wyjscie
PORTB |= (1<<PB0)//pull-up do Vcc
Bo widzę że tutaj definiowanie wygląda jak klasy :)
To co pokazałem to dostęp do IO z wykorzystaniem predefiniowanych struktur, co ma pewną przewagę. Ale można też "staromodnie", czyli PORTC_DIR, PORTC_OUT, PORTC_IN itd. Można sobie też zrobić makra, żeby mieć zupełnie po staremu.
OdpowiedzUsuńCo do pull up (i pull down bo XMEGA też tak potrafi) to wygląda to nieco inaczej, konfiguruje się to przez PORTx.PINnCNTRL, co wynika z bogactwa opcji konfiguracyjnych pinu.
Gdy tworzę projekt sam, dioda wyraźnie wolniej miga... a gdy wgrywam ściągnięty projekt wygląda na to, że mruga w dobrym tempie.
OdpowiedzUsuńF_CPU mam takie samo jak w przykładowym projekcie.
Dlaczego tak może być?
A jak kompilacja? Nie ma warningów? Jedyne co może być nie tak to coś z definicją F_CPU. Proponuję wrzucić problem na elkę i tam możemy podyskutować.
Usuń