Hi zusammen! Ich brauche für ein Projekt sowohl die SPI Schnittstelle im Mastermodus(AD Wandler) als auch einen PWM Ausgang des Atmega8. Die SPI Kommunikation funktioniert soweit wunderbar. Nun möchte ich den Timer 1 nutzen um ein PWM Signal auszugeben, dieser hat ja, wenn ich das richtig verstehe, 2 Ausgänge mit jeweils seperat einstellbarem "compare match": OC1A und OC1B. Nun ist der OC1B Ausgang auch gleichzeitig der SS Ausgang/Eingang der SPI Schnittstelle. Den Slave Select Eingang des Slaves habe ich schon extra auf einen anderen Port gelegt (PB0), OC1A und OC1B sind also unbelegt. Wenn ich nun die Schnittstelle und den Timer gleichzeitig nutze, wird die Temperatur, die mir der AD Wandler ausgibt, in kurzen, unregelmäßigen Abständen mehrstellig, es kommen also komplett falsche Werte an. Ohne Initialiesierung des Timers als PWM Quelle besteht das Problem nicht. Folgendes habe ich schon probiert: - Slave Select des Masters als Ausgang konfigurieren und unbelegt lassen -Slave Select des Masters als Eingang konfigurieren und mit PullUp versehen um im Mastermode zu bleiben beides ohne Erfolg. Meint ihr Timer und SPI vertragen sich grundsätzlich nicht? Gerne poste ich später auch die relevanten Teile des C-Codes, wenn gewünscht. Gruß, Philipp
SPI, Timer und ADC sind völlig unabhängig voneinander! Ich tippe auf einen Programmierfehler -> wir brauchen den Quellcode!
Hier der Code für die PWM Initialisierung:
1 | void initPWM(void) |
2 | {
|
3 | DDRB |= (1<<PB1); |
4 | TCCR1A = (1<<WGM10)|(1<<COM1A1); |
5 | TCCR1B = (1<<WGM12)|(0<<CS12)|(1<<CS10); |
6 | }
|
Und hier meine Funktion für die SPI Schnittstelle:
1 | uint64_t getAD(void) //Returns value from ADC |
2 | {
|
3 | uint64_t tmp=0; |
4 | char dummy=0xFF; |
5 | PORTB &= ~(1<<PB0); |
6 | |
7 | while(PINB & (1<<PB4)); |
8 | |
9 | SPDR=dummy; |
10 | while (!(SPSR & (1<<SPIF))); |
11 | tmp= 0x0 | SPDR; |
12 | tmp=(tmp<<8); |
13 | |
14 | SPDR=dummy; |
15 | while (!(SPSR & (1<<SPIF))); |
16 | tmp=tmp | SPDR; |
17 | tmp=(tmp<<8); |
18 | |
19 | SPDR=dummy; |
20 | while (!(SPSR & (1<<SPIF))); |
21 | tmp=tmp | SPDR; |
22 | |
23 | |
24 | PORTB |= (1<<PB0); |
25 | tmp= tmp & 0xFFFFC; |
26 | tmp= (tmp>>2); |
27 | |
28 | return tmp; |
29 | }
|
Philipp schrieb: > Ich brauche für ein Projekt sowohl die SPI Schnittstelle im > Mastermodus(AD Wandler) als auch einen PWM Ausgang des Atmega8. Wieso muß es denn unbedingt dieser, eher historisch relevante Chip sein? Aber egal, das war nur ein Gedanke von mir, der mit der Sache eigentlich rein garnix zu tun hat. > Nun möchte ich den Timer 1 nutzen um ein PWM Signal auszugeben, dieser > hat ja, wenn ich das richtig verstehe, 2 Ausgänge mit jeweils seperat > einstellbarem "compare match": OC1A und OC1B. Ja. > Nun ist der OC1B Ausgang auch gleichzeitig der SS Ausgang/Eingang der > SPI Schnittstelle. Das ist aber kein Problem. Denn: SPI als Master erlaubt grundsätzlich die beliebige Konfiguration des SS-Pins, im konkreten Fall wäre natürlich die Konfiguration als Output zu wählen. In diesem Fall interesiert sich SPI nicht weiter für diesen Pin oder irgendwas, was daran passiert, er agiert als reiner GPO-Pin. Und wird in dieser Eigenschaft dann durch die (hoffentlich korrekte) Konfiguration des Timers auch gleich wieder ausgehebelt, insofern als das DDR-Bit "1" ist und der Timer deshalb seinen OC-Output bereitwillig als "override" an den Pin ausgibt. > Den Slave Select Eingang des Slaves habe ich schon extra auf einen > anderen Port gelegt Das ist natürlich zwingend nötig und hast du ja auch richtig gemacht. > beides ohne Erfolg. Meint ihr Timer und SPI vertragen sich grundsätzlich > nicht? Nein. Die können definitiv miteinander, wenn man sie korrekt programmiert. > Gerne poste ich später auch die relevanten Teile des C-Codes, wenn > gewünscht. Wenn du selber den Fehler nicht finden kannst, wird das wohl die einzig verbleibende Option sein: ihn dir von anderen zeigen zu lassen... Das tatsächliche Problem wird aber vermutlich auf ganz anderer Ebene liegen...
Danke für die hilfreiche Antwort erstmal, c-hater. Den Code habe ich übrigens schon vor deinem Post gepostet. Bisher habe ich die Fehler eigentlich immer selber gefunden und meine Frage war zunächst ja auch nur ob die sich grundsätzlich vertragen und der SS Pin im Mastermode so unabhängig ist wie du nun sagst. Dein letzter Satz ist hoffentlich nicht so gemeint wie ich ihn verstehe.
Philipp schrieb: > Danke für die hilfreiche Antwort erstmal, c-hater. Den Code habe ich > übrigens schon vor deinem Post gepostet. Du solltest mal ernsthaft über die Probleme und Erscheinungen nachdenken, die asynchrone Kommunikation inhärent mit sich bringt bzw. bringen kann... Wenn du das kapiert hast, bin ich wieder geneigt, weiter auf dein konkretes Problem einzugehen, dann eben auf den mittlerweile auch für mich verfügbaren Quelltext. Aber wohl nicht mehr heute.
c-hater schrieb: > Du solltest mal ernsthaft über die Probleme und Erscheinungen > nachdenken, die asynchrone Kommunikation inhärent mit sich bringt bzw. > bringen kann... Nur das SPI keine asynchrone Kommunikation ist, sondern eine synchrone @Phillip dokumentiert ist nichts, dass es da einen Fehler gäbe. Von daher ist das beschriebene Verhalten seltsam. Bist du sicher, dass du nicht an anderer Stelle einen Programmfehler hast, der sich nur zufällig nicht als Symptom auswirkt, wenn du die PWM deaktivierst? was machst du mit der PWM? Ist es möglich, dass die PWM elektromagnetisch auf die MOSI Leitung einkoppelt?
Karl H. schrieb: > c-hater schrieb: > >> Du solltest mal ernsthaft über die Probleme und Erscheinungen >> nachdenken, die asynchrone Kommunikation inhärent mit sich bringt bzw. >> bringen kann... > > Nur das SPI keine asynchrone Kommunikation ist, sondern eine synchrone Ich meinte natürlich auch nicht die SPI-Kommunikation, sondern die Kommunikation über Webforen. Sehr seltsam, dass du das nicht erkennen konntest... Oder bist du etwa ein BOT, der die immer gleichen Inhalte auf bestimmte Stichworte hin abspult... Fragen über Fragen...
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.