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


von Bernd Maierhofer (Gast)


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

1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/interrupt.h>
4
5
#define MESSAGEBUF_SIZE       4
6
7
// Sample TWI transmission commands
8
#define TWI_CMD_MASTER_WRITE 0x10
9
#define TWI_CMD_MASTER_READ  0x20
10
//Device Dependant Definitions
11
#define DDR_USI             DDRB
12
#define PORT_USI            PORTB
13
#define PIN_USI             PINB
14
#define PORT_USI_SDA        PORTB0
15
#define PORT_USI_SCL        PORTB2
16
#define PIN_USI_SDA         PINB0
17
#define PIN_USI_SCL         PINB2
18
19
ISR(USI_START_vect) 
20
{   
21
  //USI Code....
22
}
23
24
void USI_TWI_Slave_Initialise( unsigned char TWI_ownAddress )
25
{
26
  unsigned char  TWI_slaveAddress = TWI_ownAddress;
27
28
  PORT_USI |=  (1<<PORT_USI_SCL);      // Set SCL high
29
  PORT_USI |=  (1<<PORT_USI_SDA);      // Set SDA high
30
  DDR_USI  |=  (1<<PORT_USI_SCL);      // Set SCL as output    
31
  DDR_USI  &= ~(1<<PORT_USI_SDA);      // Set SDA as input    
32
  USICR    =  (1<<USISIE)|(0<<USIOIE)| // Enable Start Interrupt. Disable
33
                                       //Overflow Interrupt.
34
              (1<<USIWM1)|(0<<USIWM0)| // Set USI in Two-wire mode. No
35
                                       // USI  Counter overflow prior to 
36
                                       // first Start Condition
37
              (1<<USICS1)|(0<<USICS0)|(0<<USICLK)| // Shift Register Clock
38
                                        // Source = External, positive edge
39
                          (0<<USITC);
40
41
//Clear all flags and reset overflow counter
42
  USISR    = 0xF0; //BEIM TINY25 werden im Simulaor die Flags nicht
43
                   //gelöscht sondern gesetzt.
44
}
45
46
int main( void )
47
{    
48
  unsigned char messageBuf[MESSAGEBUF_SIZE], TWI_slaveAddress,   
49
        samplebyte=0;
50
51
52
  TWI_slaveAddress = 0x10;
53
  USI_TWI_Slave_Initialise( TWI_slaveAddress );
54
55
  sei();                          
56
        
57
  for(;;)
58
  {   
59
        if (messageBuf[0] == TWI_CMD_MASTER_WRITE)
60
  {              
61
           samplebyte=messageBuf[1];                            
62
  }
63
        if (messageBuf[0] == TWI_CMD_MASTER_READ)
64
        {
65
          messageBuf[0] = samplebyte;                             
66
          //USI_TWI_Start_Transceiver_With_Data( messageBuf,1 );           
67
        }
68
    
69
  }
70
}

von Johannes M. (johnny-m)


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...

von Bernd Maierhofer (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.