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:
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
1 | int main(void) |
2 | {
|
3 | spi_init(); |
4 | set_a6833(0xaa00550fL); |
wird hier 0xAA in das register geladen?
>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 | 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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.