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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.