Forum: Mikrocontroller und Digitale Elektronik PWM an SPI-Pin


von Sam .. (sam1994)


Lesenswert?

Hi

Ich möchte den Attiny25 als SPI-Slave benutzen. Ich brauche aber 
gleichzeitig beide Highspeed-PWM Kanäle. D.h ich müsste mein 2. PWM an 
DO ausgeben. Da der Slave sowieso nur empfängt ist das auch kein 
Problem. Die Frage ist nur ob mir das SPI dazwischenfunken wird. Welche 
HW hat höhere Priorität: SPI oder PWM?

von Timmo H. (masterfx)


Lesenswert?

Müsste es nicht eigentlich reichen, wenn du ihn im Two-Wire mode 
betreibst? Dann ist DI (bzw. SDA) bidirektional und DO wird nicht 
verwendet.

von holger (Gast)


Lesenswert?

>Welche HW hat höhere Priorität: SPI oder PWM?

Probiers doch einfach aus.

von Sam .. (sam1994)


Lesenswert?

Timmo H. schrieb:
> Müsste es nicht eigentlich reichen, wenn du ihn im Two-Wire mode
> betreibst? Dann ist DI (bzw. SDA) bidirektional und DO wird nicht
> verwendet.
Das Problem dabei ist, dass der andere Avr kein HW-I2C hat und softI2C 
zu lange dauert.

von Timmo H. (masterfx)


Lesenswert?

Samuel K. schrieb:
> Das Problem dabei ist, dass der andere Avr kein HW-I2C hat und softI2C
> zu lange dauert.
Ja aber es geht hier doch um SPI. Und wenn du nur 2-Wire aktivierst 
arbeitet er doch quasi genauso mit dem Unterschied dass du SDA nur bei 
bedarf als Ausgang setzt.
Damit wäre dein benötigter DO immer frei.

von Sam .. (sam1994)


Lesenswert?

Timmo H. schrieb:
> Ja aber es geht hier doch um SPI. Und wenn du nur 2-Wire aktivierst
> arbeitet er doch quasi genauso mit dem Unterschied dass du SDA nur bei
> bedarf als Ausgang setzt.
> Damit wäre dein benötigter DO immer frei.

Ok, da lag ich falsch. Trotzdem bin ich ziemlich verunsichert durch 
USIWM0/1:

Ich müsste 10 auswählen:
1
Two-wire mode. Uses SDA (DI) and SCL (USCK) pins 
2
(1)
3
.
4
The Serial Data (SDA) and the Serial Clock (SCL) pins are bi-directional and use open-
5
collector output drives. The output drivers are enabled by setting the corresponding bit for 
6
SDA and SCL in the DDRB register.
7
When the output driver is enabled for the SDA pin it will force the line SDA low if the output 
8
of the USI Data Register or the corresponding bit in the PORTB register is zero. 
9
Otherwise, the SDA line will not be driven (i.e., it is released). When the SCL pin output 
10
driver is enabled the SCL line will be forced low if the corresponding bit in the PORTB 
11
register is zero, or by the start detector. Otherwise the SCL line will not be driven.
12
The SCL line is held low when a start detector detects a start condition and the output is 
13
enabled. Clearing the Start Condition Flag (USISIF) releases the line. The SDA and SCL 
14
pin inputs is not affected by enabling this mode. Pull-ups on the SDA and SCL port pin are 
15
disabled in Two-wire mode.

Hier wird die ganze Zeit von Startsignal (im Sinne I2C/TWI) geredet. Ist 
das ganze wirklich nur per Software geregelt und nicht zwingend?

Das hieße folgende Init würde reichen:
1
//       2Wire-Mode | Clksource: Ext. (Positiv Edge)
2
USICR = (1 << USIWM1) | (1 << USICS1);

von holger (Gast)


Lesenswert?

>>Welche HW hat höhere Priorität: SPI oder PWM?
>
>Probiers doch einfach aus.

Hast du das immer noch nicht gemacht? Das sind
zehn Zeilen Code und das Thema könnte beendet sein.

von Timmo H. (masterfx)


Lesenswert?

holger schrieb:
> Hast du das immer noch nicht gemacht? Das sind
> zehn Zeilen Code und das Thema könnte beendet sein.
Das wäre doch viel zu einfach ;) Hätte ich das Problem gehabt hätte ich 
erstmal 1 Minute Arbeit investiert um es einfach auszuprobieren, zumal 
es einen viel größeren Lerneffekt hat.

von Sam .. (sam1994)


Lesenswert?

Timmo H. schrieb:
> Das wäre doch viel zu einfach ;) Hätte ich das Problem gehabt hätte ich
> erstmal 1 Minute Arbeit investiert um es einfach auszuprobieren, zumal
> es einen viel größeren Lerneffekt hat.

Ihr seid ja mal wieder lustig. Dich will ich das in einer Minute erstmal 
machen sehen. Und keine Sorge: Lerneffekt für mich wird es noch genug 
geben.

Ich bin übrigens gerade dabei das Programm zu schreiben. Nur weiß ich 
nicht alle Register auswendig. Dazu kommen noch ein paar 
Unverständlichkeiten aus dem Datenblatt usw. z.B. Warum gibt es ein PWM 
und ein CTC bit. Anscheinend erfüllen beide aber dieselbe Funktion: Der 
Zähler wird beim Compare Match zurückgesetzt. Das ganze sollte zudem in 
Assembler geschrieben sein, da ich dem C-Compiler bei zeitkritischen 
Sachen nicht über den Weg traue und er seine Eigenheiten hat wie z.B 
Stackpointer initialisieren, was ich hier überhaupt nicht gebrauchen 
kann, da ich gerne einen 128Byte Buffer hätte.

von holger (Gast)


Lesenswert?

>Das ganze sollte zudem in
>Assembler geschrieben sein, da ich dem C-Compiler bei zeitkritischen
>Sachen nicht über den Weg traue und er seine Eigenheiten hat wie z.B
>Stackpointer initialisieren, was ich hier überhaupt nicht gebrauchen
>kann, da ich gerne einen 128Byte Buffer hätte.

Du kannst hier ruhig noch weiter dummes Zeug labern.
Die Zeit zum schreiben eines einfachen Testprogramms
das nicht zeitkritisch ist ist schon längst abgelaufen.

SPI Modul auf Slave initialisieren, muss ja keine Übertragung 
stattfinden.
Nuffer? Scheißegal! PWM initialisieren. Nachsehen ob PWM aus Pin kommt, 
und fettig.Wo ist da das Problem?

von holger (Gast)


Lesenswert?

>Nuffer?

Upps. Muss das N nun unbedingt so dicht neben dem B sein;)

von Timmo H. (masterfx)


Lesenswert?

Samuel K. schrieb:
> Ihr seid ja mal wieder lustig. Dich will ich das in einer Minute erstmal
> machen sehen. Und keine Sorge: Lerneffekt für mich wird es noch genug
> geben.
Ich lass mir nicht so gerne dabei zugucken ;)
Aber viel mehr als 1 Minute wirds nicht sein...sind doch nur ein paar 
Register/Bits die da mitspielen... selbst wenn es 30 Minuten bei dir 
gedauert hätte...19:43 (erster Post) und jetzt (22:51) hätte mit 
Sicherheit gereicht. Und bisher bist du halt noch kein Stück schlauer, 
was du aber beim selbst ausprobieren gewesen wärst.

Sicherlich gibts ein paar Leute die schonmal das gleiche Problem hatten, 
nur schauen die halt nicht unbedingt jede Minute hier ins Forum.

von Sam .. (sam1994)


Lesenswert?

holger schrieb:
>>Das ganze sollte zudem in
>>Assembler geschrieben sein, da ich dem C-Compiler bei zeitkritischen
>>Sachen nicht über den Weg traue und er seine Eigenheiten hat wie z.B
>>Stackpointer initialisieren, was ich hier überhaupt nicht gebrauchen
>>kann, da ich gerne einen 128Byte Buffer hätte.
>
> Du kannst hier ruhig noch weiter dummes Zeug labern.
> Die Zeit zum schreiben eines einfachen Testprogramms
> das nicht zeitkritisch ist ist schon längst abgelaufen.

Genauso kannst du dich mal ein bisschen zurückhalten und nicht gleich so 
genervt reagieren. Ist schließlich nicht dein Problem. Und Dummes Zeug 
war es bestimmt nicht!

Da das ganze jetzt doch geklärt ist, werde ich nicht nur eine kleine 
Testsoftware schreiben, sondern gleich das vollständige Programm.

Timmo H. schrieb:
> Aber viel mehr als 1 Minute wirds nicht sein...sind doch nur ein paar
> Register/Bits die da mitspielen...

Bei mir ist das längste das Register nachschlagen - das kann schon mal 
mehrere Minuten gehen, wenn man sich einen ganzen Abschnitt im 
Datenblatt durchlesen muss.

von Timmo H. (masterfx)


Lesenswert?

Samuel K. schrieb:
> Bei mir ist das längste das Register nachschlagen - das kann schon mal
> mehrere Minuten gehen, wenn man sich einen ganzen Abschnitt im
> Datenblatt durchlesen muss.
Ist am Anfang immer so (auch bei mir), aber in fast 3 Stunden hätte man 
das schaffen können. Ist ja bei Tiny nur ne Hand voll Seiten und beim 
nächsten mal gehts ja auch schneller. SPI im TWI sind nur zwei Bits und 
PWM hast du ja schon...?!

von Sam .. (sam1994)


Lesenswert?

Timmo H. schrieb:
> Ist am Anfang immer so (auch bei mir), aber in fast 3 Stunden hätte man
> das schaffen können. Ist ja bei Tiny nur ne Hand voll Seiten und beim
> nächsten mal gehts ja auch schneller. SPI im TWI sind nur zwei Bits und
> PWM hast du ja schon...?!

Die Konfiguration hab ich schon länger (beim PWM sind es nur COMxx + PWM 
-bits), nur nicht getestet, da ich die Schaltung noch nicht aufgebaut 
habe. Mich verwirrt gerade eher das Feature "Data received interrupt" 
vom USI und die Tatsache, dass es nur 2 Interrupts gibt: USI_START und 
USI_OVF, wobei nur START in Frage kommt. Bei TWI wäre das ja schön und 
gut, denn da gibt es die Startcondition auch, nur bei SPI nicht. 
Außerdem heißt es Data received, die Startcondition kommt aber vor dem 
Empfangen.

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.