Hallo, ich versuche gerade auf dem AT90CAN128 TWI zum Laufen zu bringen. Jedoch doch kommt auf dem Oszi bei SCL nichts an. Wenn ich das gleiche auf dem DVK90CAN1 laufen lasse bekomme ich ein periodische Rechtecksignal (Obwohl dieses nicht periodisch halb symmetrisch ist). Quarze sind beide gleich und alle Fuse bits sind gleich gesetzt. Ich wüsste nicht wo zwischen DVK und AT90 dann noch ein Unterschied bestehen könnte. Weiß jemand wo noch Veränderungen vorzunehmen sind? Für Hinweise wäre ich sehr dankbar. Ich habe das ganze auch noch mit einem zweiten AT90CAN128 getestet. Ohne Erfolg.
Ich habe mehre Varianten versucht. SCL - 5V (4,7k) SDA - 5V (4,7k) SCL - 5V (10k) SDA - 5V (10k) und keine Widerstände. Am Oszi hat sich dabei nur die Y-Achse verschoben. Die Kurven blieben gleich. IMG-6735 zeigt den DVK IMG-6736 zeigt den AT90
Also mittlerweile weiß ich gar nicht mehr wo ran es liegen könnte. Denn beim AT90CAN springt es mittlerweile weiter im Programm als beim DVK. Das ist mein Programm was auf beiden läuft (orientiert an Peter Fleury) Was ich ansteuern möchte ist der MCP4706A0. Link zum MCP http://ww1.microchip.com/downloads/en/DeviceDoc/22272A_MCP4706.pdf Ich hoffe es kann mir jemand weiter helfen. Sehe keinen unterschied zu Code Beispielen, die ich sonst noch gefunden habe.
1 | #include "main.h" |
2 | |
3 | #define FOSC 16000 // 8 MHz External cristal
|
4 | #define F_CPU (FOSC*1000L) // Need for AVR GCC
|
5 | #define SCL_CLOCK 100000L /* I2C clock in Hz */ |
6 | |
7 | #define MCP4706A0 0x60 //i2c address for mcp4706A0
|
8 | |
9 | |
10 | void i2c_init(void){ |
11 | TWSR = 0; |
12 | TWBR = ((F_CPU/SCL_CLOCK)-16)/2; |
13 | }
|
14 | |
15 | unsigned char i2c_start(unsigned char address_and_RW_bit){ |
16 | uint8_t twst; |
17 | |
18 | TWCR = (1<< TWINT) | (1<< TWSTA) | (1<<TWEN); |
19 | |
20 | while(!(TWCR & (1<<TWINT))); |
21 | PORTA = 0x03; //two LEDs on (Bis hier läuft das Programm beim DVK) |
22 | |
23 | twst = TW_STATUS & 0xF8; |
24 | if ( (twst != TW_START) && (twst != TW_REP_START)) return 0; |
25 | |
26 | TWDR = address_and_RW_bit; |
27 | TWCR = (1<<TWINT) | (1<<TWEN); |
28 | |
29 | while(!(TWCR & (1<<TWINT))); |
30 | PORTA = 0x07; // three LEDs on |
31 | |
32 | twst = TW_STATUS & 0xF8; |
33 | if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 0; |
34 | |
35 | return 1; |
36 | }
|
37 | |
38 | unsigned char i2c_write(unsigned char data){ |
39 | uint8_t twst; |
40 | |
41 | TWDR = data; |
42 | TWCR = (1<<TWINT) | (1<<TWEN); |
43 | |
44 | while(!(TWCR & (1<<TWINT))); |
45 | |
46 | twst = TW_STATUS & 0xF8; |
47 | if( twst != TW_MT_DATA_ACK) return 1; |
48 | return 0; |
49 | }
|
50 | |
51 | void i2c_stop(void){ |
52 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); |
53 | |
54 | while(TWCR & (1<<TWSTO)); |
55 | }
|
56 | |
57 | int main(void) |
58 | {
|
59 | //Set direction
|
60 | DDRA = 0xFF; |
61 | //Turn off all relays
|
62 | PORTA = 0x00; |
63 | |
64 | i2c_init(); |
65 | PORTA = 0x01; // one LED on |
66 | |
67 | while (1){ |
68 | if (i2c_start(MCP4706A0 + 0)){ |
69 | PORTA = 0x0F; // four LEDs on |
70 | |
71 | i2c_write(MCP4706_0KOhm); //Set up device |
72 | i2c_write(0x0F); // Set digital to analog output (0x00 - 0xFF) |
73 | i2c_stop(); |
74 | }
|
75 | else{ |
76 | i2c_stop(); |
77 | }
|
78 | }
|
79 | |
80 | return 0; |
81 | }
|
Habs hinbekommen. Prinzipielle Aufbau sowie der C-Code haben gestimmt. Jedoch haben wohl beide der AT90 sowie der DVK beim Zusammenstecken einen Schuss abgekommen. Irgendwie muss eine Überbrückung kurzfristig dagewesen sein. Die I2C Pins können das wohl nicht gut ab.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.