SW SPI ATTINY 45 / 25(13 etc)

OP #2166383
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
OP #2166404
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
OP #2166580
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren