Forum: Mikrocontroller und Digitale Elektronik Frage zu USI


von Ingo L. (corrtexx)


Lesenswert?

Hallo,

ich habe eine Minianwendung in der ich gern einen AD9833 mit einem 
Tiny84 betreiben möchte. Auf dem Breadboard habe ich alles mit nem 
Mega328 und "echtem" SPI erfolgreich getestet. Nun möchte ich ne 
Leiterplatte mit nem Tiny84 machen und das USI nutzen. Ich sehe im 
Datenblatt aber keine Option die Flankensteuerung (beim Mega CPOL und 
CPHA im SPCR Register) einzustellen? Ich benötige Sampling auf fallender 
Taktflanke.

Kann das USI das überhaupt?

EDIT:
Mit:
1
uint8_t Usi_Data ( uint8_t Data )
2
{
3
  USIDR = Data;
4
  USISR |= (1<<USIOIF);
5
  while(!(USISR & (1<<USIOIF))){
6
      USICR |= (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USICS0) | (1<<USITC);
7
  }// 3-Wire-Mode, External negative Edge, Toggle Clock Pin
8
  return USIDR;
9
}
müsste es eigentlich gehen oder?

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

Sieh dir mal die AppNote

AVR319: Using the USI module for SPI communication

an.

MfG Spess

von Ingo L. (corrtexx)


Lesenswert?

Demnach sollte es ja gehen oder übersehe ich was?

von spess53 (Gast)


Lesenswert?

Hi

>Demnach sollte es ja gehen oder übersehe ich was?

Ich habe mir das nicht genau durchgelesen.

Es gibt ja noch die passende Software dazu

http://www.atmel.com/images/AVR319.zip

MfG spess

von Ingo L. (corrtexx)


Lesenswert?

Habs gerade mal quick&dirty aufm Breadboard zusammengesteckt: Geht, wie 
oben beschrieben. Ob der Clock-Idle-State high oder low ist legt man 
fest indem man den Clock Pin vor Beginn des Datentransvers den Pin per 
Hand auf High oder Low legt.

Clock-Idle-State = High
Sample fallig Edge
1
void Init_SPI ( void )
2
{
3
  // USI IOs
4
  DDRA |= (1<<PA5) | (1<<PA4) | (1<<PA6) | (1<<PA7);
5
  PORTA |= (1<<PA4); // Clock Idle = High
6
}
7
8
static void SPI_Transmit_Byte ( char Data )
9
{
10
  USIDR = Data;
11
  USISR |= (1<<USIOIF);
12
  while(!(USISR & (1<<USIOIF))){ // Sample on fallig edge
13
    USICR |= (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USICS0) | (1<<USITC);
14
  }
15
}

Nicht wundern über die Funktionsbezeichnung, ich habe per #if eine 
Routine für nen Tiny oder AVR

von spess53 (Gast)


Lesenswert?

Hi

>ich habe per #if eine Routine für nen Tiny oder AVR

ATTinys sind auch AVRs. Und ATMegas mit USI gibt es auch.

MfG Spess

von Ingo L. (corrtexx)


Lesenswert?

spess53 schrieb:
> ATTinys sind auch AVRs. Und ATMegas mit USI gibt es auch.
Sollte eigentlich Mega heißen ;). Nen Mega mit USI habe ich noch nicht 
gesehen, aber auch noch nie gesucht.

von spess53 (Gast)


Lesenswert?

Hi

> Nen Mega mit USI habe ich noch nicht gesehen, aber auch noch nie gesucht.

ATmega169/329/649/3290/6490

MfG Spess

von Wilhelm S. (wilhelmdk4tj)


Lesenswert?

Hallo Ingo,

warum nutzt du keine vernünftige Programmiersprache? ;-)
Soll es einfach sein oder nach der reinen Lehre?
Die 'C'-Bären mögen mich zerreissen...
Das Ergebnis zählt!

In BASCOM gibt es die Funktionen SERIN() und SEROUT(); da kannst du das
ganze Gedönse einstellen.
Ich betreibe einen AD9850 und AD9851 seit langer Zeit auf diese Art
und Weise mit einem ATTiny85.
Das wirst du doch wohl mit dem AD9833 auch hin bekommen.
Beim ATTiny84 hast du ja noch viel mehr Pins als du brauchst.
Such mal unter DJ7OO, da gibt es jede Menge Info bzgl. AD... usw.

73
Wilhelm

von Ingo Less (Gast)


Lesenswert?

Hallo Wilhelm,

Ich nutze bereits eine richtige Sprache, aber trotzdem danke.

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.