A6833 Ansteuerung?

Gast #653363
Hallo Leute...

Ich habe hier noch ein paar A6833 von Allegro rumzuliegen.

http://www.allegromicro.com/en/Products/Part_Numbers/6833/6833.pdf

Mit diesen würde ich gerne ein paar mehr LEDs ansteuern. Das ganze soll 
mit einem AVR in C geschehen. Allerdings werde ich aus dem Datenblatt 
leider überhaupt nicht schlau. Hat irgendjemand Erfahrungen mit diesem 
Chip oder Vorgängern? Oder gibt es gar irgendwo Code-Schnipsel die ich 
als Denk-Anstoß gebrauchen könnte??? Ich habe jedenfalls nichts 
gefunden.

MfG

Cha-Ko
Gast #653388
Naja, es ist das erste mal, dass ich so einen IC ansteuern will. Ich 
check so Avr technisch eingentlich alles, aber so richtig werd ich nich 
schlau, was ich wie senden muss...

Cha-Ko
Gast #653793
Das 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister 
hast du aber schon gesehen, oder?
Lies einfach nur den Text, wenn du Assembler nicht magst.
Der Allegro-Chip wird fast genauso angesteuert (Ich habs nicht 
ausprobiert, nur das datasheet gelesen), aber: output-enable ist 
high-active, und es sind nicht 8 sondern 32 Bit.
Also:
- such dir im AVR-Datasheet den SPI-Modus raus, der genauso aussieht, 
die das Allegro -diagramm.
- stell denn SPI-Takt auf unter 10MHz
- schieb 4 Bytes in das Register
- schalte den strobe kurz an
- OE kannst du erst mal mit Pull-Up an Vcc legen

hth. Jörg
Gast #656366
Ok, danke erstmal...

Ich habe jetzt mir jetzt SPI mal nen bisschen angeguckt und bin soweit 
wie im Anhang. SDI hängt an MOSI, Clock an SCK und Strobe an SS. Nur wie 
muss mein Programm jetzt erweitert werden, bzw. aussehen, damit z.B. 
jede zweite LED leuchtet.

Cha_Ko
Angehängte Dateien:
Gast #657124
Damit jede zweite LED leuchtet kannst du z.B. mal 0xAA in das Register 
laden (oder 0x55).
Du musst da nicht unbedingt ein Array benutzen, ein "unsigned long int", 
bzw. "uint32_t" geht ja auch. Aber wenn du das Array benutzt, musst du 
da irgendwann was reinschreiben:
1
// Array fuer die Daten 
2
unsigned char serpa[SERPA_SIZE] = {0xAA, 0xAA, 0xAA, 0xAA};
 ;)

Welchen Chip verwendest du eigentlich?

Ich hab da mal was zusammengetippt (im Anhang), aber ich hab keinen 
Compiler hier, also keine Garantie auf nichts ;)

hth. Jörg
Angehängte Dateien:
Gast #657281
>wird hier 0xAA in das register geladen?
Nein?! da wird 0xaa00550f in das 32Bit-schieberegister geladen - was dem 
Muster "0b10101010 00000000 01010101 00001111" entsprechen sollte (ob 
eine leuchtende LED die 1 oder die 0 ist, hängt davon ab, wie die LEDs 
angeschlossen sind).
Die Zahlendarstellung (dezimal, hexadezimal, binär,...) solltest du 
evtl. (noch-) mal nachlesen ;-)

hth. Jörg
Gast #657458
Ach man, ja is klar...seh schon den wald vor lauter bäumen nich mehr...
hmmm ich benutze den Atmega 32...SCK liegt an PB7, DATA In an PB5 und SS 
an PB4, richtig oder??? beim schreiben des uC kommt bei mir immer eine 
Fehlermeldung, wegen Kurzschlusses an SCK, da ja der Port auch an der 
ISP Schnittstelle liegt???
Wo liegt das Problem?
Gast #657461
Wenns die Teile hier irgendwo in SMD (tqfp zB) gäbe, dann würd ich mir 
paar zulegen, aber so werd ich weiterhin den guten alten 74hc595 einfach 
viermal nehmen..
Gast #657486
> wegen Kurzschlusses an SCK
Du bist sicher, dass da keiner ist ? ;)
Ansonsten: zur Sicherheit 1kOhm jeweils in MOSI und SCK zwischen AVR und 
Schieberegister, so dass ISP ohne Widerstände mit dem AVR verbunden ist.

hth. Jörg

ps.: und evtl. einen Pull-Down an die Strobe-Leitung, damit dei LEDs 
nicht flackern
Gast #657908
oh man:( also...alle verbindungen gecheckt, widerstände so wie du es 
gesagt hast, keine kurzschlüsse mehr, programmieren geht ohne probleme, 
aber es passiert rein garnichts:( bist du dir sicher, dass dein code so 
wie er is stimmt??? ich hab keine ahnung, wo der fehler noch sein 
könnte??? hab den code, so wie ich ihn jetzt in den avr schiebe nochmal 
angehängt.

vielen dank

Cha_Ko
Angehängte Dateien:
Gast #657986
Ich hatte die init-Einstellungen nicht nachgeprüft - ich dachte, das 
schaffst du auch allein ;) --
(Seite 4 - a6833 datasheet / seite 139 - Atmega32 Datasheet)
 Aber probier mal "SPI Mode 0":
1
void spi_init(void)
2
{
3
    SPIDDR = (1<<MOSI)|(1<<SCK);
4
    CSDDR = (1<<CS);
5
    SPIPORT = (1<<MISO);
6

7
    /*
8
     * SPI als Master
9
     * MSB zuerst 
10
     * SCK Ruhepegel ist im Datenblatt LOW!
11
    SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL);
12
     */
13
    //NEU: Mode 0, keine CPOL, kein CPHA
14
    SPCR = (1 << SPE) | (1 << MSTR);
15

16
    // Zur Sicherheit nur F_CPU /4
17
    // SPSR |= (1 << SPI2X);
18
}
Und bitte beschreibe (nächstes Mal?) genauer WAS alles nicht geht, was 
du erwartest, wie du misst, etc..

hth. Jörg
Gast #658016
naja, beim anlegen der power supply gehen einige leds mit an, jedoch 
jedesmal andere, ohne erkennbares muster oder system. zu erwarten wäre 
ja eigentlich, dass die ausgänge so geschaltet werden, wie sie sollen, 
oder?;)
Gast #658056
Dass direkt nach dem Power-On kurz Müll angezeigt wird, ist logisch, 
WENN du "Output Enable" auf High-Pegel gelegt hast, aber dann sollte der 
AVR da ein festes Muster reintakten(?).
- Die Leds sind korrekt angeschlossen? (Anode über Vorwiderstand an Vcc, 
leuchten bei logisch 0, wegen den Darlington-Ausgängen des A6833)
- Beide Chips haben gleiche Masse/Vcc?
- kannst du vielleicht mal "output enable" auch am AVR anschließen, und 
erst in  "main()" einschalten?
- Es gibt keine (Fehler-)Meldungen beim Compilieren?
- Hast du mal mit dem Muster gespielt? (mal 0x00 nehmen oder 0xffffffff 
etc..)

(evtl. merkst du, dass ich nur schwer Fehler in deiner Schaltung 
erkennen kann ;) )

hth. Jörg

ps.: der AVR funktioniert aber, oder?
Gast #658136
So, das mit OE hab ich getestet, immernoch das gleiche...auch eine 
Veränderung des Musters bringt nichts. den AVR hab ich nochmal mit 2 
anderen Programmen getestet, dort tut er was er soll.
So richtig habe ich das noch nicht mit dem SS verstanden...Dort wird 
nach der Übertragung ein kurzes Signal gesendet, sodass die Daten aus 
dem Latch in die Outs geschrieben werden, oder? Der Strich darüber 
bedeutet "negiert"??? hat das was zu bedeuten?
Gast #658176
Bring (bitte) nicht die verschiedenen Chips/Datenblätter durcheinander!
der A6833 hat weder \CS ("Zeh Ess quer")(btw. hat der garnicht), noch 
\OE noch \RCK.
 Alle Signale bei diesem Chip sind "active-high", d.h. die reagieren auf 
High-Pegel oder positive Flanke.

Wenn der SS-Pin vom AVR auf Eingang und SPI als Master eingestellt 
ist, (nur!) dann schaltet der AVR in den Slave-Modus, und bricht die 
SPI-Übertragung ab. Ist eine Falle, aber hier ist der SS-Pin ja ein 
Ausgang.

Warum hast du denn die Endlosschleife aus dem Code gelöscht ??? (seh' 
ich jetzt erst - in meinem Programm war doch eine drin)
Ich bin mir nicht sicher was der Compiler macht, wenn die main() zu Ende 
ist...

hth. Jörg
Gast #658187
DIe Endlosschleife hatte ich ausversehen draußen, aber im Code is sie 
noch drin auf dem AVR.
Aber CS ist doch SS, oder?? irgendwie komm ich durcheinander...also PB4 
vom AVR auf STROBE vom A6833, richtig?
Gast #658218
> Aber CS ist doch SS, oder?? irgendwie komm ich durcheinander...also PB4
> vom AVR auf STROBE vom A6833, richtig?

ja, das stimmt so
(es würde auch auf irgendeinem anderen Pin gehen, solange der SS Pin 
Ausgang ist  oder Eingang und highpegel hat).

hth. Jörg
Gast #658235
ich hab noch nen Tip bekommen:


""Die beiden ersten Anweisungen in der Funktion "spi_init(void)" 
schreiben in das gleiche Register. Damit machst du zuerst MOSI und SCK 
zu Ausgängen und anschliessend überschreibst du DDRB wieder, und in 
PORTB ist nur noch CS ein Ausgang...

Wieso schreibst du nicht einfach
"DDRB = (1<<SCK) | (1<<MOSI) | (1<<CS);" ? ""

geht aber auch nich, kann das trotzdem was sein?
Gast #658260
Ja, das ist ein Fehler :(
Da muss mindestens "CSDDR |= (1<<CS);" hin -- sry, mein Fehler

Hast du mal
a) alle 4 SPI-Modes (->CPOL, CPHA)
b) niedrigieren SPI-Takt
ausprobiert ?
und sicherheitshalber den Programmer abgesteckt?

? Jörg
Gast #658561
Hmmm eine Fehler gefunden:D

"while( !(SPSR & (1<<SPIF) ) );"
nicht
"while( !(SPCR & (1<<SPIF) ) );" !!!!


Danke nochmal für deine HILFE, echt super von dir:)

Danke Danke Danke;)

lg

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.