Beste,

Ik heb een stukje programmacode dat niet de gewenste werking heeft. Ik wil er voor zorgen dat na driemaal de controller opnieuw te hebben opgestart, de uitgang PD6 hoog wordt.

Is er iemand die een idee heeft van wat verkeerd zit?
Alvast bedankt!


#include <avr/io.h>

void EEPROM_write(unsigned int uiAddress, unsigned char ucData) {

while(EECR & (1<<EEPE))
;
EEAR = uiAddress;  
EEDR = ucData;	 

EECR |= (1<<EEMPE);
EECR |= (1<<EEPE);
}

unsigned char EEPROM_read(unsigned int uiAddress) {

while(EECR & (1<<EEPE))
;
EEAR = uiAddress;
EECR |= (1<<EERE);

return EEDR;
}

int main (void) {

unsigned char i;

DDRD = 0xFF;

if (EEPROM_read(0x00) != 0 && EEPROM_read(0x00) != 1 && EEPROM_read(0x00) != 2) {

EEPROM_write(0x00,0);
}

i = EEPROM_read(0x00);


if (i < 2) {
EEPROM_write(0x00,i++);
}
else {
PORTD = 0x40;
}

}

Wat inspringen zou de leesbaarheid verhogen. Waarom gebruik je trouwens je eigen eeprom routines en niet de bestaande?
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

EEPROM_write(0x00,i++);

Is een deel van je probleem. i word namelijk eerst meegegeven aan de functie en pas daarna 1 opgehoogd. Maak daar i + 1 van of ++i. i + 1 is logischer omdat je i verder niet meer gebruikt.

Ik zou het zo doen (niet getest, uit losse hand)


#include <avr/io.h>
#include <avr/eeprom.h>

unsigned char EEMEM boot_counter = 0

int main()
{  
  unsigned char i;

  DDRD = (1 << PD6);

  eeprom_busy_wait();
  i = eeprom_read(&boot_counter);

  i++;

  eeprom_busy_wait();
  eeprom_write(&boot_counter, i);

  if(i > 2)
  {
    PORTD |= (1 << PD6);
  }

  ... overige code

  return 0;
}

Ik heb aan mijn code de veranderingen aangebracht zoals in de eerste reply is aangegeven, maar ik krijg maar niet het gewenste resultaat. Ik heb ook de code geprobeerd die in het vorige bericht is gegeven, maar het werkt ook niet echt.
Heeft er soms iemand nog andere bemerkingen? De bedoeling is dat na de controller een aantal (drie) keer te hebben opgestart pin6 hoog wordt. Ik gebruik een atmega644.

Alvast bedankt voor een eventuele reactie!

Groeten,

Gilles

Je probleem is als ik het mij goed herinner timing. Er zitten wat afhankelijkheden in het schrijven naar EEPROM. Zoals een goede compiler betaamt, komt er niet de meest efficiënte code uit, dus daar ga je op nat. Inline assembly gebruiken of gewoon een de runtimelib het werk laten doen.

Tja, je zal op 1 of andere manier moeten uitvissen wat er gebeurt. Debuggen, dus.
Heb je nog pinnen vrij? Hang daar wat LED's aan met een serieweerstandje, en maak één van die pinnen hoog navenant de waarde van i.
Hangt er een display aan je µC? Toon daar i.
Enz...