Forum: Mikrocontroller und Digitale Elektronik SW SPI ATTINY 45 / 25(13 etc)


von Murphy S. (student-f)


Lesenswert?

Hallo liebe µC-Gemeinde,

an diesem schönen Sonntag nachmittag findet sich bestimmt jmd. der mir 
helfen kann.

Ich bin gerade an einer SW-SPI am "verzweifeln" und ggf. ist ja ein oder 
mehrere liebe Helferlein gerade im Forum auf der Sonnenterasse aktiv :-) 
Anbei die Codeschnispsel. An meinem Osci sehe ich den SPI SCK Takten, 
aber keine DAten am MOSI ausgeben. Der Mosi taktet 8 mal high und dann 
bleibt der low... Das kann doch nur eine kleine Unachtsamkeit sein.?!? 
Bin gerade blind und finde den Fehler nicht :-(
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
#define TRUE 1
5
#define FALSE 0
6
7
volatile unsigned char sck_toggle = FALSE;
8
9
void init_IOs(void);  // Initialisierung (weitere) IOs
10
void init_Timer_0(void);
11
12
int main(void)
13
{
14
  uint8_t i;
15
  uint8_t val;
16
   uint8_t ausgabe =5;
17
18
  init_IOs();
19
  init_Timer_0();
20
  
21
  sei();
22
  val=0x0A;
23
24
  for(;;)
25
    {
26
27
    for( i = 8; i; i-- ){             
28
         PORTB &= ~(1<<MOSI);       //Immer Null, wenn NIcht high muss      
29
        if(ausgabe & 0x80 )             //MSB first
30
      {
31
        PORTB |= (1<<MOSI);        
32
      }
33
      ausgabe <<= 1;      
34
      if(sck_toggle == TRUE)       //SCK
35
        {
36
        PORTB ^= (1<<SCK);
37
        }
38
      }
39
          
40
    }
41
42
}
43
44
void init_IOs(void)
45
{
46
DDRB = (1<<SS) | (1<<SCK)| (1<<MOSI);  
47
DDRB &= ~( (1<<PB1) | (1<<PB3) ); 
48
}
49
50
ISR (TIMER0_COMPA_vect)
51
{
52
sck_toggle ^= 1;  //Variable für SCK toggeln
53
}
Vielen DAnk im Voraus :-)

PS: Attiny 45-20PU ohne CKDIV/8 Taktet gerade ISR mit 2khZ

von spess53 (Gast)


Lesenswert?

Hi

>ISR (TIMER0_COMPA_vect)
>{
>sck_toggle ^= 1;  //Variable für SCK toggeln
>}

Was soll das?

MfG Spess

von Murphy S. (student-f)


Lesenswert?

Hi Spess,

ich setze damit in der hauptschleife den SCK-PORT und in der ISR 1 oder 
0 zu der globalen Variable. So kann ich später im Hauptprogramm sagen, 
dass der entsprechende PIN zu setzen/löschen ist. Dies habe ich so 
gewählt, damit ich im kompletten Programm wahlweise den PORT für SCK 
toggeln kann oder nicht. Würde ich den Port in der ISR setzen, so müßte 
ich den def. immer disablen..

Nicht so gut und lieber den IRQ dann disablen?

Danke Frank

von Murphy S. (student-f)


Lesenswert?

oder kann es sein, dass die ISR für den Timer doch nicht so richtig ist
und ich hierdurch immer ein ungewünschtes Verhalten bekäme:
1
void init_Timer_0(void)
2
{
3
    TIMSK |= (1<<OCIE0A);
4
    TCNT0 = 0;
5
     TCCR0A =(0<<COM0A1)|(0<<COM0A0)|(0<<COM0B1)|(0<<COM0B0)|(1<<WGM01)|(0<<WGM00);
6
    OCR0A  = 255; //~16khz 
7
    OCR0B  = 0;
8
    TCCR0B = (0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00);  //8mhz

von spess53 (Gast)


Lesenswert?

Hi

Mache es doch, wie alle anderen auch und erzeuge deinen Takt komplett in 
der Ausgabeschleife, ohne Timer. Es gibt keinen Grund das SPI durch 
einen Timer auszubremsen.

MfG Spess

von Murphy S. (student-f)


Angehängte Dateien:

Lesenswert?

Hi,

danke der Antwort.

Aber leider taktet der MOSI auch nur kurz ohne Timer oder mit..

Siehe Anhang:

Viele Grüße

von holger (Gast)


Lesenswert?

>Aber leider taktet der MOSI auch nur kurz ohne Timer oder mit..

Natürlich, ausgabe ist nach dem Schleifendurchlauf 0.

von Murphy S. (student-f)


Lesenswert?

Aaaaah, ihr seid super und ich zu dusselig...

DANKE :-) Es läuft :-)

Peinlich...

Euch noch nen Schönen Tag

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.