mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SJA1000 und ATmega32A


Autor: Johannes M. (haens)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rene Zimmermann (rzimmermann)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (haens)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (haens)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also jetzt habe ich das JTag abgeschalten aber das Problem besteht 
weiterhin.

Brauche eure Hilfe

Gruß
Haens

Autor: Rene Zimmermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ohne es jetzt getestet zu haben mal schnell zusammengewürfelt. (Bin 
noch auf Arbeit)
#include "avr/io.h"

#define ALE 0
#define RD  2
#define WR  3
#define INT 5

void Init_Port(void){
  // Datenport Eingang, sicher ist sicher
  DDRC = 0x00;
  //Pullup an
  PORTC = 0xFF;
  // ALE, RD, WR Ausgange
  DDRA |= ((1<<ALE)|(1<<RD)|(1<<WR));
  // INT Eingang
  DDRA &= (1<<INT);
  // RD, WR High; Pullup INT ein
  PORTA = ((1<<RD)|1<<WR)|(1<<INT);
  // ALE Low
  PORTA &= ~(1<<ALE);
}

void Canreg_Write(uint8_t Adresse, uint8_t Daten){
  DDRC = 0xFF;      // PortC Ausgang
  PORTC = Adresse;    // Adresse ausgeben
  PORTA |= (1<<ALE);     // ALE Low
  asm volatile ("nop");
  PORTA &= ~(1<<ALE);   // ALE High  
  PORTC = Daten;      // Daten ausgeben
  PORTA &= ~(1<<WR);     // WR Low
  asm volatile ("nop");
  PORTA |= (1<<WR);    // WR High
}

uint8_t Canreg_Read(uint8_t Adresse){
  DDRC = 0xFF;      // PortC Ausgang
  PORTC = Adresse;    // Adresse ausgeben
  PORTA |= (1<<ALE);     // ALE Low
  asm volatile ("nop");
  PORTA &= ~(1<<ALE);   // ALE High  
  DDRC = 0x00;      // PortC Eingang
  PORTC = 0xFF;      // Pullup an
  PORTA &= ~(1<<RD);     // RD Low
  asm volatile ("nop");
  uint8_t Daten = PINC;  // Daten lesen
  PORTA |= (1<<RD);    // RD High
  return Daten;
}

int main(void){
  Init_Port();
  Canreg_Write(0x55, 0xAA);
  Canreg_Read(0x55);
  while(1){
}

Gruß Rene

Autor: Rene Zimmermann (rzimmermann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch einen Fehler entdeckt:
void Init_Port(void){
  // Datenport Eingang, sicher ist sicher
  DDRC = 0x00;
  //Pullup an
  PORTC = 0xFF;
  // ALE, RD, WR Ausgange
  DDRA |= ((1<<ALE)|(1<<RD)|(1<<WR));
  // INT Eingang
  DDRA &= ~(1<<INT);
  // RD, WR High; Pullup INT ein
  PORTA = ((1<<RD)|1<<WR)|(1<<INT);
  // ALE Low
  PORTA &= ~(1<<ALE);
}

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.