ATmega644 /64 SPI

Gast #309238
Lesenswert?

Hallo zusammen

ich versuche mit AVRStudio 4.12 und WinAVR bei einem ATmega644 das SPI
interface zum Ticken zu bekommen. Vorerst im Simulator. Jetzt stellt
sich aber das Problem ein, dass das SPI Masterbit sofort nach dem
setzen wieder gelöscht wird. /SS ist sowohl als Ausgang Konfiguriert
als auch "High".
Nun dachte ich mir, das liegt sicherlich an dem neuen ATmega644 und hab
deswegen auf den ATmega64 umgestellt. Ergebnist: Das gleiche.
Seltsamerweise funktioniert der Code, wenn ich auf einen ATmega32
stelle.
Hat irgendjemand eine Idee?

Hier der Code:

#include <avr/io.h>
#include <avr/interrupt.h>
#include "solar.h"

extern void init_LCD(void);

int main(void)
{
  int   i;
  char  c;

  // Port Initialisierung
  DDRA   = 0x00;
  DDRB   = 0x00;
  DDRC   = 0x00;
  DDRD   = 0x07;
  PORTA = 0x00;
  PORTB = 0x10;
  PORTC = 0x00;
  PORTD = 0x07;

  //SPI initialisierung
  //SPI Master, fosc/128
  DDRB   = (1<<PB5) | (1<<PB7) | (1<<PB4);
  PORTB = 0xB0;
  PRR0  = PRR0 & 0xFF^(1<<PRSPI);
  SPCR0  = (1<<SPE0) | (1<<MSTR0) | (1<<CPOL0) | (1<<CPHA0) |(1<<SPR01) 
|
(1<<SPR00);
  SPSR0  = (1<<SPI2X0);  // Hier ist MSTR schon wieder '0'

  init_LCD();

  while(1)
  {
  }

  return 0;
}
Gast #309240
Lesenswert?

Mann Super! Das ist genau das was ich erhofft habe zu bekommen. Wenn
euch die Antwort zu einfach ist, seid einfach still.

Ich bin der Meinung, dass ich die Doku gelesen habe. Was genau hab ich
denn übersehen?
Gast #309243
Lesenswert?

Hallo

@Stefan:
Danke für Deine Idee. Hat leider nicht geholfen. An den SPI-Pins tut
sich gar nichts. Ich werde noch mal weiter suchen. Hat jemand soch mal
unterschiede zwischen ATmega32 und ATmega64 bemerkt? Mit einem ATmega
32 funktioniert es nämlich.

@Werner
Ich hab ein paar Muster über einen Freund bekommen. Der IC ist aber
nach meinen Informationen voll in Produktion. Die 324 und 164 fehlen
noch.
#309244
Lesenswert?

@Frank?

Hast Du eine Debug-Möglichkeit oder brennst Du den mc nur auf
Verdacht?

Macht init_lcd() ev. Probleme - welche Ports benutzt die Funktion?

Welchen Pegel kannst Du an /SS messen? Wenn DU im Simulator arbeitest:
verifiziere, dass /SS asl Ausgang bzw. High geschaltet ist.

Wie steht das WCOL-Bit vor/nach dem Initialisieren? Ev. kann es was
bringen, das WCOL-Bit zurückzusetzen, z.B. mit:

volatile uint8_t dummy;
...
  SPCR0  = (1<<SPE0) | (1<<MSTR0) | (1<<CPOL0) |
           (1<<CPHA0) |(1<<SPR01) | (1<<SPR00);
  SPSR0  = (1<<SPI2X0);

  dummy  = SPSR;         // setzt WCOL-Bit zurück
  dummy =  SPDR;

  SPCR0  = (1<<SPE0) | (1<<MSTR0) | (1<<CPOL0) |
           (1<<CPHA0) |(1<<SPR01) | (1<<SPR00);
  SPSR0  = (1<<SPI2X0);


Viele Grüße, Stefan
Gast #309245
Lesenswert?

Hi!

Ich bin mir nicht ganz sicher ob es daran liegt, aber wenn ich mir die
Datenblätter ansehe liegen die SPI Pins beim 64er (PB 0 - 3) auf
anderen Ports als beim 32er (PB4-7).

Gruß

     Dirk
Gast #309247
Lesenswert?

Hallo zusammen.

Ich hab den Fehler! Es steckt doch nur im Simulator! Bei meinen
Versuchen mit dem realen IC muß ich einen anderen Fehler gemacht
haben.

Nun zu Fehler beschreibung. Es ist wahr, dass der ATmega644 eher zum
ATmega32 verwand ist. Der SPI Port ist beim 644 gleich dem vom 32er.
Jetzt haben die für den Simulator anscheinend den 64er zum Vorbild
genommen. Soll heißen /SS ist beim 644er auf PB4, beim 64er ist es PB0.
wenn ich in meinem Programm den PB0 auch als Ausgang schalte
funktioniert alles.
Dumme Sache. Hat viel Zeit gekostet.

Danke für eure Hilfe!!!!

Gruß
 Frank
Gast #309250
Lesenswert?

Hallo Stefan,

ich hab gestern schon ne Mail über den normalen Support-Kanal
geschickt. Fürs nächste Mal nehme ich dann den von Dir genannten. Den
kannte ich bisher noch nicht.

Gruß
 Frank

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren