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
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
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
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
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:
;)
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
>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
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?
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..
> 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
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
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
voidspi_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
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?;)
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?
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?
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
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?
> 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
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?
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