Hallo,
Für ein Projekt muss ich über einen digitalen Potentiometer AD5292
mittels eines ATmega32 ansteuern. Der ATmega32 beherrscht ja SPI, also
sollte das theoretisch möglich sein. Nur ich bekomme es einfach nicht
hin.
Zu meiner Entwicklungsumgebung für den ATmega32 gehört das Atmel
Evaluluationsboard V2.0.1. Dabei habe ich an dem Board alles unverändert
gelassen (auch Jumper drin gelassen), sodass ich die Ausgänge über JP4
rausführe. Programmieren tue ich mit Atmel Studio 6 sowie einen
ISP-Programmer mit STK500.
Die Entwicklungsumgebung funktioniert auch soweit, da ich dies schon mit
anderen Projekten erfolgreich getestet habe. Mir macht einfach die
Ansteuerung des AD5292 Kopfzerbrechen. Im Netz habe ich auch speziell zu
dieser Konfiguration nichts gefunden.
Mein Code sieht folgendermaßen aus:
1
#include<avr/io.h>
2
3
#define DDR_SPI DDRB
4
#define DD_MOSI DDB5
5
#define DD_SCK DDB7
6
#define DD_SS DDB4
7
8
voidSPI_INIT(void)
9
{
10
DDR_SPI|=(1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);// Set MOSI , SCK , and SS output
11
SPCR=((1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0));// Enable SPI, Master, set clock rate fck/128
12
}
13
14
voidSPI_DATA(chardata)
15
{
16
SPDR=data;// Send data
17
while(!(SPSR&(1<<SPIF))){;// Wait
18
19
}
20
}
21
22
intmain(void)
23
{
24
25
SPI_INIT();
26
PORTB=PORTB&0b11101111;// SS low
27
SPI_DATA(0b00011000);// Command #6
28
SPI_DATA(0b00000011);
29
SPI_DATA(0b00000110);// Command #1
30
SPI_DATA(0b00000000);
31
PORTB=PORTB|0b00010000;// SS high
32
33
while(1)
34
{
35
36
}
37
}
Also über SS, MOSI und SCK werden auf jeden Fall Signale rausgesendet.
Nur am Widerstand des Potentiometers ändert sich nichts. Eigentlich
müsste ich auch alles richtig verdrahtet haben.
Da ich das Projekt recht zügig fertigkriegen muss, wäre ich über jede
erdenkliche Hilfestellung sehr dankbar. Eventuell haben auch andere
Leute dasselbe Problem.
Vielen Dank im Vorraus!
Mit freundlichen Grüßen,
Cheng L.
Hey,
schon Mal probiert die <spi.h> einzubinden?
Dann würde ich gern wissen wollen, woher du weißt, dass auch die
richtigen Bits zur richtigen Zeit ankommen? Hast du ein Oszi da?
Lad´ mal bitte der Einfachheit halber den Schaltplan µC-DigPoti hoch.
MfG
guest111
Hallo,
Danke für deine hilfreiche Antwort!
Ich habe den Teil µC-DigPoti als Bild hochgeladen. Im Schaltplan steht
noch Mega8, weil ich das später mal verwenden möchte. Eigentlich sollte
ja richtig angeschlossen sein:
PB2 (SS) --> SYNC
PB4 (MISO) --> DIN
PB (SCK) --> SCLK
Ich werde das mal mit der <spi.h> ausprobieren.
Ansonsten weiss ich, dass ISP und SPI sich behindern, jedoch habe ich
zuerst das DigiPoti nicht angeschlossen, um per ISP das Programm in den
µC zu laden. Anschließend erst die SPI Pins belegt.
Gibt es zu dieser Konfiguration irgendwelche fertigen Code Beispiele?
Auf weitere hilfreiche Antworten würde ich mich sehr freuen.
Viele Grüße,
Cheng L.
Cheng L. schrieb:> Ansonsten weiss ich, dass ISP und SPI sich behindern,
Dann hast Du da noch einen Fehler. ISP ist nur aktiv wenn Reset low ist.
dann sollte der AD5292 hochohmig auf dem SPI sein, dessen Reset auch low
sollte helfen.
Danke für deinen Tipp.
Du meinst also, ich sollte den Reset des AD5292 auch mit den µC
verbinden und diesen auf low setzen, wenn das Programm schon per ISP auf
den µC geladen ist?
Also deine Schaltung kann man ja echt vergessen. Dort kann ich nix
erkennen, weil A) alle Leiterzüge kreuz und quer gehen
und B) nur ein Teil der Schaltung zu erkennen ist.
Nichtsdestotrotz...warum übergibst du der Funktion spi_transmit_sync()
denn die Datenlänge 1Bit?? Du willst doch 1Byte haben also 8Bit.
Schau dir bitte noch mal genau Seite 9 und Seite 22 an. Auf Seite 9 ist
auch ein schönes Beispiel, wie man Daten schreibt (Figure 3). Dazu musst
du das RESET Pin eigentlich nicht beachten, weil das nur für das Löschen
des RDAC Registers genutzt wird. Aber du kannst es auch einfach
überschreiben.
Ach...und wenn du den Widerstand des Potis ändern möchtest, musst du
nach Zeile 2 der Tabelle 11 auf Seite 22 vorgehen.
Nur so nebenbei PORTB = PORTB & 11... ist vom Stil her Quatsch. Eher
PORTB=11...
MfG
guest111
guest111 schrieb:> Also deine Schaltung kann man ja echt vergessen. Dort kann ich nix> erkennen, weil A) alle Leiterzüge kreuz und quer gehen> und B) nur ein Teil der Schaltung zu erkennen ist.>> Nichtsdestotrotz...warum übergibst du der Funktion spi_transmit_sync()> denn die Datenlänge 1Bit?? Du willst doch 1Byte haben also 8Bit.> Schau dir bitte noch mal genau Seite 9 und Seite 22 an. Auf Seite 9 ist> auch ein schönes Beispiel, wie man Daten schreibt (Figure 3). Dazu musst> du das RESET Pin eigentlich nicht beachten, weil das nur für das Löschen> des RDAC Registers genutzt wird. Aber du kannst es auch einfach> überschreiben.> Ach...und wenn du den Widerstand des Potis ändern möchtest, musst du> nach Zeile 2 der Tabelle 11 auf Seite 22 vorgehen.>> Nur so nebenbei PORTB = PORTB & 11... ist vom Stil her Quatsch. Eher> PORTB=11...>> MfG> guest111
Ja, du hast recht, dass meine Schaltung ziemlich unübersichtlich ist. Es
hat aber auch Gründe, deshalb gebe ich eben nur den relevanten Teil
preis. Generell sollte ich alles richtig angeschlossen haben:
SS (PB4) beim Atmega32 --> Pin 13 auf J4 des Eva-Boards --> SYNC (Pin
12) beim AD5292
MOSI (PB5) beim Atmega32 --> Pin 14 auf J4 des Eva-Boards --> DIN (Pin
10) beim AD5292
SCK (PB7) beim Atmega32 --> Pin 16 auf J4 des Eva-Boards --> SCLK (Pin
11) beim AD5292
Mein C Code habe ich auch etwas abgeändert. Dabei habe ich mir das
Timing Diagram von Seite 9 genauer angeschaut. Anfangs braucht man wohl
eine fallende Flanke beim SYNC, um den Datentransfer zu aktivieren. Auf
Seite 23 gibt es eine kleine Tabelle, die besagt, dass zuerst 0x1803
geschrieben werden muss, damit der Chip überhaupt die Wiper-Position
updaten kann. Anschließend habe ich kann ich erst Befehle #1 von Seite
22 einschleusen (ich habe beispielsweise 0x0500 geschrieben. Jedoch
klappt es weiterhin nicht, per DMM messe ich immer noch 10 KOhm, also
der Wiper befindet sich immer noch in der Mitte.
Hier mein C Code:
Um mir solche Muehsale zu ersparen nehm ich fuer zeitunkritische
Trivialitaeten jeweils einen Soft SPI, und bilde das vom Datenblatt
verlangte timing einfach ueber die oroginalen SPI Portpins nach. Das hat
man in 5 minuten erledigt.
Siebzehn mal Fuenfzehn schrieb:> Um mir solche Muehsale zu ersparen nehm ich fuer zeitunkritische> Trivialitaeten jeweils einen Soft SPI, und bilde das vom Datenblatt> verlangte timing einfach ueber die oroginalen SPI Portpins nach. Das hat> man in 5 minuten erledigt.
Okay, und wie würdest du es dann machen?
dummy schrieb:> // SS high> PORTB = 0b00001000;>> Dort wird PB3 auf High gezogen. SS ist aber PB4.
Danke, dass du in meinem Code einen Fehler gefunden hast, aber es geht
leider immer noch nicht...
Hast du denn nicht mal die Möglichkeit deine Bits zu überprüfen? Das
macht es doch alles einfacher! Erst, wenn du sicher weist, dass die Bits
an der richtigen Stelle ankommmen, kannst du verzweifeln :)
MfG
guest111
> ..Okay, und wie würdest du es dann machen?
Naja, im Datenblatt steht ja das timing, welche Signale sich wie zu
verhalten haben. Das macht man dann eben genau so.
PORTB,4 = 1 usw.