Forum: Compiler & IDEs USI Code-Schnipsel ATtiny2313 anpassen für den ATmega168


von Firebird (Gast)


Lesenswert?

Hallo zusammen

Ich habe ein Code-Schnipsel für die USI-Schnittstelle ATtiny2313. Jetzt 
versuche ich den Code für den ATmega168 anzupassen. Das bereitet mir 
Mühe und hoffe ihr könnt mir helfen.

Unten sind die jeweiligen Code-Schnipsel. Ich habe die beiden 
Datenblätter der Mikrocontroller verglichen und soweit möglich versucht 
den Code anzupassen.

Kann man überhaupt die USI-Schnittstelle so ändern, dass es für den 
ATmega168 passt? Oder muss eine andere Lösung her? Die Lücken sind mit 
Fragezeichen versehen.

Code-Schnipsel Attiny2313:
1
ISR(TIMER1_OVF_vect)
2
{
3
  if ((EIFR&(1<<PCIF)) || (!(PCMSK&(1<<PCINT7))))
4
  {
5
    EIFR = (1<<PCIF);        // External Interrupt Flag Register, Clear Pin Change Interrupt Flag
6
    PCMSK |= (1<<PCINT7);    // Pin Change Mask, set Pin Change Interrupt Source
7
  }
8
  else
9
  {
10
    USISR = (1<<USIOIF);      // USI Status Register, Clear Counter Overflow Interrupt Flag
11
    USICR |= (1<<USIOIE);     // USI Control Register, Counter Overflow Interrupt Enable
12
  }
13
}
1
void data_init(void)
2
{
3
  DDRB &= ~((1<<PB5)|(1<<PB7));      // Delete SDA and SCL
4
  USICR = (1<<USICS0)|(1<<USICS1);   // USI Control Register, External Negative Edge Enable
5
}

Code-Schnipsel ATmega168:
1
ISR(TIMER1_OVF_vect)
2
{
3
  if ((PCIFR&(1<<PCIF0)) || (!(PCMSK0&(1<<PCINT7))))
4
  {
5
    PCIFR = (1<<PCIF0);
6
    PCMSK0 |= (1<<PCINT7);
7
  }
8
  else
9
  {
10
    TWSR = (1<<????);
11
    TWCR |= (1<<TWIE);
12
  }
13
}
1
void data_init(void)
2
{
3
  DDRC &= ~((1<<PC4)|(1<<PC5));
4
  TWCR = (1<<????)|(1<<????);
5
}

Danke und Gruss
Firebird

von holger (Gast)


Lesenswert?

>Kann man überhaupt die USI-Schnittstelle so ändern, dass es für den
>ATmega168 passt? Oder muss eine andere Lösung her? Die Lücken sind mit
>Fragezeichen versehen.

Der hat nen echten USART, also lass den Quatsch.

von Firebird (Gast)


Lesenswert?

Die Schnittstelle die ich auslesen möchte besteht aus Ground, Data, 
Clock und Power. Ziel ist, das Datenpaket (ein vielfaches von 8 Bits) 
auszulesen und die Bytes aus dem Data Register sequenziell 
abzuspeichern.

Wäre die SPI als slave geeignet, d.h. mit MOSI und SCK?

Gruss
Firebird

von Helfer (Gast)


Lesenswert?

Firebird schrieb:
> Die Schnittstelle die ich auslesen möchte besteht aus Ground, Data,
> Clock und Power. Ziel ist, das Datenpaket (ein vielfaches von 8 Bits)
> auszulesen und die Bytes aus dem Data Register sequenziell
> abzuspeichern.
>
> Wäre die SPI als slave geeignet, d.h. mit MOSI und SCK?
>
> Gruss
> Firebird

Ja, würd ich so machen.

Achte bei der Initialisierung der PINs des SPI darauf, die DDR richtig 
zu setzen, sonst funzt der SPI ned richtig. MOSI, SCK und /SS müssen 
als Input konfiguriert sein (auch wenn du /SS nicht nutzt).

von Firebird (Gast)


Lesenswert?

@ Helfer

Vielen Dank für den Hinweis. Ich werde versuchen den code zu erarbeiten 
und stelle ihn hier rein zur diskussion. Vermutlich werden viel Fragen 
meinerseits auftauchen.

Gruss
Firebird

von holger (Gast)


Lesenswert?

>MOSI, SCK und /SS müssen
>als Input konfiguriert sein (auch wenn du /SS nicht nutzt).

Output, nicht Input.

von Firebird (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

In der Zwischenzeit habe ich versucht einen Source Code zu schreiben um 
die Datenpakete von einer Schnittstelle auszulesen. Es handelt sich um 
die SUSI Schnittstelle von DCC decoder.

Das ist mein erster Versuch ein Source Code für das Auslesen einer SPI 
Schnittestelle zu erstellen. Ich würde gerne wissen, ob ich die 
Schnittstelle richtig interpretiert habe und ob der Programmablauf in 
der Theorie seinen Zweck erfüllt.

Hier ist die Spezifikation: http://www.d-i-e-t-z.de/susi-spez.htm

Ziel des Programmes ist vorerst, die Datenpakete auszuwerten und 
entsprechende LEDs als Bestätigung für den Empfang der jeweiligen Daten
leuchten zu lassen.
Im Source Code definiert 'SPI_SlaveInit' die Inputs SS, MOSI und SCK 
wobei das LSB zuerst empfangen wird und die Daten bei fallender Flanke 
gültig sein müssen.
Im 'get_Bytes' werden zwei Bytes eingelesen, zuerst die Adresse und dann 
den dazugehörigen Wert.
Die empfangenen Adressen werden in 'susi_decode_addr' gefiltert wobei 
nur zwei Adressen gewünscht sind (von mir definiert). Sollte keine 
gültige Adresse vorliegen, oder wurde die 'susi_decode_data' routine 
durchgeführt wird die Adresse und den Wert zurückgesetzt um den Empfang 
neuer Daten zu initiieren. Die abgespeicherten Daten bleiben gültig bis 
sie überschrieben werden.
Unter 'susi_decode_data' wird gemäss empfange Adresse (addr_Byte) den 
dazugehörenden Wert (data_Byte) abgespeichert. Ist ein Wert empfangen 
worden so leuchtet die jeweilige LED entsprechend.

Wo habe ich Verständnisprobleme?
Als erstes weiss ich nicht ob eine Sychronisation notwendig ist und wenn 
ja, wie ich das realisieren kann.
Im Programm habe ich noch eine Interuptroutine eingebunden, damit der 
Prozessor auch andere Aufgaben erledigen kann. Der Zweck einer ISR habe 
ich verstanden aber noch nicht erkannt wo und wie ich sie in meinem 
Anwendungsfall einbinden muss (Timer und ISR).

Im Anhang findet ihr den Source Code.

Danke und Gruss
Firebird

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.