Forum: Mikrocontroller und Digitale Elektronik SJA1000 und ATmega32A


von Johannes M. (haens)


Angehängte Dateien:

Lesenswert?

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

von Rene Z. (rzimmermann)


Lesenswert?

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

von Johannes M. (haens)


Lesenswert?

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

von Johannes M. (haens)


Lesenswert?

Also jetzt habe ich das JTag abgeschalten aber das Problem besteht 
weiterhin.

Brauche eure Hilfe

Gruß
Haens

von Rene Zimmermann (Gast)


Lesenswert?

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

von Rene Z. (rzimmermann)


Lesenswert?

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
Noch kein Account? Hier anmelden.