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

błąd przy kompilacji : Type variable 'cyfry' must be const in order

programistawpf 18 Kwi 2021 19:35 423 3
REKLAMA
  • #1 19388016
    programistawpf
    Poziom 2  
    PLIK main.c :
    Cytat:
    #include <avr/interrupt.h>
    #include <inttypes.h>
    #include <util/delay.h>
    #include "wyswietlacze.h" //mój plik nagłówkowy

    uint8_t i;

    int main(void)
    {

    DDRB = 255; //cały port jako wyjściowy
    DDRD |= (1<<0)|(1<<1); //porty PD0 i PD1 również jako wyjścia

    PORTD |= (1<<0); //aktywowanie pierwszego wyświetlacza

    while(1)
    {
    for (i=0; i<10; i++)
    {
    PORTB = cyfra(i);
    _delay_ms(1000); // opóźnienie 1s między kolejnymi cyframi
    }

    }

    return 0;
    }

    PLIK wyswietlacze.h:

    Cytat:
    /*
    * wyswietlacze.h
    *
    * Created on: 18-04-2021
    * Author: PC
    */

    #ifndef WYSWIETLACZE_H_
    #define WYSWIETLACZE_H_



    #endif /* WYSWIETLACZE_H_ */
    ////////////////////////////////////////////////////////////////////////////////
    // wyswietlacze.h - plik nagłówkowy z przydatnymi funkcjami do
    // obsługi wyświetlaczy
    // wersja: 1.0 data: 7 marca 2008
    // autor: Ravender
    ////////////////////////////////////////////////////////////////////////////////
    // Funkcje
    //
    // uint8_t cyfra(uint8_t) - zwraca podaną cyfrę z pamięci danych
    //
    //Plik ten należy umieścić w folderze \avr\include

    #include <avr/pgmspace.h>
    #include <inttypes.h>

    #define A 0
    #define B 1
    #define C 2
    #define D 3
    #define E 4
    #define F 5
    #define G 6

    //prog_uint8_t cyfry[11] PROGMEM = {
    uint8_t cyfry[11] PROGMEM = {
    (1<<A)|(1<<B)|(1<<C)|(1<<D)|(1<<E)|(1<<F), //0
    (1<<B)|(1<<C), //1
    (1<<A)|(1<<B)|(1<<G)|(1<<E)|(1<<D), //2
    (1<<A)|(1<<B)|(1<<G)|(1<<C)|(1<<D), //3
    (1<<F)|(1<<G)|(1<<B)|(1<<C), //4
    (1<<A)|(1<<F)|(1<<G)|(1<<C)|(1<<D), //5
    (1<<A)|(1<<F)|(1<<E)|(1<<D)|(1<<C)|(1<<G), //6
    (1<<A)|(1<<B)|(1<<C), //7
    (1<<A)|(1<<B)|(1<<C)|(1<<D)|(1<<E)|(1<<F)|(1<<G), //8
    (1<<A)|(1<<B)|(1<<C)|(1<<D)|(1<<F)|(1<<G), //9
    (0<<A)|(0<<B)|(0<<C)|(0<<D)|(0<<E)|(0<<F)|(0<<G), //10 - całkowite wygaszenie wyświetlacza
    };

    uint8_t cyfra(uint8_t cyfra)
    {
    return pgm_read_byte(&cyfry[cyfra]);
    }


    Przy kompilacji Eclise wyrzuca 2 błędy
    1 /
    Description Resource Path Location Type
    variable 'cyfry' must be const in order to be put into read-only section by means of '__attribute__((progmem))' wyswietlacze.h /AtinyL7 line 37 C/C++ Problem
    2/
    Description Resource Path Location Type
    unknown type name 'prog_uint8_t' wyswietlacze.h /AtinyL7 line 37 C/C++ Problem

    Zaczynam z C i nie wiem o co chodzi . Dzięki za wskazówki !
  • REKLAMA
  • Pomocny post
    #2 19388095
    BlueDraco
    Specjalista - Mikrokontrolery
    Chodzi dokładnie o to, co napisane - brak koniecznego atrybutu const na początku deklaracji.
  • REKLAMA
  • #3 19388158
    programistawpf
    Poziom 2  
    const uint8_t cyfry[11] PROGMEM =...
    Dzięki !

    Dodano po 39 [minuty]:

    Program już chodzi ale steruje tylko wyświetlacz1 W1, wyjściem PD0 (pin2) , drugi wyświetlacz sterowny z PD1 nie reaguje. na PD1 nic się nie dzieje, jest tam jest permanentnie stan niski. Jak go uaktywnić analogicznie do PD0 ?
    Schamat
    http://acid19.linuxpl.com/diycenter/wp-content/grafika/multipleksled/wyswled1.jpg
  • #4 19388379
    tmf
    VIP Zasłużony dla elektroda
    Przede wszystkim pokaż program sterujący. Ten powyższy fragment, który pokazałeś ustawia tylko PD0, więc wyświetlacz sterowany z PD1 nie może działać.
    BTW, skoro wyświetlacze są sterowane multipleksowo, to użyj przerwania timera.
REKLAMA