Hallo zusammen,
ich verzweifle schon seit einigen Stunden an meinem ISP via USI am
ATTiny2313... ich gehe bei der Übertragung hierbei prinzipiell so vor:
- ich lade die Daten in das USIDR register
- ich aktiviere den Timer0 und lasse zählen
- bei jedem Timer0 Overflow wird ein Interrupt ausgelöst, in dessen ISR
ich USITC setze um den Takt zu generieren (muss so langsam sein, passt
schon)
- beim USI Overflow wird der Zähler gestoppt, Übertragung vorbei
Ich habe nun durch LEDs an den Ausgängen (extrem langsamer Takt) und
funktionierende SPI-Empfänger folgendes Verhalten nachgewiesen:
- der Timer0 Interrupt kommt genau wie er soll
- synchron hierzu wird das Clock-Signal generiert
- MOSI bleibt jedoch konstant auf 0 :(
Mein ISP Empfänger kommt damit auch klar und zeigt mir als Ergebnis die
empfangene 0x00 an. Scheint halt so, als ob das Schieberegister nicht
vorgeschoben wird.
Vermutlich liegt der Fehler hierdrin, ich verstehe es nämlich nicht ganz
(Referenz Datenblatt Seite 148):
Variante 1:
1 | USICR = (1<<USIWM0) | (1<<USICS1) | (0<<USICS0) | (1<<USICLK);
|
2 |
|
3 | ISR( TIMER0_OVF_vect )
|
4 | {
|
5 | USICR |= 1<<USITC;
|
6 | }
|
So steht's in vielen Quellen, ich erzeuge beim Interrupt über USITC die
Clock selber. Laut Datenblatt wird das Schieberegister jedoch extern
getaktet, wie soll das funktionieren?
Variante 2:
1 | USICR = (1<<USIWM0) | (0<<USICS1) | (1<<USICS0);
|
So fände ich es sinnvoll, laut Datenblatt werden sowohl Schieberegister
als auch der Counter direkt durch den Timer0 Overflow ausgelöst. Wenn
ich das tue, erzeuge ich jedoch keinen Takt am Ausgang und es werden
auch keine Daten geschoben.
Variante 3:
1 | USICR = (1<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (1<<USICLK);
|
2 |
|
3 | ISR( TIMER0_OVF_vect )
|
4 | {
|
5 | USICR |= 1<<USICLK;
|
6 | }
|
Fände ich auch sinnvoll entsprechend Datenblatt (nun mit USICLK manuell
getriggert anstelle USITC), aber generiert ebenfalls weder Takt noch
Daten.
Wie müssen die Bits gesetzt werden, damit der Timer0 Overflow die ganze
Geschichte takten kann?
Und wie funktionieren externe Takte, ist das nicht für den Slave-Betrieb
gedacht?
DANKE!