Sida 2 av 2

Re: atmel i2c slave mode

Postat: 18 augusti 2009, 10:29:18
av SvenW
eAK:

Jag föredrar att svara här i stället för i "personliga meddelanden" därför att jag
snart åker bort ett tag och då inte är lillgänglig på forumet en tid.

Om jag förtår ditt problem rätt så har du en extern buffert som ligger i en
separatkompilerad modul som skall sändas via TWI, och att det vore slöseri med tid att
delkopiera till en lokal buffert.

Variabler i separatkompilerade moduler brukar man deklarera 'extern'.
'volatile' används för att förhindra att kompilatorn optimerar bort variabeln.
Speciellt inne i ISR rutinen, för kompilatorn har då ingen aning om något händer med
variabeln utanför ISR rutinen. Det är lätt att den då optimeras bort.


Är osäker på om det går att deklarera 'extern volatile', och vad det kan ha för konsekvenser.

I min kod använder jag #include "TWI_isr.c" i mitt huvudprogram och slipper därmed problemet.
Atmelkoden från * AppNote : AVR311 - TWI Slave Implementation * är ju rätt kort,
och det är småpotatis för kompilatorn.

Jag hinner inte just nu att reda ut hur man gör om man behöver separakompilera modulerna,
men det kanske finns någon annan på forumet som kan göra det.
Specialiter inom 'Winavr' känner jag inte till.

Re: atmel i2c slave mode

Postat: 18 augusti 2009, 11:15:30
av sodjan
> Jag föredrar att svara här i stället för i "personliga meddelanden"...

Lite off-topic kanske, men jag bara undrar... :-)

Det är väl självklart att svar på frågorna som ställs i tråden också ska lämnas *i tråden*.
Om det var just det som du skrev som du funderade på att skicka som PM, så förstår
jag det inte alls. Det finns ju ingenting "personligt" i det där svaret som det finns
anledning att dölja för andra...

Dessutom är det ju en riktigt otjänst mot övriga användare på forumet som kanske
är lika intresserad av tråden och svaren/lösningarna som trådskaparen.

Så fortsätt gärna att svara direkt i trådarna, alla blir nog bara gladare för det... :-)

Re: atmel i2c slave mode

Postat: 18 augusti 2009, 11:23:08
av eAk
eAk skrev:Hej jag sitter nu och försöker få igång det med interrupt istället för min egen kod som buggar sig för mig. dock verkar den fungera bättre än atmels kod då den måste skrivas om för winavr.

men jag har några frågor till att börja med.

här i ditt exempel ser jag. Så du menar att koden innehåller heltenkelt 4st pekare till buffertar med arrays så jag kan bara skicka in min jpeg buffert där så skickar den ut alla byte från den arrayen?

Kod: Markera allt

 /* 
                          * Här utväxlas egna data med messageBuf[]
                          * MessageBuf tas emot och skickas till 
                          * master när avbrottet hanteras.
                          */

                          messageBuf[0] = adcval4;
                          messageBuf[1] = ticks16;
Du har säkert koll på hur jag ska definiera om de globala variablerna med volatile så att den ska förstå do från olika filer. jag har aldrig riktigt hajjat hur det ska gå till. compilatorn klagar alltid på mig eller klagar inte och jag kan inte skriva/läsa ändringarna som sker innom och utanför interrupt.

tackar för all hjälp.


Ämne: atmel i2c slave mode
SvenW skrev:Det där med att jobba på nätterna tror jag inte är en bra idé, men det kan vara individueelt.

Jag kan inte sätta mig in i detaljerna i koden ovan, men det förefaller som du vill göra en ISR alias interrupt service rutin. En ISR måste kopplas till ett fysiskt avbrott.

Det skall se ut så här:

Kod: Markera allt

ISR (TWI_vect)
{
 ...
}



TWI_vect skall finnas i en headerfil:

#define TWI_vect _VECTOR(24) /* Two-wire Serial Interface */
_VECTOR(24) i sin tur kopplar till rätt avbrottslinje.

Troligen vinner man ingenting på att skriva en egen ISR, utan det är lika bra att ta den som finns i Atmelkoden TWI_isr.c.

Det som man skriver själv i sitt huvudprogram kan se ut så här
(Det finns nog fler och bättre exempel i Atmelkoden):

Kod: Markera allt


/*
 * Denna kod är bara ett exempel.
 * Det fungerar sannolikt inte utanför sin kontext!
 */

#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>

#include "TWI_slave.h"
#include "../commons.h"         /* Sample TWI transmission commands */


int
main (void)
{
  unsigned char messageBuf[10];
  unsigned char TWI_slaveAddress;
     
	DDRD = 0b11100011;          /* bit 3..0, pin 5..2 */
    DDRB = 0x3F;                /* bit 3..0, pin 17, 16 ,15, 14 */
    DDRC = 0x00;                /* bit 3..0, pin 28..23 */
      
     
    setup_timer0 ();
    setup_timer1 ();            /* Two PWM signals; generates interrupts. */
    setup_timer2 ();            /* One PWM signal,  syncronized with timer1 */
    setup_adc ();



    TWI_Slave_Initialise ((TWI_slaveAddress << TWI_ADR_BITS) |
                          (TRUE << TWI_GEN_BIT));


  sei ();
  TWI_Start_Transceiver ();

  for (;;)
    {
      if (!TWI_Transceiver_Busy ())
        {
          if (TWI_statusReg.lastTransOK)
            {
              if (TWI_statusReg.RxDataInBuf)
                {
                  TWI_Get_Data_From_Transceiver (messageBuf, 6);

                  if (TWI_statusReg.genAddressCall)
                    {
                      ;
                    }
                  else
                    {
                      if (messageBuf[0] == TWI_CMD_MASTER_WRITE)
                        {
                          ;
                        }
                      else if (messageBuf[0] == TWI_CMD_MASTER_READ)
                        {
                          cli ();

                         /* 
                          * Här utväxlas egna data med messageBuf[]
                          * MessageBuf tas emot och skickas till 
                          * master när avbrottet hanteras.
                          */

                          messageBuf[0] = adcval4;
                          messageBuf[1] = ticks16;

                          pos_control = messageBuf[3] & 0x00ff;
                          pos_control |= (messageBuf[2] << 8) & 0xff00;

                          messageBuf[5] = e8stimated_pos2;
                          messageBuf[4] = (e8stimated_pos2 >> 8);
                          sei ();

                          TWI_Start_Transceiver_With_Data (messageBuf, 6);
                        }
                    }
                }
              else
                asm ("nop");

              if (!TWI_Transceiver_Busy ())
                TWI_Start_Transceiver ();
            }
          else
            TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ());
        }
      asm ("nop");
    }

}


Re: atmel i2c slave mode

Postat: 18 augusti 2009, 11:31:41
av sodjan
Det där måste ha vara ett av de mest onödiga inläggen jag har sett.
Är det inte bara kopior på tidigare inlägg i samma tråd !!??

Re: atmel i2c slave mode

Postat: 18 augusti 2009, 11:35:07
av eAk
Så heltenkelt hur bör atmels appnote definieras om så man kan använda den i programmet.
Eller om någon kan se vad för fel jag gjort med min polling kod. vilket hadde varit det bästa om jag fick den att funka.
så jag heltenkelt bara lyssnar av mottagen data och sedan pekar till den array jag vill skicka tillbaka.
jag använder 60% av ram nu till variabler och en jpeg bild.
Då jag suttit välldans massa timmar med den och jag vill inte störa allt annat som ska ske med interrupt, så föredrar jag polling.
men man kan ju alltid slå av och på interrupt lite här och var men då känns det ju rätt onödigt att utsätta sig för krånglet med interrupten

Nu går jag och lägger mig men får la hoppas någon kommer på något bra och skriver.
Jag hade tänkte dela med mig av i2c koden när den funkar iallafall. för det lär ju finnas fler än mig som vill ha det att stoppa in i sina program ibland där man bara behöver defeniera lite saker som händer vid olika input.

Re: atmel i2c slave mode

Postat: 18 augusti 2009, 11:37:40
av eAk
sodjan skrev:Det där måste ha vara ett av de mest onödiga inläggen jag har sett.
Är det inte bara kopior på tidigare inlägg i samma tråd !!??
nja det är pmet med en fråga i. Men ni tyckte ju att man inte skulle dölja något svar och hålla det i tråden...

Re: atmel i2c slave mode

Postat: 18 augusti 2009, 14:33:58
av sodjan
OK. Som sagt, mycket bättre att svara direkt i tråden.

Och jag tyckte igentligen att *SvenW* inte ska röra till det genom att "dölja" svaren i olika PM...
Hela sammanhanget i tråden blir ju väldigt märkligt för alla andra...

Håll allt i tråden om det inte gäller rent personliga saker.

När det gäller det inlägget som jag kallade "onödigt", så hade det ju varit
väldigt enkelt att lägga till en kommentar om vad det var, eller hur ? Nu
fanns det ju ingenting som sa att det var gamla PM som du kopierade in...

Ja ja, bara alla tänker till lite så är ju allt detta ganska självklart igentligen...

Re: atmel i2c slave mode

Postat: 18 augusti 2009, 17:40:14
av E85
Om du nu vill få igång det och kan tänka dig att använda interrupt ändå så kan du kolla på min kod till 7-segment-drivaren i väckarklockeprojektet, http://elektronikforumet.com/forum/view ... =3&t=35303. Den koden är i "avr-7seg"-katalogen.

Re: atmel i2c slave mode

Postat: 19 augusti 2009, 01:38:58
av eAk
okej jag antar det är den filen jag ska ladda ner.
Får ta mig en koll i koden.
http://misc.fmx.se/alarmclock-0.1.zip

Så kan jag experimentera vidare med min polling kod senare.
Just nu vill jag bara ha igång det till att fungera så fort som möjligt.

Re: atmel i2c slave mode

Postat: 19 augusti 2009, 01:48:35
av eAk
Har kollat lite nu och det är ju exakt samma kod som i appnoten från atmel?.
Den som jag inte får igång i winavr.
som jag började på att utgå att skriva en egen polling kod ifrån.

Re: atmel i2c slave mode

Postat: 20 augusti 2009, 05:51:21
av eAk
Ojj löste vist min bugg tror jag. :)
min egna kod var helt korrekt,förutom en liten skit miss ska testa att den kan räkna upp arrays nu också. så nu slipper jag atmels appnote.
kan likagärna publicera den i en ny tråd när jag testat lite granna mer.

Re: atmel i2c slave mode

Postat: 20 augusti 2009, 07:23:33
av eAk
Såja hittade lite fler buggar som jag verkar ha löst nu.
skriver till register skickar pekare lite hit och dit i ram och skickar ut dom :)
Då kommer nästa test att få ut jpegbilden ur ram via i2c då.