www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATTiny25 USI-Fehler im AVR Studio Simulator?


Autor: Bernd Maierhofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Folgendes Problem: Ich möchte einen ATTiny25 als USI-TWI Slave 
verwenden, bin jetzt aber beim programmieren auf ein mir unbekanntes 
Problem gestossen:

In der Funktion USI_TWI_Slave_Initialise() werden bei allen anderen 
Controllern mit einem USI bei der Zeile: USISR = 0xF0; die gesamten 
Interrupt-Flags gelöscht (so sollte es auch sein!). Bis auf den Tiny25, 
beim Simulieren mit diesem Controller werden die Flags gesetzt.

Weiters werden in USI_TWI_Slave_Initialise() alle nötigen Register 
gesetzt um bei einer autftretenden Start-Bedingung einen Interrupt 
auszulösen. Ich habe versucht den Interrupt im Simulator per Hand durch 
dass setzen des USISIF-Bits auszulösen. Funktioniert überall bis auf den 
Tiny25.

Ich verwenden die AVR Studio Version 4.13 SP1 Build 557 mit 
WinAVR20070525.

Ist das ein Fehler im Simulator oder ist beim Tiny25 etwas anders???

mfg Bernd Maierhofer

#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

#define MESSAGEBUF_SIZE       4

// Sample TWI transmission commands
#define TWI_CMD_MASTER_WRITE 0x10
#define TWI_CMD_MASTER_READ  0x20
//Device Dependant Definitions
#define DDR_USI             DDRB
#define PORT_USI            PORTB
#define PIN_USI             PINB
#define PORT_USI_SDA        PORTB0
#define PORT_USI_SCL        PORTB2
#define PIN_USI_SDA         PINB0
#define PIN_USI_SCL         PINB2

ISR(USI_START_vect) 
{   
  //USI Code....
}

void USI_TWI_Slave_Initialise( unsigned char TWI_ownAddress )
{
  unsigned char  TWI_slaveAddress = TWI_ownAddress;

  PORT_USI |=  (1<<PORT_USI_SCL);      // Set SCL high
  PORT_USI |=  (1<<PORT_USI_SDA);      // Set SDA high
  DDR_USI  |=  (1<<PORT_USI_SCL);      // Set SCL as output    
  DDR_USI  &= ~(1<<PORT_USI_SDA);      // Set SDA as input    
  USICR    =  (1<<USISIE)|(0<<USIOIE)| // Enable Start Interrupt. Disable
                                       //Overflow Interrupt.
              (1<<USIWM1)|(0<<USIWM0)| // Set USI in Two-wire mode. No
                                       // USI  Counter overflow prior to 
                                       // first Start Condition
              (1<<USICS1)|(0<<USICS0)|(0<<USICLK)| // Shift Register Clock
                                        // Source = External, positive edge
                          (0<<USITC);

//Clear all flags and reset overflow counter
  USISR    = 0xF0; //BEIM TINY25 werden im Simulaor die Flags nicht
                   //gelöscht sondern gesetzt.
}

int main( void )
{    
  unsigned char messageBuf[MESSAGEBUF_SIZE], TWI_slaveAddress,   
        samplebyte=0;


  TWI_slaveAddress = 0x10;
  USI_TWI_Slave_Initialise( TWI_slaveAddress );

  sei();                          
        
  for(;;)
  {   
        if (messageBuf[0] == TWI_CMD_MASTER_WRITE)
  {              
           samplebyte=messageBuf[1];                            
  }
        if (messageBuf[0] == TWI_CMD_MASTER_READ)
        {
          messageBuf[0] = samplebyte;                             
          //USI_TWI_Start_Transceiver_With_Data( messageBuf,1 );           
        }
    
  }
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
USI wird vom (alten) Simulator nicht unterstützt (Schau mal einfach in 
die AVRStudio-Hilfe, AVRTools User Guide, Simulator, Known Issues, da 
steht im Prinzip alles was prinzipiell nicht geht).

Der Simulator 2 (im neuen AVRStudio 4.14) unterstützt den afaik, 
allerdings hat der noch ein paar andere Unzulänglichkeiten.

BTW: Die Frage hat aber nichts mit AVR-GCC zu tun und wäre 
dementsprechend im Forum "µC & Elektronik" besser aufgehoben gewesen...

Autor: Bernd Maierhofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha vielen Dank dann lag das also nicht an meinem Code.

Werde dann sofort auf 4.14 aufrüsten.

Johannes M. wrote:
BTW: Die Frage hat aber nichts mit AVR-GCC zu tun und wäre
dementsprechend im Forum "µC & Elektronik" besser aufgehoben gewesen...

Nun ja, ich dachte da es sich um einen C-Code handelt wäre es besser es 
hier rein zu stellen??

Danke

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Maierhofer wrote:

> Nun ja, ich dachte da es sich um einen C-Code handelt wäre es besser es
> hier rein zu stellen??

Aber dein Problem liegt im AVR Studio und hat daher rein gar nichts
mit C zu tun. => moved.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.