logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega8 program WinAVR

Tomcio7 09 Kwi 2009 21:56 2717 4
  • #1 6394804
    Tomcio7
    Poziom 17  
    Program:
    //#include <avr/io.h>
    
    #define DDRB	_SFR_IO8(0x17)
    #define PORTB	_SFR_IO8(0x18)
    
    
    int main(void)
    {	
    	DDRB = 0xFF;
    	
    	unsigned char i=0;
    	
    	for(;;)
    		PORTB = i++;
    }
    

    i błędy

    LCD.c:10: warning: implicit declaration of function '_SFR_IO8'
    LCD.c:10: error: lvalue required as left operand of assignment
    LCD.c:15: error: lvalue required as left operand of assignment

    Nie dołączam pliku avr.io.h i chce aby program działał. Z biblioteki avr/io.h wyciągnąłem definicje DDRB, i PORTB - ale są błędy. Jak temu zaradzić. Program ma działać ale bez bibliotek.
  • #2 6394892
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Tomcio7 napisał:
    Nie dołączam pliku avr.io.h i chce aby program działał.

    Słusznie, proponuję w ogóle nie korzystać nawet z kompilatora i bibliotek wbudowanych!

    Cytat:

    Z biblioteki avr/io.h wyciągnąłem definicje DDRB, i PORTB - ale są błędy.

    Nie ma w tym nic dziwnego, skoro wyciągnąłeś kawałek biblioteki, a nie całą.

    Cytat:
    Jak temu zaradzić.

    Dołączyć bibliotekę?

    Cytat:
    Program ma działać ale bez bibliotek.

    To ma jakiś cel, czy może "ot tak"?

    4\/3!!
  • #3 6394909
    Tomcio7
    Poziom 17  
    Celem jest napisanie programu bez używania wbudowanych bibliotek. Myślę że można - ale tutaj utknąłem


    //#include <avr/io.h>
    
    #define __SFR_OFFSET 0
    
    #define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
    
    #define DDRB	_SFR_IO8(0x17)
    #define PORTB	_SFR_IO8(0x18)
    
    
    int main(void)
    {	
    	DDRB = 0xFF;
    	
    	unsigned char i=0;
    	
    	for(;;)
    		PORTB = i++;
    }


    błędy


    LCD.c:14: error: lvalue required as left operand of assignment
    LCD.c:19: error: lvalue required as left operand of assignment

    Można to rozwiązać?

    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • #4 6395143
    Dr_DEAD
    Poziom 28  
    Ja proponuje pójść o krok dalej i napisać program w notatniku od razu w formacie Intel HEX. Myślę że można....
    A tak na serio to io.h nie nazywał bym biblioteką, to tylko zbiór definicji. Kto kolwiek Ci zlecił takie zadanie miał raczej na myśli inne biblioteki.
  • Pomocny post
    #5 6395443
    Dr.Vee
    VIP Zasłużony dla elektroda
    Kolego Tomcio7, avr/io.h to nie jest żadna biblioteka tylko zbiór definicji.

    Oczywiście można te definicje przepisać do pliku z kodem źródłowym ("wyręczając" kompilator), ale zanim się to zrobi, to trzeba zrozumieć co te definicje oznaczają.

    Krótko - kolega przepisał definicje dla asemblera zamiast dla kompilatora C. Konkretnie chodzi o test warunku _SFR_ASM_COMPAT w pliku avr/sfr_defs.h. Dla kompilacji w języku C winno być:
    #include <inttypes.h>
    #define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
    #define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)

    Pozdrawiam,
    Dr.Vee
REKLAMA