Hallo Zusammen ich brauche eure Hilfe, es geht um folgendes: Ich hab einen ATmega32A und möchte ihn mit einem SJA 1000 und PCA82C250 an den CAN-Bus anschließen. Ich habe den ATmega und SJA1000 folgendermaßen beschalten: ATmega SJA 1000 PC0-7 AD0-7 PA0 ALE PA2 !RD/E PA3 !WR PA5 !Int !RST an VCC !CS an GND MODE an GND (d.h. im Intel MODE?!) VDD 1-3 an VCC VSS 1-3 an GND RX0 an RXD vom PCA82C250 TX0 an TXD vom PCA82C250 nun will ich Daten in den SJA schreiben und wieder auslesen wenn ich das überhaupt kann? um eben später die Daten vom CAN-BUS richtig einlesen zu können! ich gebe mit 'canreg_write' im main Programm die Addresse ein und dahinter die Daten oder die Zahl(siehe Anhang im Programm). Mit 'canreg_read' möchte ich die gerade geschriebenen Daten wieder auslesen(mit rs232), es kommt aber z.B. ein weiser smiley bei der addresse 1, bei addresse 2 ein schwarzer smiley und bei 3 ein Herz obwohl ich vorher was anderes hineingeschrieben habe, bzw. es laut Datenblatt der Wert FF im Byte abgelegt ist. ist meine Vorgehensweise überhaupt machbar? oder wie bekomme ich später die Kommunikation zwischen ATmega und SJA hin? und wie ist es mit Intel- oder Motorolla- MODE? Danke schonmal für eure Antworten! Mfg Haens
Hi, sind die Atmega's mit Can on Chip aus? Oder sind hier Dilgehäuse gefragt? Ohne mir jetzt den Code angeschaut zu haben, ist das JTag abgeschalten? Liegt ja auf PortC. Gruß Rene
Rene Zimmermann schrieb: > sind die Atmega's mit Can on Chip aus? Oder sind hier Dilgehäuse > gefragt? Es gäbe natürlich mit dem AT90CAN... schon ein paar ATmegas mit integriertem Controller, aber zu Laborzwecken mit Steckbrett haben wir erstmal die billigere Variante (atmega32 waren halt da und sja1000 is billig) bevorzugt. > Ohne mir jetzt den Code angeschaut zu haben, ist das JTag abgeschalten? > Liegt ja auf PortC. Ob der JTag abgeschaltet ist, weiß ich leider noch nicht genau, aber is ein guter Tipp, hab ich nicht dran gedacht. Ich werde nachschaun und berichten Gute Nacht erstmal, Haens
Also jetzt habe ich das JTag abgeschalten aber das Problem besteht weiterhin. Brauche eure Hilfe Gruß Haens
Hi, ohne es jetzt getestet zu haben mal schnell zusammengewürfelt. (Bin noch auf Arbeit)
1 | #include "avr/io.h" |
2 | |
3 | #define ALE 0
|
4 | #define RD 2
|
5 | #define WR 3
|
6 | #define INT 5
|
7 | |
8 | void Init_Port(void){ |
9 | // Datenport Eingang, sicher ist sicher
|
10 | DDRC = 0x00; |
11 | //Pullup an
|
12 | PORTC = 0xFF; |
13 | // ALE, RD, WR Ausgange
|
14 | DDRA |= ((1<<ALE)|(1<<RD)|(1<<WR)); |
15 | // INT Eingang
|
16 | DDRA &= (1<<INT); |
17 | // RD, WR High; Pullup INT ein
|
18 | PORTA = ((1<<RD)|1<<WR)|(1<<INT); |
19 | // ALE Low
|
20 | PORTA &= ~(1<<ALE); |
21 | }
|
22 | |
23 | void Canreg_Write(uint8_t Adresse, uint8_t Daten){ |
24 | DDRC = 0xFF; // PortC Ausgang |
25 | PORTC = Adresse; // Adresse ausgeben |
26 | PORTA |= (1<<ALE); // ALE Low |
27 | asm volatile ("nop"); |
28 | PORTA &= ~(1<<ALE); // ALE High |
29 | PORTC = Daten; // Daten ausgeben |
30 | PORTA &= ~(1<<WR); // WR Low |
31 | asm volatile ("nop"); |
32 | PORTA |= (1<<WR); // WR High |
33 | }
|
34 | |
35 | uint8_t Canreg_Read(uint8_t Adresse){ |
36 | DDRC = 0xFF; // PortC Ausgang |
37 | PORTC = Adresse; // Adresse ausgeben |
38 | PORTA |= (1<<ALE); // ALE Low |
39 | asm volatile ("nop"); |
40 | PORTA &= ~(1<<ALE); // ALE High |
41 | DDRC = 0x00; // PortC Eingang |
42 | PORTC = 0xFF; // Pullup an |
43 | PORTA &= ~(1<<RD); // RD Low |
44 | asm volatile ("nop"); |
45 | uint8_t Daten = PINC; // Daten lesen |
46 | PORTA |= (1<<RD); // RD High |
47 | return Daten; |
48 | }
|
49 | |
50 | int main(void){ |
51 | Init_Port(); |
52 | Canreg_Write(0x55, 0xAA); |
53 | Canreg_Read(0x55); |
54 | while(1){ |
55 | }
|
Gruß Rene
Noch einen Fehler entdeckt:
1 | void Init_Port(void){ |
2 | // Datenport Eingang, sicher ist sicher
|
3 | DDRC = 0x00; |
4 | //Pullup an
|
5 | PORTC = 0xFF; |
6 | // ALE, RD, WR Ausgange
|
7 | DDRA |= ((1<<ALE)|(1<<RD)|(1<<WR)); |
8 | // INT Eingang
|
9 | DDRA &= ~(1<<INT); |
10 | // RD, WR High; Pullup INT ein
|
11 | PORTA = ((1<<RD)|1<<WR)|(1<<INT); |
12 | // ALE Low
|
13 | PORTA &= ~(1<<ALE); |
14 | }
|
und der Modepin muss an 5V für Intelmode, denke ich. Bin gerade mal über das Datasheet drübergeflogen. Ist ein ziemlich alter Controller, alles ziemlich unübersichtlich finde ich. Meiner Meinung nach nimm lieber einen Atmega mit Can oder den MCP2515. Letzteren benutze ich selber und bin sehr zufrieden damit. Gruß Rene
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.