Forum: Mikrocontroller und Digitale Elektronik A6833 Ansteuerung?


von Cha_Ko (Gast)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

Hi

Und was verstehst du nicht?

MfG Spess

von Cha_Ko (Gast)


Lesenswert?

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

von Cha_Ko (Gast)


Lesenswert?

Keiner ne Ahnung von dem Teil???

von Jörg X. (Gast)


Lesenswert?

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

von Cha_Ko (Gast)


Angehängte Dateien:

Lesenswert?

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

von Cha_Ko (Gast)


Lesenswert?

Keiner der helfen kann???

von Jörg X. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Cha_Ko (Gast)


Lesenswert?

1
int main(void)
2
{
3
    spi_init();
4
    set_a6833(0xaa00550fL);

wird hier 0xAA in das register geladen?

von Jörg X. (Gast)


Lesenswert?

>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

von Cha_Ko (Gast)


Lesenswert?

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?

von Matthias L. (Gast)


Lesenswert?

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..

von Jörg X. (Gast)


Lesenswert?

> 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

von Cha_Ko (Gast)


Angehängte Dateien:

Lesenswert?

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

von Jörg X. (Gast)


Lesenswert?

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

von Cha_Ko (Gast)


Lesenswert?

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?;)

von Jörg X. (Gast)


Lesenswert?

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?

von Cha_Ko (Gast)


Lesenswert?

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?

von Jörg X. (Gast)


Lesenswert?

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

von Cha_Ko (Gast)


Lesenswert?

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?

von Jörg X. (Gast)


Lesenswert?

> 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

von Cha_Ko (Gast)


Lesenswert?

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?

von Jörg X. (Gast)


Lesenswert?

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

von Cha_Ko (Gast)


Lesenswert?

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

von Jörg X. (Gast)


Lesenswert?

> Hmmm eine Fehler gefunden
Oh Sh...! ;)

Geht's jetzt?

:-D Jörg

von Cha_Ko (Gast)


Lesenswert?

Jo, jetzt gehts;) danke nochmals

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.