www.mikrocontroller.net

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


Autor: barku (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

typedef unsigned char  uchar;
typedef unsigned short int usint;

/*++++++++++++++++++++++++++++++++Verdrahtung++++++++++++++++++++++++++++++++*/
// ++++++++++++++++port B
#define PortB_DDR  0xff  // alles ausgänge (wird noch überschrieben durch spi config)
#define PortB_Init 0x00  // ausgang auf 0 (s.u.) 
// ++++++++++++++++port C
#define PortC_DDR  0xff // alles auf Ausgang
#define PortC_Init 0x00 // alles Low
// +++++++++++++++port D
#define PortD_DDR  0xc0  // pin 6/7 als ausgang rest eingang
#define PortD_Init 0x3f  // eingänge pull up ein,  ausgänge Low

/*++++++++++++++globale Variablen+++++++++++++++++++++++++++*/

volatile unsigned char t0count;
volatile unsigned char mscount;
volatile unsigned char sek;

struct  {        // Bit-Variablen
    uchar Auswerten:1;  // flag für starten der Auswertung
    uchar Sek:1;    // flag sekundenumschaltung hat statt gefunden
  uchar Entprell:1;  // 100ms flagt nutzung für entprellen
  uchar SPIfrei:1;  // bit zur kontrolle für spi übertragung
} g ;

/*+++++++++++++++++++Funktionsprototypen++++++++++++++++++++*/
void timer0_init_8bit (void);  // timerintialisirung

/*++++++++++++++++++++INTERRUPT verarbeitung ++++++++++++++++++*/
SIGNAL (SIG_SPI){    // SPI übertragung beendet
g.SPIfrei=1;      //
PORTB |= (1<<PB2);    // flanke zur datenübernahme erzeugen
PORTB &= ~(1<<PB2);
}

SIGNAL (SIG_OVERFLOW0){    // Verarbeitung Überlauf Timer 0 (Uhr)  
t0count++;          // überlauf alle 16384 takte
if (t0count==25){       // soll 75 um auf 100ms zu kommen  bei 14,..
    t0count = 0;
  mscount++;
  g.Entprell=1;
     if (mscount==10){     // soll 10
      mscount=0;
        sek++;
    g.Sek=1;      // flag  sekundenumschaltung hat statt gefunden
    } 
   }
} 

/********************************Hauptprogramm********************************/
int main (void)
{   
outp (PortB_DDR, DDRB); outp (PortB_Init, PORTB);
outp (PortC_DDR, DDRC); outp (PortC_Init, PORTC); 
outp (PortD_DDR, DDRD); outp (PortD_Init, PORTD);

//+++++++++++++++++Variablen++++++++++++++++

char i=0x68;
//+++++++++++++++einmalige Initialisierung

g.SPIfrei=1;
timer0_init_8bit ();
SPCR = ((1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)|(1<<CPHA));
sei ();  

/*+++++++++++++++++++++Hauptschleife +++++++++++++++++++++++*/
for (;;){         // für immer ;-)

if (g.Sek)  {
  g.Sek=0;
  i++;
  }
  
if (g.SPIfrei)  {
  g.SPIfrei=0;
  SPDR=i;
  }

PORTC ^= (1<<PC1);  // lebt er noch ?

}}  // main und for (;;) ende

/*++++++++++++++++++++++++++++++++++Unterfunktionen++++++++++++++++++++++++++*/
void timer0_init_8bit (void)
{ // intialisieren des timers 0 
TIMSK = _BV(TOIE0);          // timer interrupt ein
TCNT0 = 0;              // timer nullen 
TCCR0 = _BV(CS01) | _BV(CS00);    // starten mit vorteiler 64
}

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: barku (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.