Gleich mehrfach ins Knie geschossen

OP #1531751
Lesenswert?

Hi,

ich hab in meinem jugendlichen Leichtsinn für die anhängende Schaltung 
gleich ne Platine machen lassen.

Bei der Inbetriebname musste ich jetzt feststellen, dass ich mir gleich 
mehrfach ins Knie geschossen habe.

Ich dachte, dass ich den Reset-Pin als Ausgang verwenden könnte, wusste 
aber nicht, dass dann ISP nicht mehr geht.

Ok, dachte ich nun, keine Katastrophe, ich kann ja den CS des 
LED-Kontrollers einfach an POWERON hängen, da ich ja sonst kein 
SPI-Device verwende. Beim genaueren Studium des Datenblatts des 
Kontrollers (Seite 8) lese ich un, dass das CSN Signal nicht einfach als 
CS dient, sondern zu einem bestimmten Zeitpunkt gesetzt werden muss, da 
der Kontroller sonst die Werte gar nicht übernimmt wenn ich das richtig 
verstehe.

D.h. ich brauche defintiv ein getrenntes CSN dass den Controller zu 
Datenübernahme bewegt.

Ich sehe jetzt folgende Möglickeiten:

1. Einen Bootloader zu verwenden und ein Serieles Kabel anlöten, was mir 
eigentlich nicht ganz so gefällt, zumal das Programmieren per ISP doch 
ganz komfortabel ist.

2. Ich schließe den MISO Pin nicht an den LED-Controller (ausgelesen 
kann sowieso nichts werden) sondern verbinde den MISO des AVRs mit dem 
CSN und dann folgendes Vorgehen um neue Werte zu setzen:

1. SPI Interface aktivieren
2. Daten an LED-Controller schicken
3. SPI Interface ausschalten und PB1 wieder als Ausgang schalten und 
damit das CSN-Signal geben

Meint Ihr das könnte funktionieren? Oder hab ich das mit dem CSN Signal 
falsch verstanden und kann es einfach die ganze Zeit auf High setzen?

Gruß

Tom
Angehängte Dateien:
Gast #1531770
Lesenswert?

Warum hängst du ihn nicht um auf PB1,
selbst PB3 könnte gehen, es gibt nur Knackser im Piezo.


[AustriaMicroSystems]
Toole Firma, Datenblatt nicht downloadbar, tja, wenn man keine Kunden 
will und pleite gehen will, überlässt man das Geschäft denjenigen, die 
es besser können.
Gast #1531771
Lesenswert?

Hardware-SPI nicht verwenden und den AS1106 einfach durch passendes, 
softwareerzeugtes Pingewackel ansteuern? Ist ja mit ein paar simplen 
Zeilen Code erledigt. Dann hast Du völlige Wahlfreiheit bei den Pins.
OP #1531778
Lesenswert?

Gastofatz schrieb:
> Hardware-SPI nicht verwenden und den AS1106 einfach durch passendes,
> softwareerzeugtes Pingewackel ansteuern? Ist ja mit ein paar simplen
> Zeilen Code erledigt. Dann hast Du völlige Wahlfreiheit bei den Pins.

Stimmt, das war die dritte Möglichkeit, hatte ich oben völlg vergessen.
Ist dass nicht wegen des Timmings für das CLK Signal etwas aufwendig? 
Hab ich bisher noch nie gemacht.

Gruß
Tom
Gast #1531785
Lesenswert?

Wiewaswo? Der Baustein übernimmt den Zustand auf der Data-Leitung, wenn 
auf der Clock-Leitung ne L-H-Flanke auftritt (nennt sich "synchrone 
Übertragung"). Wie gleich- oder ungleichmäßig diese Flanken kommen, 
interessiert niemand. Daher ist das Timing ausgesprochen UNkritisch. Das 
ist sozusagen der Gegenwert, den Du für die Clockleitung bekommst 
(asynchrone Übertragung: nur eine Leitung, aber dafür genau 
einzuhaltendes Timing).
OP #1532118
Lesenswert?

MaWin schrieb:
> Du musst doch nur nach dem Aussenden der 16 bit per SPI ein mal PB1 oder
> PB3 togglen

Ich denke ich kann PB1 nicht als IO verwenden wenn SPI aktiv ist, wie 
soll ich dass dann schalten?

PB3 will ich nicht, da ich nicht den Beeper unabhängig halten will.

Also von Hand :-)


[AustriaMicroSystems]
Ich hatte den Controller zufällig bei RS gefunden, da ich mir nicht 
sicher war ob MAXIM mir die Samples wirklich schickt (jetzt hab ich hier 
gleich 4 rumliegen)

Hab mich auf der Webseite von AustriaMicroSystems mal etwas umgeschaut, 
die haben ja ganz interessante Sachen, unter anderem einen ARM9 µC mit 
SD-Card Interface

Gruß
Tom
OP #1532494
Lesenswert?

void writeCommand(uint16_t toSend)
{
  uint16_t mask  = 1 << 15;

  for(int i = 0; i<16; i++)
  {
    if (toSend & mask)
    {
      PORTB |= (1<<MOSI);
    }
    else
    {
      PORTB &= ~(1<<MOSI);
    }
    _delay_us(10);

    PORTB |= (1<<SCL);
    _delay_us(10);
    PORTB &= ~(1<<SCL);
    mask = mask >>1;
  }
  PORTB |= (1<<LOAD);
  _delay_us(10);
  PORTB &= ~(1<LOAD);
}

:-)

Tom

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