Hallo zusammen Ich habe ein Code-Schnipsel für die USI-Schnittstelle ATtiny2313. Jetzt versuche ich den Code für den ATmega168 anzupassen. Das bereitet mir Mühe und hoffe ihr könnt mir helfen. Unten sind die jeweiligen Code-Schnipsel. Ich habe die beiden Datenblätter der Mikrocontroller verglichen und soweit möglich versucht den Code anzupassen. Kann man überhaupt die USI-Schnittstelle so ändern, dass es für den ATmega168 passt? Oder muss eine andere Lösung her? Die Lücken sind mit Fragezeichen versehen. Code-Schnipsel Attiny2313:
1 | ISR(TIMER1_OVF_vect) |
2 | {
|
3 | if ((EIFR&(1<<PCIF)) || (!(PCMSK&(1<<PCINT7)))) |
4 | {
|
5 | EIFR = (1<<PCIF); // External Interrupt Flag Register, Clear Pin Change Interrupt Flag |
6 | PCMSK |= (1<<PCINT7); // Pin Change Mask, set Pin Change Interrupt Source |
7 | }
|
8 | else
|
9 | {
|
10 | USISR = (1<<USIOIF); // USI Status Register, Clear Counter Overflow Interrupt Flag |
11 | USICR |= (1<<USIOIE); // USI Control Register, Counter Overflow Interrupt Enable |
12 | }
|
13 | }
|
1 | void data_init(void) |
2 | {
|
3 | DDRB &= ~((1<<PB5)|(1<<PB7)); // Delete SDA and SCL |
4 | USICR = (1<<USICS0)|(1<<USICS1); // USI Control Register, External Negative Edge Enable |
5 | }
|
Code-Schnipsel ATmega168:
1 | ISR(TIMER1_OVF_vect) |
2 | {
|
3 | if ((PCIFR&(1<<PCIF0)) || (!(PCMSK0&(1<<PCINT7)))) |
4 | {
|
5 | PCIFR = (1<<PCIF0); |
6 | PCMSK0 |= (1<<PCINT7); |
7 | }
|
8 | else
|
9 | {
|
10 | TWSR = (1<<????); |
11 | TWCR |= (1<<TWIE); |
12 | }
|
13 | }
|
1 | void data_init(void) |
2 | {
|
3 | DDRC &= ~((1<<PC4)|(1<<PC5)); |
4 | TWCR = (1<<????)|(1<<????); |
5 | }
|
Danke und Gruss Firebird