ProMini en i2c

Hardware geleverd door Arduino
Berichten: 6
Geregistreerd: 15 Apr 2014, 11:55

ProMini en i2c

Berichtdoor on1bte » 29 Apr 2014, 23:30

Vandaag enkele ProMini's *ATmega 328 5V 16MHz 32kbyte* en een 6 Pin USB 2.0 to TTL UART Module Serial Converter CP2102 binnen gekregen.
http://www.ebay.com/itm/140966034693?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
http://www.ebay.com/itm/400565980256?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

Voorheen had ik een sketch lopen op mijn Mega2560 die via I2C enkele PCA9555D 16 bit expanders aanstuurt.
Hier een beschrijving en een sketch voor mijn toepassing 'Controller voor een bestaande elektriciteitskast met impulsrelais'.
http://users.telenet.be/on1bte/Domotica/Mijn%20domotica%20project.pdf
Ik stuur hier eigenlijk mijn impulsrelais aan alsof het klikaan klikuit ontvangers zijn.
Op pin 2 van mijn Mega2560 zit het signaal afkomstig van de 433.9MHz ontvanger.

Bij een Mega2560 zit SDA en SCL resp. op pin 20 en 21.
Bij een ProMini gebruikt men hiervoor resp. A4 en A5.

Bij mijn Mega2560 werkt dit perfect.
Bij de ProMini wordt er slechts éénmaal gedecodeerd en loopt de sketch vast.
In mijn toepassing doe ik veel serialprints om het proces te kunnen volgen.
Bij de ProMini krijg ik enkele lijntjes zinnige tekst, vervolgens onzin en dan stopt hij ermee.

Iemand enig idee in welke richting er moet gezocht worden ?

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: ProMini en i2c

Berichtdoor nicoverduin » 30 Apr 2014, 08:16

Kijk de processor "Stopt" er niet mee... Dus ik zou gaan spelen met de Serial print om te zoeken op welk statement hij er de brui aan geeft. Mogelijk wacht hij ergens op? Of timing problemen met een library? Of je loopt door je ram geheugen heen?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 6
Geregistreerd: 15 Apr 2014, 11:55

Re: ProMini en i2c

Berichtdoor on1bte » 01 Mei 2014, 10:14

Het zijn dus de Serial.println lijnen die het hem doen. En ik heb 72 cases waarin ik nogal een lange tekst naar de seriële monitor (115200 Bd) stuur.
Het heeft niets te zien met i2c. Misschien kan er hier iemand een zinnige verklaring geven waarom dit bij de Mega2560 wel werkt en bij de Pro Mini niet ?

Oorspronkelijke structuur werkende op de Mega2560 in geval van de 72 cases :

    case 1394001:
      Serial.println("Channel 1 remote A is on"); RData = 0x01; RemoteSwitching();
      break;
    case 1394004:
      Serial.println("Channel 1 remote A is off"); RData = 0x00; RemoteSwitching();
      break;



Voor de Pro Mini is de structuur nu de volgende geworden :

    case 1394001:
      Serial.println("1A^");
      RData = 0x01; RemoteSwitching();
      break;
    case 1394004:
      Serial.println("1A_");
      RData = 0x00; RemoteSwitching();
      break;



Weet er misschien iemand een alternatieve manier om van die cases af te komen.
Probleem is dat er in het getal achter de case geen echte logica zit.
Dit komt rechtstreeks uit de RCSwitch.h library.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: ProMini en i2c

Berichtdoor nicoverduin » 01 Mei 2014, 16:07

Wat je moet realiseren is het volgende:

Alle teksten die je in het programma gebruikt worden bij het opstarten van de processor gekopieerd uit het FLASH geheugen naar het RAM geheugen. Daarnaast wordt er ook nog RAM geheugen gebruikt voor globale variabelen EN gedurende de verwerking de stack. Deze laatste doet bij elke functie aanroep het adres van de volgende instructie en alle doorgegeven variabelen + alle in de functie gebruikte variabelen op de stack. Dus dat kan best oplopen. Op de Mega2560 heb je 8K RAM geheugen en op de UNO maar 2K RAM geheugen. Dus dat zou de verklaring zijn van het "hangen" waar je tegenliep. Helaas de IDE geeft weinig info tijdens compileren. Met andere settings op de compiler kun je de geclaimde hoeveelheid RAM wel zien.

Mogelijke oplossingen:
a) intelligente manier om de string op te bouwen uit verschillende vaste/variabele delen
b) de vaste stukken tekst in het FLASH geheugen houden.

Dit statement bijvoorbeeld :
Code: Alles selecteren
Serial.println(F("inline flash based text"));


Laat de text string in het FLASH geheugen staan. Volgens mij wordt hij alleen gekopieerd op het daadwerkelijke moment van printen naar het RAM geheugen en daarna is dat geheugen in RAM weer vrij.

terwijl dit statement:

Code: Alles selecteren
Serial.println("inline flash based text");


Altijd het geheugen gebruikt in RAM en nooit meer vrijgeeft.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar Arduino hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 46 gasten