Elektronika podstawy uC

coffeinka

Elektronika podstawy mikro kontrolerów ;)
Tylko nie wywalajcie mnie za to coś ;)
wiec na początek uC to taka czarna kosteczka z nóżkami ale bez oczek i szczęko czułek można je programować używając języków takich jak asm i c (osobiście robie to w c bo asm-a nie umiem)

Od czego zacząć

Zastanowić Sie co chcemy zrobić i czy gdzieindziej nie ma lepszego tekstu do czytania
jeśli Jesteście na tyle leniwi ze chcecie to czytać (tzn. nie chcecie szukać czegoś lepsiejszego to współczuje(napisaliście kiedyś jakiś działający program ?? tak to sie dziwie :))

Wracając do rzeczy najlepszym wyjściem jest zainwestowanie w atmela-ka 8, złącze lpt (dsub 28) oraz lutownice i trochę kabelków, drucików czy czego tam chcecie do przewodzenia prądu.

Jeśli chcemy używać naszego uC musimy do niego napisać program najlepiej w odpowiednim ide wraz z odpowiednim kompilatorem tu jest link http://prdownloads.sourceforge.net/winavr/WinAVR-20040720-install.exe?download coś co nam "wrzuci" kod do uC (bo to nie dyskietka;)) zrobi sie samemu (potęga ATMEL-ków)

Mam nadzieje ze juz macie winavr (pobraliscie instalacja standardowa [dalej>])
teraz czas stworzyć programator
nalezy tylko połaczyć nóżki lpt i uC
<font name="Courier New">uC - lpt

7 vcc - piny 2,3,4,5
1 reset - pin 7
19 sck - pin 8
17 mosi - pin 9
18 miso - pin 10
8 gnd - pin 18 </span>
o_PiS tabelki
pierwsza kolumna to nr pinu na uC (PDIP - prostokątny) liczony od lewej góry w dół do 14 a potem w górę (góra to to miejsce gdzie jest wycięcie ) na stronie atmel.com znajdziecie opis uC i rozkład nóżek

I program :)

led.c
#include <avr/io.h>
#define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1)
/* sbi(DDRB,PB1)
 * jest to makro które ustawia rejest w bloku b i pinie PB1 
 * sbi(PORTB,PB1)
 * to makro ustawia port w stan wysoki 
 * można a nawet trzeba w nowszych wersjach zastąpić 
 * sbi(DDRB,PB1)   DDRB |=1<<PB1
 * sbi(PORTB,PB1)  PORTB|=1<<PB1
 */
int main (void)
{
LED_ON;
    for (;;)
   {
   }
    return (0);    
}

program to nie wszystko
makefile

PRG            = led
OBJ            = led.o
MCU_TARGET     = atmega8
OPTIMIZE       = -O2
DEFS           =
LIBS           =
# You should not have to change anything below here.
CC             = avr-gcc
# Override is only needed by avr-lib build system.
override CFLAGS        = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS)
override LDFLAGS       = -Wl,-Map,$(PRG).map
OBJCOPY        = avr-objcopy
OBJDUMP        = avr-objdump
all: $(PRG).elf lst text eeprom
$(PRG).elf: $(OBJ)
            $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
clean:
            rm -rf *.o $(PRG).elf *.eps *.png *.pdf *.bak
            rm -rf *.lst *.map $(EXTRA_CLEAN_FILES)
lst:  $(PRG).lst
%.lst: %.elf
            $(OBJDUMP) -h -S $< > $@
# Rules for building the .text rom images
text: hex bin srec
hex:  $(PRG).hex
bin:  $(PRG).bin
srec: $(PRG).srec
%.hex: %.elf
            $(OBJCOPY) -j .text -j .data -O ihex $< $@
%.srec: %.elf
            $(OBJCOPY) -j .text -j .data -O srec $< $@
%.bin: %.elf
            $(OBJCOPY) -j .text -j .data -O binary $< $@
# Rules for building the .eeprom rom images
eeprom: ehex ebin esrec
ehex:  $(PRG)_eeprom.hex
ebin:  $(PRG)_eeprom.bin
esrec: $(PRG)_eeprom.srec
%_eeprom.hex: %.elf
            $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@
%_eeprom.srec: %.elf
            $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@
%_eeprom.bin: %.elf
            $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O binary $< $@
# Every thing below here is used by avr-libc's build system and can be ignored
# by the casual user.
FIG2DEV                 = fig2dev
EXTRA_CLEAN_FILES       = *.hex *.bin *.srec
dox: eps png pdf
eps: $(PRG).eps
png: $(PRG).png
pdf: $(PRG).pdf
%.eps: %.fig
            $(FIG2DEV) -L eps $< $@
%.pdf: %.fig
            $(FIG2DEV) -L pdf $< $@
%.png: %.fig
            $(FIG2DEV) -L png $< $@ 

kiedy masz już plik led.c i makefile w jednym katalogu

z menu IDE wybierz Tools > [WinAVR] Make all.

w dolnym okienku pojawi sie kilka komunikatów ale zajwazniejszy jest

?      Process Exit Code: 0

teraz mozna przejść dalej
jeśli uzywasz systemu nt to musisz uruchomić: C:\WinAVR\bin\install_giveio.bat
zakładajać ze WinAVR masz na dysku c w katalogu WinAVR

programowanie
uruchom linie poleceń przejdz do katalogu gdzie masz zapisany i zkąpilowany kod led.c
<font name="Times New Roman"> <font color="blue">avrdude -p m8 -c bsd -e -U flash:w:led.hex </span></span>
jeśli program zwróci Ci:
<font name="Times New Roman"> <font color="blue">C:\AVR_projekty\LEDavrdude -p m8 -c bsd -e -U flash:w:led.hex
avrdude: can't open device "giveio"
avrdude: failed to open parallel port "lpt1"
? Process Exit Code: 1</span></span>
nie odblokowałes portu lpt
<font name="Times New Roman"> <font color="blue">C:\AVR_projekty\LED>avrdude -p m8 -c bsd -e -U flash:w:led.hex
avrdude: AVR device not responding
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude done. Thank you.
? Process Exit Code: 1</span></span>
masz zle wykonany programator

w innych przypadkach powinnła zapalić sie dioda albo dopiero po wyjeciu i włożeniu spowrotem

modyfikacja programu led.c czyli program II

#include <avr/io.h>
#define F_CPU        1000000                                       /* 1MHz zegar procesora */
#define CYCLES_PER_US ((F_CPU+500000)/1000000) /* cpu cycles per microsecond */
#define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1)
#define LED_OFF sbi(DDRB,PB1);cbi(PORTB,PB1)
/* w nowszych wersjach oprogramowwanie 
 * LED_OFF sbi(DDRB,PB1);cbi(PORTB,PB1)
 * zastapić 
 * LED_OFF DDRB |=1<<1; DDRB&~(1<<PB1) 
 */
void delay(unsigned int us)
{
    unsigned int delay_loops;
    register unsigned int  i;
    delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty)
    for (i=0; i < delay_loops; i++) {};
}
void delayms(unsigned int ms)
{
            unsigned int i;
            for (i=0;i<ms;i++)
                        {
                        delay(999);
                        asm volatile (
                        "WDR"::);
                         }
int main (void)
{
       for (;;) 
                  {
                        LED_ON;
                        delayms(1000);
                        LED_OFF;
                        delayms(1000);
                  }
 
    return (0);    
}

zapomniałem napisać gdzie diodę podpiąć ;)
przepraszam
diodę podłączamy pomiędzy gnd(18 nóżka) (lpt) a 15 nóżka

Watchdog

asm volatile ("WDR"::);

jest to funkcja która w momencie zawieszenia sie programu "nadusi" reset

jak cos jest nie jasne >> komentarz wyjaśnię
pozdr dla tych którzy mnie nie zbluzgaj
WinAVR: http://prdownloads.sourceforge.net/winavr/WinAVR-20040720-install.exe?download

4 komentarzy

ATMega konkretnie "ATMega 8"

Myślę że temat jest ciekawy , powinieneś jednak podać typy uKontrolerów
dla których podajesz kod. :-)

za błedy to PRZEPRASZAM !!!!
podejście jak podejście (realistyczne:)) wiem jak jest to coś okrojone i moze dlatego

WinAVR to ide z kompilatorem coś jak dev c++ tylko ze nie zwraca plików exe tylko hex
i był tam link tylko ze nie dziłał
a co do wykonania to daj znać co to poprawie lub sam popraw (ja pisze jak umiem Mickiewiczem nie jestem ani esteta, na poczatku mialem mniejsza ilosć info i dało rade zrobić pare rzeczy )
(jest sens to rozbudowywać)

jeśli Jesteście na tyle leniwi ze chcecie to czytać (tzn. nie chcecie szukać czegoś lepsiejszego to współczuje(napisaliście kiedyś jakiś działający program ?? tak to sie dziwie :))

Z takim podejsciem nie wroze tu pozytywnych komentarzy, inicjatywa fajna bo nic nie ma o mikroprocesorach jako takich tutaj ale gorzej z wykonaniem.

mam nadzieje ze juz macie winavr

Jako ktos kto czyta ten art zeby sie czegos nauczyc to chetnie bym sie dowiedzial co to jest winavr, ani to dla laikow ani dla kogos kto sie zna :/

Poza tym, ze informacje raczej srednie a formatowanie do dupy to jeszcze moglbys to do worda wkleic ("pszewody" :/) i sprawdzic bledy.