Forum: Mikrocontroller und Digitale Elektronik SPI mit hc595 in C if abfragen ?


von barku (Gast)


Lesenswert?

hallo,

ich wollte mich mit der SPI erweiterung die im wiki beschrieben ist 
beschäftigen stolpere aber über meine programierfähigkeiten
ich bin mittlerweile der festen überzeugung das ich keine IF abfragen 
behersche kann mir aber auch nichtmehr helfen.
der 595 usw gehen ganz sicher der µc (avr mega8 ) hängt sich auch nicht 
fest.
das mit variable i einmal inzialiseirte muster wird auch brav ausgegeben 
blos nichtmehr verändert.
wenn ich den befehl  SPDR=Sek  in den timer schreibe ändert er das auch 
brav.

ich blicks einfach nichtmehr.

Danke schonaml im vorraus

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/signal.h>
4
5
typedef unsigned char  uchar;
6
typedef unsigned short int usint;
7
8
/*++++++++++++++++++++++++++++++++Verdrahtung++++++++++++++++++++++++++++++++*/
9
// ++++++++++++++++port B
10
#define PortB_DDR  0xff  // alles ausgänge (wird noch überschrieben durch spi config)
11
#define PortB_Init 0x00  // ausgang auf 0 (s.u.) 
12
// ++++++++++++++++port C
13
#define PortC_DDR  0xff // alles auf Ausgang
14
#define PortC_Init 0x00 // alles Low
15
// +++++++++++++++port D
16
#define PortD_DDR  0xc0  // pin 6/7 als ausgang rest eingang
17
#define PortD_Init 0x3f  // eingänge pull up ein,  ausgänge Low
18
19
/*++++++++++++++globale Variablen+++++++++++++++++++++++++++*/
20
21
volatile unsigned char t0count;
22
volatile unsigned char mscount;
23
volatile unsigned char sek;
24
25
struct  {        // Bit-Variablen
26
    uchar Auswerten:1;  // flag für starten der Auswertung
27
    uchar Sek:1;    // flag sekundenumschaltung hat statt gefunden
28
  uchar Entprell:1;  // 100ms flagt nutzung für entprellen
29
  uchar SPIfrei:1;  // bit zur kontrolle für spi übertragung
30
} g ;
31
32
/*+++++++++++++++++++Funktionsprototypen++++++++++++++++++++*/
33
void timer0_init_8bit (void);  // timerintialisirung
34
35
/*++++++++++++++++++++INTERRUPT verarbeitung ++++++++++++++++++*/
36
SIGNAL (SIG_SPI){    // SPI übertragung beendet
37
g.SPIfrei=1;      //
38
PORTB |= (1<<PB2);    // flanke zur datenübernahme erzeugen
39
PORTB &= ~(1<<PB2);
40
}
41
42
SIGNAL (SIG_OVERFLOW0){    // Verarbeitung Überlauf Timer 0 (Uhr)  
43
t0count++;          // überlauf alle 16384 takte
44
if (t0count==25){       // soll 75 um auf 100ms zu kommen  bei 14,..
45
    t0count = 0;
46
  mscount++;
47
  g.Entprell=1;
48
     if (mscount==10){     // soll 10
49
      mscount=0;
50
        sek++;
51
    g.Sek=1;      // flag  sekundenumschaltung hat statt gefunden
52
    } 
53
   }
54
} 
55
56
/********************************Hauptprogramm********************************/
57
int main (void)
58
{   
59
outp (PortB_DDR, DDRB); outp (PortB_Init, PORTB);
60
outp (PortC_DDR, DDRC); outp (PortC_Init, PORTC); 
61
outp (PortD_DDR, DDRD); outp (PortD_Init, PORTD);
62
63
//+++++++++++++++++Variablen++++++++++++++++
64
65
char i=0x68;
66
//+++++++++++++++einmalige Initialisierung
67
68
g.SPIfrei=1;
69
timer0_init_8bit ();
70
SPCR = ((1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)|(1<<CPHA));
71
sei ();  
72
73
/*+++++++++++++++++++++Hauptschleife +++++++++++++++++++++++*/
74
for (;;){         // für immer ;-)
75
76
if (g.Sek)  {
77
  g.Sek=0;
78
  i++;
79
  }
80
  
81
if (g.SPIfrei)  {
82
  g.SPIfrei=0;
83
  SPDR=i;
84
  }
85
86
PORTC ^= (1<<PC1);  // lebt er noch ?
87
88
}}  // main und for (;;) ende
89
90
/*++++++++++++++++++++++++++++++++++Unterfunktionen++++++++++++++++++++++++++*/
91
void timer0_init_8bit (void)
92
{ // intialisieren des timers 0 
93
TIMSK = _BV(TOIE0);          // timer interrupt ein
94
TCNT0 = 0;              // timer nullen 
95
TCCR0 = _BV(CS01) | _BV(CS00);    // starten mit vorteiler 64
96
}

von Jörg X. (Gast)


Lesenswert?

schau mal in Tutorial: Datenaustausch mit ISRs 
(Interrupt-Service-Routinen, irgendjemand fragt sonst bestimmt ;) )
das 'volatile' gilt nämlich auch für structs

ich würde die SPI-Transfers:
a) mit 'nem (Ring-) Puffer lösen
b) bei hohen Taktraten (F_CPU/2, F_CPU/4...) "nur" mit polling
machen

von barku (Gast)


Lesenswert?

DANKE

ich geh in arsch  stundenlanges suchen und selbstzweifel sind gelöst

weshalb wird sowas immer hinzugebastelt ? ich habe den rumpf des progs 
asu einem alten bestehenden entlehnt das auch ganz sicher gefunzt hat 
ach neee
ich geh kaputt

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.