Forum: Mikrocontroller und Digitale Elektronik Atmega8: SPI und PWM/Timer?


von Philipp (Gast)


Lesenswert?

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

von Nico (nico123)


Lesenswert?

SPI, Timer und ADC sind völlig unabhängig voneinander!
Ich tippe auf einen Programmierfehler -> wir brauchen den Quellcode!

von Philipp (Gast)


Lesenswert?

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
}

von c-hater (Gast)


Lesenswert?

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

von Philipp (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?

von c-hater (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.