Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

atmega8, uart i Hyper Terminal, dioda led

bullyman 01 Lut 2011 16:34 1915 7
  • #1 01 Lut 2011 16:34
    bullyman
    Poziom 10  

    Jestem początkujący i chciałbym sprawdzić jak działa uart i Hyper Terminal. Chciałem za pomocą instrukcji z klawiatury zapalić diode lecz bez efektu. Prosze o wytknięcie złego rozumowania lub błędów w kodzie.

    Code:
    #include<avr/io.h>
    
    #include<avr/interrupt.h>

    void UartInit(void);
    void LedInit(void);

    volatile char cZnak='3';

    int main(){

       UartInit();
       LedInit();
       
       PORTC&=~(1<<PC3);
       
       sei();
       
       while(1){
          
          switch(cZnak){
          
          case '1':
             PORTC&=~(1<<PC3);
          break;
             
          case '2':
             PORTC|=(1<<PC3);
          break;
             
          default:
          break;
          }
          
                 }
       
       return 0;
    }

    ISR(USART_RXC_vect){
       
       cZnak=UDR;
    }

    void UartInit(void){
       UCSRB|=(1<<RXCIE)|(1<<RXEN);
       UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
       UBRRL=12;// 9600 bit/s- szybkość transmisji
    }
    void LedInit(void){
       DDRC=(1<<PC3);
    }

    0 7
  • #2 01 Lut 2011 17:51
    LordBlick
    VIP Zasłużony dla elektroda

    A F_CPU masz ustawione w Makefile ?

    0
  • #3 01 Lut 2011 18:07
    bullyman
    Poziom 10  

    Code:
    PRG            = USART
    
    OBJ            = USART.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 $< $@

    w którym miejscu powinienem to ustawić?

    0
  • #4 01 Lut 2011 18:17
    LordBlick
    VIP Zasłużony dla elektroda

    Na początku wpisujesz :

    Code:
    F_CPU=11059200 // Dla zegara 11.0592MHz
    Potem w części dotyczącej flag kompilatora C jako kolejną linijkę :
    Code:
    CFLAGS += -DF_CPU=${F_CPU}UL


    bullyman napisał:
    Code:
    # Override is only needed by avr-lib build system.
    

    override CFLAGS        = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS)
    override LDFLAGS       = -Wl,-Map,$(PRG).map
    Mam wrażenie, że powinieneś te "overide" wy...walić...
    P.S. Nie jestem pewny czy pomimo powyższych zabiegów to zadziała. Poszukaj na forum działających przykładów, bo nie jesteś pierwszą osobą, która pyta w tym temacie...

    0
  • #5 01 Lut 2011 18:31
    bullyman
    Poziom 10  

    a może ja coś zle robie od strony czysto fizycznej, bo z tego co rozumiem to za pomocą hyper terminala wciskając na klawiaturze '1' dioda powinna sie zaswiecić, a czy nie trzeba jakoś tego transformować na kod ASCI? Bo możliwe że ja w programie coś namieszałem. A zegar mam 1Mhz

    0
  • #6 01 Lut 2011 18:36
    LordBlick
    VIP Zasłużony dla elektroda

    Hyperterminal powinien już sam z siebie wysyłać ASCII, ale za niego nie ręczę. Tak patrzę na kod i chyba raczej nie ma potrzeby ustalać cZnak='3', wystarczyłoby:

    Code:
    volatile char cZnak;
    Kompilator i tak ustawi to na zero.

    0
  • #7 01 Lut 2011 18:41
    bullyman
    Poziom 10  

    tak też myślałem, ale czy bedzie rozróżniał zmiane stanu żeby zaświecić diode. Chyba że ktoś ma inny program którym można sprawdzić działanie uarta.

    0