Beste leden,

Wie zou mij kunnen helpen met een c code...
Het project is open source en de c files staan op het internet.
Betreft de Elektuur propellerclock.

Op dit moment zit de .hex er in maar ik wil het programma hier en daar aanpassen.

Ik krijg het programma niet ge-build in avr studio 4.18 (build 716).
Ik had eerst avrstudio 6 geïnstalleerd maar ik was daar zo van geschrokken dat ik naar 4 ben gegaan.

Ik heb alle c files (kan ik zo opsturen) echter wil ik vragen of iemand het als avrproject-file kan opslaan dat hij wel build/compiled en ik hem kan openen.

HEb er uren achter gezeten maar krijg hem niet voor elkaar. Eén van de fouten die ik er uit had gehaald zijn #include <ioavr.h> veranderd naar #include <avr/io.h> echter ik blijf bij een string (__flash const u8 u8_strHello[7]="Hello !"; een error houden en wel deze;
../communication.c:18: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'const'

Zou iemand voor mij de 2 c programma's willen builden aub?

Ik zou voorstellen om die lijn code (die niet helemaal netjes C is) te vervangen voor dit:

Probeersel 1:


const u8 u8_strHello[8]="Hello !";

Probeersel 2:


const u8 u8_strHello[8];
u8_strHello[0] = 'H';
u8_strHello[1] = 'e';
u8_strHello[2] = 'l';
u8_strHello[3] = 'l';
u8_strHello[4] = 'o';
u8_strHello[5] = ' ';
u8_strHello[6] = '!';
u8_strHello[7] = 0;

Probeersel 3:


const char u8_strHello[8];
u8_strHello[0] = 'H';
u8_strHello[1] = 'e';
u8_strHello[2] = 'l';
u8_strHello[3] = 'l';
u8_strHello[4] = 'o';
u8_strHello[5] = ' ';
u8_strHello[6] = '!';
u8_strHello[7] = 0;

Probeersel 1 naar 3 worden steeds iets meer ABC (Algemeen Beschaafd C)


__flash const u8 u8_strHello[7]="Hello !";

??? lijkt erop dat hier een string in Flash wordt bedoeld.
Maar attribute __flash is mij niet bekend.
En type u8 ook niet.

Tegenwoordig ziet zo een statement er zo uit:

 
const char u8_strHello[7] PROGMEM = "Hello !"; 

Maar dat werkt ook niet want "Hello !" is 8 lang (terminator wordt meegeteld door de compiler).

Dus je kunt beter de lengte weglaten:

 
const char u8_strHello[] PROGMEM = "Hello !"; 

Op 3 augustus 2015 22:23:19 schreef elmowww:
Probeersel 1:


const u8 u8_strHello[8]="Hello !";

De originele regel heeft iets met "flash" er bij staan. Dat betekent dat de rest van de code er van uitgaat dat ie in flash staat. Op een AVR heb je twee keer "adres 100", 1x in data-ruimte en 1x in de flash. Dus als je
strHello in je code roept, krijg je die "100", maar als je hem als flash-adres gebruikt terwijl je "standaard C" data-ruimte hebt gedeclareerd werkt het niet....

Mmm.. Bij de targets die ik ken heeft de RAM een flinke offset tov de ROM (ARM). Er zullen inderdaad architecturen zijn waar dat wel uitmaakt.

Misschien iets om rekening mee te houden inderdaad :)

Nee helaas de tips maken niet uit. Hij snapt iets met flash niet.

Even iets geks:
ik heb deze fout bij "build all" vanuit base.c


Build started 4.8.2015 at 20:32:55
avr-gcc  -mmcu=atmega328p -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT base.o -MF dep/base.o.d  -c  ../base.c
../base.c:32: warning: return type of 'main' is not 'int'
../base.c: In function 'main':
../base.c:37: warning: 'u8_styleNumberSaved' may be used uninitialized in this function
../base.c:35: warning: 'stateMachineMenu' may be used uninitialized in this function
avr-gcc  -mmcu=atmega328p -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT communication.o -MF dep/communication.o.d  -c  ../communication.c
../communication.c:18: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'const'
../communication.c:19: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'const'
../communication.c:20: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'const'
../communication.c: In function 'COM_UpdateLang':
../communication.c:285: error: 'u8_strLang' undeclared (first use in this function)
../communication.c:285: error: (Each undeclared identifier is reported only once
../communication.c:285: error: for each function it appears in.)
../communication.c: In function 'COM_Hello':
../communication.c:431: error: 'u8_strHello' undeclared (first use in this function)
../communication.c: In function 'COM_SetDisplayStyle':
../communication.c:465: error: 'u8_displayTypes' undeclared (first use in this function)
make: *** [communication.o] Error 1
Build failed with 8 errors and 3 warnings...

Zou het kunnen zijn dat er nog een library toegevoegd moet worden voor het "flash" gedeelte?

Als ik nu

u8 u8_styleNumberSaved;

uitsluit met

//u8 u8_styleNumberSaved;

dan krijg ik deze foutmeldingen

Build started 4.8.2015 at 20:36:02
avr-gcc  -mmcu=atmega328p -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT base.o -MF dep/base.o.d  -c  ../base.c
../base.c:32: warning: return type of 'main' is not 'int'
../base.c: In function 'main':
../base.c:145: error: 'u8_styleNumberSaved' undeclared (first use in this function)
../base.c:145: error: (Each undeclared identifier is reported only once
../base.c:145: error: for each function it appears in.)
make: *** [base.o] Error 1
Build failed with 3 errors and 1 warnings...

Dan is dat gedeelte van

../communication.c:19: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'const'

weg.

Tevens heb ik deze "message". Waarom heb ik geen GCC toolchain?


Loaded plugin STK500
gcc plug-in: No AVR Toolchain installation found. Using WinAVR instead if installed. The AVR GCC plug-in can still be used if you set up your own build tools.
Loaded plugin AVR GCC
Loaded partfile: E:\avrstudio418\PartDescriptionFiles\ATmega328P.xml

Op deze manier stop je een constante in de flash:


#include <avr/pgmspace.h>

const char strHello[] PROGMEM = "Hello !";

De essentie is het includen van de avr/pgmspace.h include file, daar zit de macro in. (De tip van "deKees" was dus goed)

De constructie met "flash" is waarschijnlijk iets nieuws in AVR6.

Ik heb het net even geprobeerd, de string komt zo inderdaad in het program segment terecht.

Al die onzin met u8 en die u8_ prefix gewoon weglaten, het is en zijn gewoon chars in die string. Het levert namelijk helemaal geen code winst op.
Wil je toch ergens anders met bytes werken gebruik dan de stdint.h typen (uint8_t bijvoorbeeld) dat is 100x handiger en portable.

-edit-
Evenverder zitten prutsen: Tot mijn verwondering werkt hetvolgende ook:


PROGMEM const char strHello[] = "Hello !";

Dit wil dus zeggen dat je zelf een macro kunt maken (zet ergens boven in de .c file):


#define __flash PROGMEM

en zo niet overal in de code op allerlei plaatsen van alles hoeft te wijzigen (__flash kun je dus laten staan).

Verder wel die stommiteit eruit halen van de lengte van 7 want dat werkt zeker niet.

Henri62, ja klopt!
Het heeft nog wel wat voeten in de aarde om een avr6 naar 4 om te zetten....

Ik heb met de volgende code:


/*****************************************************************************
*
* File              : communication.c
* Revision          : $Revision: 1.0 $
*
* Description       : Propeller Clock serial transmission manager
*
****************************************************************************/
#define var_globale extern
#include <avr/pgmspace.h>
#include "communication.h"
//#include <ioavr.h>
#include <avr/io.h>
#include "types.h"
#include "usart.h"
#include "utilities.h"
#include "var.h"

//__flash const u8 u8_strHello[]="Hello !";;
const char strHello[] PROGMEM = "Hello !";
//__flash const u8 u8_strLang[]="EngFreGer";;
const char strLang[] PROGMEM = "EngFreGer";
//__flash const u8 u8_displayTypes[STYLES_NUMBER]={
const char displayTypes[STYLES_NUMBER]={
//Numeric mode, hour only
0x80,0x85,0x86,0x87,0x8D,0x8E,  //0-5
0x80,0x81,0x82,0x83,0x99,0x9A,  //6-11
//Numeric mode + date
0xC0,0xC5,0xC6,0xC7,0xCD,0xCE,  //12-17
0xC0,0xC1,0xC2,0xC3,0xD9,0xDA,  //18-23
//Numeric mode + date + temperature
0xE0,0xE5,0xE6,0xE7,0xED,0xEE,  //24-29
0xE0,0xE1,0xE2,0xE3,0xF9,0xFA,  //30-35
//Analog mode + date
0x5B,0x5A,0x59,0x58,0x50,       //36-40
0x4B,0x4A,0x49,0x48,0x40,       //41-45
//Analog mode, hour only
0x1B,0x1A,0x19,0x18,0x10,       //46-50
0x0B,0x0A,0x09,0x08,0x00,       //51-55
//Christmas Tree
0x1B,0x1A,0x19,0x18,0x10};      //56-60

/****************************************************************************
  Function : void COM_UpdateUnderscore(stateMenu position)
  This function underlines some displayed characters
****************************************************************************/
void COM_UpdateUnderscore(stateMenu position, st_time *timeNow)
{
  u8 i;
  
  //prepare serial buffer :
  //Header byte
  g_u8_transmitBuffer[0] = DISPLAY_TEXT;
  //Set all data bytes as spaces
  for (i=2; i<12; i++)
    g_u8_transmitBuffer[i] = ' ';
    
  switch (position)
  {
    case SET_HOURS:  
    {
      //clear previous sector: send 10 spaces
      g_u8_transmitBuffer[1] = 0x41; //white text, 6*7 font, clear sector before write
      US_SendFrame(12); 

      //underline hour digits
      g_u8_transmitBuffer[1] = 0xe0; //red text, 8*16 font, clear sector before write
      g_u8_transmitBuffer[2] = '_';
      if (timeNow->hourBCD <= 9)
        US_SendFrame(6); 
      else
      {
        g_u8_transmitBuffer[3] = '_';
        US_SendFrame(7); 
      }
      break;
    }
    case SET_MINUTES:  
    {
      //underline minutes digits
      g_u8_transmitBuffer[1] = 0xe0; 
      g_u8_transmitBuffer[5] = '_';
      
      if (timeNow->hourBCD <= 9)
      {
        g_u8_transmitBuffer[4] = '_';
        US_SendFrame(6); 
      }
      else
      {
        g_u8_transmitBuffer[6] = '_';
        US_SendFrame(7); 
      }
      break;
    }
    case SET_DAYWEEK:  
    {
      //clear previous sector: send 5 spaces
      g_u8_transmitBuffer[1] = 0xe0; //red text, 8*16 font, clear sector before write
      US_SendFrame(7); 
      
      //underline day of week
      g_u8_transmitBuffer[1] = 0x41; //white text, 6*7 font, clear sector before write
      g_u8_transmitBuffer[2] = '_';
      g_u8_transmitBuffer[3] = '_';
      g_u8_transmitBuffer[4] = '_';
      //if date is on one digit, send only 11 characters
      if (timeNow->dateBCD <= 9)
        US_SendFrame(11); 
      else
        US_SendFrame(12); 
      break;
    }
    case SET_DATE:  
    {
      //underline date
      g_u8_transmitBuffer[1] = 0x41;
      g_u8_transmitBuffer[6] = '_';
      //if date is on one digit, send only 11 characters
      if (timeNow->dateBCD <= 9)
        US_SendFrame(11);
      else
      {
        g_u8_transmitBuffer[7] = '_';
        US_SendFrame(12); 
      }
      break;
    }
    case SET_MONTH:  
    {
      //underline month
      g_u8_transmitBuffer[1] = 0x41;
      g_u8_transmitBuffer[9] = '_';
      g_u8_transmitBuffer[10] = '_';
      //if date is on one digit, send only 11 characters
      if (timeNow->dateBCD <= 9)
      {
        g_u8_transmitBuffer[8] = '_';
        US_SendFrame(11); 
      }
      else
      {
        g_u8_transmitBuffer[11] = '_';
        US_SendFrame(12); 
      }
      break;
    }
    case SET_YEAR:
    {      
      //underline year
      g_u8_transmitBuffer[1] = 0x41; //white text
      g_u8_transmitBuffer[4] = '_';
      g_u8_transmitBuffer[5] = '_';
      US_SendFrame(6);
      break;
    }
    case SET_LANGUAGE:
    {
      //underline language
      g_u8_transmitBuffer[1] = 0x41;
      g_u8_transmitBuffer[7] = '_';
      g_u8_transmitBuffer[8] = '_';
      g_u8_transmitBuffer[9] = '_';
      US_SendFrame(10);
      break;
    }
    case SET_RPM_DAY:
    {
      //underline language
      g_u8_transmitBuffer[1] = 0x41;
      g_u8_transmitBuffer[9] = '_';
      US_SendFrame(10);
      break;
    }
    case SET_LUM_DAY:
    {
      //underline language
      g_u8_transmitBuffer[1] = 0x41;
      g_u8_transmitBuffer[9] = '_';
      US_SendFrame(10);
      break;
    }   
    case SET_RPM_DARK:
    {
      //underline language
      g_u8_transmitBuffer[1] = 0x41;
      g_u8_transmitBuffer[9] = '_';
      US_SendFrame(10);
      break;
    }
    case SET_LUM_DARK:
    {
      //underline language
      g_u8_transmitBuffer[1] = 0x41;
      g_u8_transmitBuffer[9] = '_';
      US_SendFrame(10);
      break;
    }    
    case QUIT_SETUP:
    {
      //clear upper sector: send 5 spaces
      g_u8_transmitBuffer[1] = 0xe0; //red text, 8*16 font, clear sector before write
      US_SendFrame(7); 

      //clear lower sector: send 10 spaces
      g_u8_transmitBuffer[1] = 0x41; //white text, 6*7 font, clear sector before write
      US_SendFrame(12); 
      break;
    }
    default: break;
  }
  
  return;
}

/****************************************************************************
  Function : void COM_UpdateTemperature(u16 temperature)
  This function sends TEMPERATURE frame to propeller
****************************************************************************/
void COM_UpdateTemperature(u16 temperature)
{
  g_temperature.temp = (u8)((temperature>>8) & 0x3f);
  g_temperature.tempfrac = (u8)((temperature>>6)  & 0x03);
  
  g_u8_transmitBuffer[0] = TEMPERATURE;
  //Send High Byte (integer part)
  g_u8_transmitBuffer[1] = (u8)(g_temperature.temperatureByte>>8);
  //Send Low Byte (fractional part) : Only 2 MSB used
  g_u8_transmitBuffer[2] = (u8)(g_temperature.temperatureByte);

  US_SendFrame(3); 
}

/****************************************************************************
  Function : void COM_UpdateDate(st_time timeNow)
  This function sends DATE frame to propeller
****************************************************************************/
void COM_UpdateDate(st_time *timeNow)
{
  //format structures
  g_date.month = (UTI_BCD2Hex(timeNow->monthBCD) & 0x0f)-1;
  g_date.date = UTI_BCD2Hex(timeNow->dateBCD) & 0x1f;
  g_date.dayWk = timeNow->dayBCD - 1;
  
  g_u8_transmitBuffer[0] = DATE;
  //month stored in timeNow structure is comprised between 1-12 (imposed by RTC)
  //but propeller understands months from 0-11
  g_u8_transmitBuffer[1] = g_date.monthByte;
  //timeNow.dayBCD comprised between 1-7, substract 1 to be understood by propeller
  g_u8_transmitBuffer[2] = g_date.dateByte;

  US_SendFrame(3); 
}

/****************************************************************************
  Function : void COM_UpdateYear(st_time timeNow)
  This function sends a free text frame to propeller
  The text is formated to display current year
****************************************************************************/
void COM_UpdateYear(st_time *timeNow)
{
  g_u8_transmitBuffer[0] = DISPLAY_TEXT;
  g_u8_transmitBuffer[1] = 0xc1; //red text, 6*7 font, clear sector before write
  g_u8_transmitBuffer[2] = '2';
  g_u8_transmitBuffer[3] = '0';
  g_u8_transmitBuffer[4] = '0' + ((timeNow->yearBCD & 0xf0)>>4);
  g_u8_transmitBuffer[5] = '0' + (timeNow->yearBCD & 0x0f);
  
  US_SendFrame(6); 
}

/****************************************************************************
  Function : void COM_UpdateLang(u8 language)
  This function sends a free text frame to propeller
  The text is formated to display the choice between 3 languages
****************************************************************************/
void COM_UpdateLang(u8 language)
{
  if (language > 2)
    language = 2;
    
  g_u8_transmitBuffer[0] = DISPLAY_TEXT;
  g_u8_transmitBuffer[1] = 0xc1; //white text, 6*7 font, clear sector before write
  g_u8_transmitBuffer[2] = 'L';
  g_u8_transmitBuffer[3] = 'a';
  g_u8_transmitBuffer[4] = 'n';
  g_u8_transmitBuffer[5] = 'g';
  g_u8_transmitBuffer[6] = ':';
  g_u8_transmitBuffer[7] = *(u8_strLang+3*language);
  g_u8_transmitBuffer[8] = *(u8_strLang+3*language+1);
  g_u8_transmitBuffer[9] = *(u8_strLang+3*language+2);
  US_SendFrame(10); 
}

/****************************************************************************
  Function : void COM_UpdateSpeed(u8 day, u8 speed)
  This function sends a free text frame to propeller
  The text is formated to display the current speed
****************************************************************************/
void COM_UpdateSpeed(u8 u8_day, u8 u8_speed)
{
  u8 u8_speedBCD;
  
  //bound variables
  if ((u8_day != DAY) && (u8_day != DARK))
    u8_day = DAY;
    
  //compute speed : input is 0 or 40 - 100, output is 0-9
  if ((u8_speed >= 10) && (u8_speed <= 100))
    u8_speedBCD = UTI_Hex2BCD(u8_speed - 10);
  else
    u8_speedBCD = 0;
    
  g_u8_transmitBuffer[0] = DISPLAY_TEXT;
  g_u8_transmitBuffer[1] = 0xc1; //white text, 6*7 font, clear sector before write
  g_u8_transmitBuffer[2] = 'S';
  g_u8_transmitBuffer[3] = 'p';
  g_u8_transmitBuffer[4] = 'd';
  g_u8_transmitBuffer[5] = ' ';
    
  if (u8_day == DAY)
  {
    g_u8_transmitBuffer[6] = 'H';
    g_u8_transmitBuffer[7] = 'i';
  }
  else
  {
    g_u8_transmitBuffer[6] = 'L';
    g_u8_transmitBuffer[7] = 'o';
  }
  g_u8_transmitBuffer[8] = ':';
  g_u8_transmitBuffer[9] = '0' + (u8_speedBCD>>4);

  US_SendFrame(10); 
}

/****************************************************************************
  Function : void COM_UpdateLuminosityMenu(u8 u8_day, u8 u8_luminosity)
  This function sends a free text frame to propeller
  The text is formated to display the current luminosity
****************************************************************************/
void COM_UpdateLuminosityMenu(u8 u8_day, u8 u8_luminosity)
{
  u8 u8_luminosityBCD;
  
  //bound variables
  if ((u8_day != DAY) && (u8_day != DARK))
    u8_day = DAY;
    
  //convert to BCD value. Use only 8 values
  if (u8_luminosity <= MAX_LUMINOSITY)
    u8_luminosityBCD = UTI_Hex2BCD(u8_luminosity);
  else
    u8_luminosityBCD = 0;
    
  g_u8_transmitBuffer[0] = DISPLAY_TEXT;
  g_u8_transmitBuffer[1] = 0xc1; //white text, 6*7 font, clear sector before write
  g_u8_transmitBuffer[2] = 'L';
  g_u8_transmitBuffer[3] = 'u';
  g_u8_transmitBuffer[4] = 'm';
  g_u8_transmitBuffer[5] = ' ';
    
  if (u8_day == DAY)
  {
    g_u8_transmitBuffer[6] = 'H';
    g_u8_transmitBuffer[7] = 'i';
  }
  else
  {
    g_u8_transmitBuffer[6] = 'L';
    g_u8_transmitBuffer[7] = 'o';
  }
  g_u8_transmitBuffer[8] = ':';
  g_u8_transmitBuffer[9] = '0' + (u8_luminosityBCD&0x0f);

  US_SendFrame(10); 
}

/****************************************************************************
  Function : void COM_UpdateTime(st_time timeNow)
  This function sends TIME frame to propeller
****************************************************************************/
void COM_UpdateTime(st_time *timeNow)
{
  //format structures
  g_time.hours = UTI_BCD2Hex(timeNow->hourBCD) & 0x1f;
  g_time.minutes = UTI_BCD2Hex(timeNow->minuteBCD) & 0x3f;
  g_time.seconds = UTI_BCD2Hex(timeNow->secondBCD) & 0x3f;

  g_u8_transmitBuffer[0] = TIME;
  g_u8_transmitBuffer[1] = g_time.hoursByte;
  g_u8_transmitBuffer[2] = g_time.minutesByte;
  g_u8_transmitBuffer[3] = g_time.secondsByte;

  US_SendFrame(4); 
}

/****************************************************************************
  Function : void COM_UpdateLuminosity(u8 power)
  This function checks ambient luminosity. If changed since last call, sends
  update frame to propeller
****************************************************************************/
void COM_UpdateLuminosity(u8 power)
{
  g_u8_transmitBuffer[0] = LUM_POWER;
  g_u8_transmitBuffer[1] = (power & 0x0f);  
  US_SendFrame(2); 
}

/****************************************************************************
  Function : void COM_UpdateDisplayType(void)
  This function sends g_displayType variable to propeller
****************************************************************************/
void COM_UpdateDisplayType(void)
{
  g_u8_transmitBuffer[0] = DISPLAY_TYPE;
  g_u8_transmitBuffer[1] = g_displayType.byte;
  
  US_SendFrame(2); 
}

/****************************************************************************
  Function : void COM_Hello(void)
  This function displays "Hello" on propeller
****************************************************************************/
void COM_Hello(void)
{
  u8 i;
  
  //Fill transmit buffer
  g_u8_transmitBuffer[0] = DISPLAY_TEXT;
  g_u8_transmitBuffer[1] = 0x61; //white text, 8*16 font, clear sector before write

  for (i=0; i<7; i++)
    g_u8_transmitBuffer[i+2] = u8_strHello[i];

  //Display Hello, one letter at a time
  for (i=0; i<6; i++)
  {
    //i=0 sends a void frame but is needed to add a delay
    US_SendFrame(i+2); 
    //wait for 300ms
    g_u8_tempo10ms_1 = 30;
    while(g_u8_tempo10ms_1);
  }
  
  //wait for 2s
  g_u8_tempo10ms_1 = 200;
  while(g_u8_tempo10ms_1);
  
  return;  
}

/****************************************************************************
  Function : void COM_SetDisplayStyle(u8 styleNumber)
  This function changes display type.
  Display styles are stored in a constants buffer which changes DISPLAY_TYPE
  byte accordingly to communication protocol.
  TIME byte is updated depending on color chosen.
  DATE and TEMPERATURE colors are always the opposite of TIME color
****************************************************************************/
void COM_SetDisplayStyle(u8 styleNumber, st_time *timeNow, u16 *temperature)
{
  //check boundaries
  if (styleNumber > STYLES_NUMBER)
    styleNumber = DEFAULT_STYLE;
  
  //set displaytype byte
  g_displayType.byte = u8_displayTypes[styleNumber];
  
  //set other text's color
  if ((styleNumber >= 6 && styleNumber <= 11) ||
  (styleNumber >= 18 && styleNumber <= 23) ||
  (styleNumber >= 30 && styleNumber <= 35) ||
  (styleNumber >= 41 && styleNumber <= 45) ||
  (styleNumber >= 51 && styleNumber <= 55))
  {
    g_time.hmCol = RED;
    g_date.datCol = WHITE;
    g_temperature.tempCol = WHITE;
  }
  else
  {
    g_time.hmCol = WHITE;
    g_date.datCol = RED;
    g_temperature.tempCol = RED;
  }
  
  if ((styleNumber >=56) && (styleNumber <= 60))
    g_christmasTree.treeEn = 1;
  else
    g_christmasTree.treeEn = 0;
  
  //send updated variables
  COM_UpdateChristmasTree();
  COM_UpdateDisplayType();
  COM_UpdateTime(timeNow);
  COM_UpdateDate(timeNow);
  COM_UpdateTemperature(*temperature);
  
  return;
}

/****************************************************************************
  Function : void COM_SendTestFrame
  This function sends a TEST_FRAME once.
****************************************************************************/
void COM_SendTestFrame(void)
{
  //Fill transmit buffer
  g_u8_transmitBuffer[0] = TEST_FRAME;
  US_SendFrame(1); 
  
  return;
}

/****************************************************************************
  Function : void COM_UpdateChristmasTree(void)
  This function sends g_christmasTree variable to propeller
****************************************************************************/
void COM_UpdateChristmasTree(void)
{
  g_u8_transmitBuffer[0] = CHRISTMAS_TREE;
  g_u8_transmitBuffer[1] = g_christmasTree.byte;
  US_SendFrame(2); 
}

Nog de volgende foutmelding;


Build started 4.8.2015 at 21:07:52
avr-gcc  -mmcu=atmega328p -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT communication.o -MF dep/communication.o.d  -c  ../communication.c
../communication.c: In function 'COM_UpdateLang':
../communication.c:289: error: 'u8_strLang' undeclared (first use in this function)
../communication.c:289: error: (Each undeclared identifier is reported only once
../communication.c:289: error: for each function it appears in.)
../communication.c: In function 'COM_Hello':
../communication.c:435: error: 'u8_strHello' undeclared (first use in this function)
../communication.c: In function 'COM_SetDisplayStyle':
../communication.c:469: error: 'u8_displayTypes' undeclared (first use in this function)
make: *** [communication.o] Error 1
Build failed with 5 errors and 0 warnings...

Hoe kan hij nu zeggen dan dat die strings undeclared zijn?

Omdat u8 niet bestaat.
Gewoon zelf even u8 defineren als macro:


#define u8 unsigned char

Dat met die andere tip om op die manier ook __flash te vervangen moet je er komen.

Stop die declaraties even in een eigen header file, bijvoorbeeld compat.h (verzin ik even voor "compatibility") en include die in beide C files en je hoeft niet overal alles te vervangen.

Dit gedoe met u8 (en allerlei andere u16/u32 en meer van die ellende) is precies het "beunwerk" wat ik bedoel dat zoiets totaal niet portable is en alleen meer ellende oplevert als dat het oplost. Ik heb dat al in honderden sources gezien. Ze leren het nooit.

Zo te zien is bij de declaratie van de variable de naam nu gewijzigd van

u8_strHello

naar

strHello

Dat is uiteraard niet jofel, want in de code wordt gewoon nog u8_strHello gebruikt.

Dus zoals deKees al aangaf:

const char u8_strHello[] PROGMEM = "Hello !"; 

[Bericht gewijzigd door BVZ op (19%)]

Dat was alleen mijn voorbeeldje, toen had ik de code nog niet gezien.
Kun je beter laten staan, is geen beginnen aan om dat te fixen.

Maar je hebt gelijk, de rest kun je allemaal origineel laten. Met die include fix kun je dat in een keer oplossen.

P.S. Voor diegene die het interessant vinden waarom die prefix notatie (ook wel Hungarian notation genoemd) op deze manier bagger is moet dit stuk eens aandachtig doorlezen:
http://www.joelonsoftware.com/articles/Wrong.html -> Ga verder naar onder naar de paragraaf: "I’m Hungary" en lees hoe het originele idee door bijna iedereen verpest is en verkeerd gebruikt en dus nutteloos geworden is op deze manier.
Er staat ook de originele bedoeling bij hoe het wel toegepast had moeten worden en dat het dan wel waardevol is.

Verder staan op die site een enorme hoeveelheid artikelen verzameld die de moeite waard zijn om door te lezen.

Op 4 augustus 2015 20:57:23 schreef henri62:

-edit-
Evenverder zitten prutsen: Tot mijn verwondering werkt hetvolgende ook:


PROGMEM const char strHello[] = "Hello !";

Dit wil dus zeggen dat je zelf een macro kunt maken (zet ergens boven in de .c file):


#define __flash PROGMEM

en zo niet overal in de code op allerlei plaatsen van alles hoeft te wijzigen (__flash kun je dus laten staan).

Sorry misschien is onderstaand iets heel doms maar deze code gaat me ook iets te ver...

heb nu het volgende:

wat is hier mis mee?

#pragma vector = INT0_vect
__interrupt void MCU_Int0Interrupt(void)

want het geeft deze fout;


../microcontroller.c:256: warning: ignoring #pragma vector 
../microcontroller.c:257: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'

Interessant!

[Bericht gewijzigd door Henry S. op (29%)]

Het ging mij erom dat er 1x u8 teveel verwijderd wordt:

const u8 u8_strHello[7]="Hello !";

Die 2e u8 heeft niets met een type te maken, maar is gewoon deel van de naam.

Ga die link overigens wel ff doorlezen.

Dat wat er nu mis gaat is een interrupt functie. Die moet altijd op een speciale manier gedeclareerd worden.
Dat is compiler en CPU specifiek. En totaal niet gestandariseerd helaas.

Je moet dat in de documentatie zien te vinden hoe dat precies moet doen.

Het moet zoiets zijn (-edited- op 5 aug):


#pragma vector = INT0_vect
__interrupt void MCU_Int0Interrupt(void)
{
... 

vervangen door:


#include <avr/interrupt.h>

ISR(INT0_vect)
{
...

Op 4 augustus 2015 22:05:24 schreef BVZ:
Het ging mij erom dat er 1x u8 teveel verwijderd wordt:

const u8 u8_strHello[8]="Hello !";

Zei ik ook, niks aan wijzigen. Alleen de eerste u8 wordt door de define vervangen.

Ik ga straks even proberen met de ISR declaratie.
De mircocontroller is een atmega 328p met gcc compiler in avr studio 4 sp3. Ik upload een hex file via een avrdude commandline met mn arduino as isp. Losse hex files gaan perfect op die manier(wel op de fuses letten). Ben nog van plan een avr dragon aan te schaffen of een avrmkII.

Kan het te maken hebben dat ik nog geen gcc toolchain heb?
Ik zag op youtube een filmpje over toolchain; ga ik even mee stoeien.

[Bericht gewijzigd door Hoihoi op (29%)]

Zo ik ben lekker bezig geweest henri62

Ik heb inderdaad ISR(INT0_vect) gebruikt.
Als er bijvoorbeeld 2 interrupts in een c file zitten gebruik ik INT0 en INT1 (goed?)

bij de volgende c file met een interrupt weer met 0 "nul" beginnen (goed?)

Op gegeven moment wilt hij gaan builden en geeft 5 warnings. Zijn warnings erg of geeft hij dan nog steeds juiste code?

En hij geeft 1 error en wel deze;


e:/avr tools/avr toolchain/bin/../lib/gcc/avr/4.6.2/../../../../avr/bin/ld.exe: cannot find -lobjc
collect2: ld returned 1 exit status
make: *** [prop4.elf] Fout 1
Build failed with 1 errors and 5 warnings...

Heb al wat op ge-googled en zou iets te maken hebben met blocks en
"linken" maar kon er geen kaas van maken.
misschien -lobjc statement weghalen? maar hoe?

Wat te doen? We zijn dichtbij....

edit: heb wat zitten rommelen en die -lobjc error is weg echter gaat hij nu verder met het main programma te controleren (hij heeft dus alle andere c files gecontroleerd en OK bevonden denk ik?)

En komt nu met


E:\- Hobby\hobby\Propellor clock Elektor\atmel418_projects\prop4\default/../base.c:65: undefined reference to `__eint'
eeprom.o: In function `EE_WriteByte':
E:\- Hobby\hobby\Propellor clock Elektor\atmel418_projects\prop4\default/../eeprom.c:45: undefined reference to `__dint'
E:\- Hobby\hobby\Propellor clock Elektor\atmel418_projects\prop4\default/../eeprom.c:48: undefined reference to `__eint'
microcontroller.o: In function `MCU_Sleep':
microcontroller.c:(.text+0xf4): undefined reference to `__sleep'
collect2: ld returned 1 exit status
make: *** [prop4.elf] Fout 1
Build failed with 4 errors and 3 warnings...

begrijp dus ook niet echt in welke volgorde hij build

[Bericht gewijzigd door Hoihoi op (35%)]

INT0 en INT1 zijn twee verschillende interrupt handlers die bij een specifiek deel van de hardware horen. Die kun je dus niet zomaar even veranderen.

libc is de C-library die de linker niet kan vinden.
Dit heeft waarschijnlijk wel met de GCC toolchain te maken.

Op zich is het helemaal niet moelijk om die even te installeren en die te gebruiken ipv. de avr toolchain. Ik ben bang dat je er niet onderuit komt.

Als het goed is heb ik ook hier op het forum eens een installatie voorschrift gepost moet dat moet. Effe zoeken...

-edit- Niet meer kunnen vinden hier op het forum, dan maar weer een copy/paste uit mijn archief:


Download AVR Studio 4, release 4.19 (build 730) and install it.
http://www.atmel.com/tools/studioarchive.aspx
http://www.atmel.com/forms/software-download.aspx?target=tcm:26-17924


Download "WinAVR":
http://sourceforge.net/projects/winavr/files/
(At time of writing "WinAVR-20100110-install.exe").
Install in: C:\WinAVR   NOTE: IS NOT THE DEFAULT!!!
The usermanual can be found in: C:\WinAVR\WinAVR-user-manual.html

Start: AVR Studio 4
In the menu:
	Project => Project Wizard
Button:
	New Project, select AVR GCC
	Choose a project name and folder
	Finish
Project:
	Configuration options, select correct CPU type.

Existing projects:
Open the project.

Project:
	Configuration options, custom options icon at the left.
	Disable Use AVR toolchain.
		External tools.
		avr-gcc: C:\WinAVR\bin\avr-gcc.exe
		make: C:\WinAVR\utils\bin\make.exe

Als er een van die tools al op staat hoef je die natuurlijk niet opnieuw te installeren. Let op installatie paden met spaties er in, ik dacht dat dat niet werkt.

Ja, het is zo ver; Ik heb de handdoek in de ring gegooid.

Ik heb tandjes veel code aangepast, toolchain aangepast, libraries toegevoegd, etc etc. Na uren klooien waren de hiervoor gaande foumeldingen weg en dan komt hij nu met een nieuwe waslijst aan errors (in wat voor volgorde hij nu build is me echt een raadsel).

AVR studio begint nu weer over andere declaraties enz, zoals;


../i2c.h:26:2: error: storage class specified for parameter 'tx_type'
../i2c.h:64:18: error: expected declaration specifiers or '...' before 'tx_type'
In file included from ../base.c:18:0:

Ben bang dat deze code op een linux systeem is geschreven met eigen of speciale libraries........geen idee. Maar mij lukt het niet.

Als iemand er zin in heeft er naar te kijken zal ik een zip file opsturen.

Op 9 augustus 2015 14:49:39 schreef Hoihoi:
Ben bang dat deze code op een linux systeem is geschreven met eigen of speciale libraries........geen idee. Maar mij lukt het niet.

Als je het host systeem bedoeld (waar de compiler dus op draait) dan is dat niet de reden.

Maar voor welke CPU is de code?
Hoeveel sourcefiles heb je?

Maar voor welke CPU is de code?
Hoeveel sourcefiles heb je?

Het is voor een Atmega 328p-au
Er zijn 9 source files en 13 header files.

Ik vind het zo raar dat c code dus gewoon niet zo standaard is. Het is erg afhankelijk van instellingen en libraries. Logisch misschien maar het verschil tussen IDE's vind ik raar. In de één geeft een declaratie of op een andere manier van schrijven van een interrupt een error en bij een andere IDE weer niet. Ik vind C dan niet echt een eenduidige taal.....

Mail die sources eens naar me toe (zie profiel), kijk ik er even naar of ik snel kan vinden wat de oorzaak is. Ik ben nu wel benieuwd waar die problemen vandaan komen.

Op 10 augustus 2015 18:14:36 schreef henri62:
Mail die sources eens naar me toe (zie profiel), kijk ik er even naar of ik snel kan vinden wat de oorzaak is. Ik ben nu wel benieuwd waar die problemen vandaan komen.

Dankjewel. Ik heb net de e-mail gestuurd.

De code is origineel voor de IAR compiler gemaakt, daarom compileert het voor geen meter met de avr-gcc compiler.

Ik heb de code van "base" aangepast zodat die op beide nu zou moeten compileren.

De meeste uitdagingen zitten dus in de declaraties van de ISR functies. Het includen van de juiste avr/io.h zoals al gezegd is.

Verder nog in de __sleep functie die anders is. En nog meer van die ongein.

De code bouwt nu onder avr-gcc met een handje vol warnings die er al in zaten.

Geen idee of de code die er nu uit komt ook echt werkt. De binairy code size is net iets meer dan 8000 bytes.

Zie de verbouwde zip file.

Er is nog een ander dingetje: Het opstarten via de *.aps file werkt om een of andere duistere reden niet.
Als je winavr opstart en je opent het project via de aps file, gaat het wel goed.

Ook even de frequentie van de CPU goed instellen en de AVR toolchain, die kan bij jouw anders zijn. (Project->Configuration options)

-edit- 2015-08-13
Ik heb de base.aps file gefixed zodat het project nu in een keer te openen is.
Plus nog een paar triviale warnings opgelost.
Dus een nieuwe zipfile attached.
Ook het project even gecleaned zodat de upload minimaal is.

-edit- 2015-08-15 code verwijderd, verderop staat de verbeterde versie!

Hallo Henri62,

Super bedankt dat je er even naar wilde kijken. Ik heb je code nog niet kunnen openen. Van het weekend ga ik er weer met frisse zin voor zitten want ik was nogal gedemotiveerd geraakt en heb even mn zinnen gezet op wat reparaties om mn hoofd van avrstudio af te krijgen ( je weet misschien hoe dat gaat als je ergens door gedemotiveerd bent geraakt..... Even wat anders doen). Ik laat je hier in dit topic wel weten wat de uitkomst is.
Nogmaals dank.

Hallo Henri,

De code werd juist "ge-build". Ik moest wel weer mn toolchain aanwijzen. Ik had de freq ingesteld bij "general" onder settings (20000000 Hz kristal). En toen vervolgens met avrdude de hex erin gebrand. Helaas geen draaiend programma...

De fuse settings zijn hetzelfde als bij de originele hex dus dat kan het niet zijn.

Ik ga nog even google'en wat al die andere soorten instellingen zijn bij general zie bijlage. zoals OS optimization en die 4 vinkjes aan de zijkant, geen idee wat ze doen. De 2 laatste plaatjes van avr dragon instellingen zijn van de maker zelf.

edit: zou het kunnen liggen aan de andere code die in de andere atmega zit? De base atmega doet namelijk via ir signalen communiceren naar de propeller atmega. En daar zit dan een net ander opgebouwde code in....