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